Bitcoin Miner mit AutoIt programmieren. Möglich?

  • Hallo,

    habe mir vorgenommen einen Bitcoin Miner mit Hilfe von AutoIt zu programmieren. Also ein Script, womit man hash Codes ausrechnen kann, mithilfe der CPU oder GPU. Ist so etwas überhaupt mit Autoit möglich ?

    Habe im Internet nicht viel gefunden. Es werden einige Bitcoin Miner im Internet angeboten, aber manche sind mit Viren verseucht oder arbeiten nicht so, wie ich es mir wünschen würde. :thumbdown:

    Vielleicht kann mir einer Hilfestellung geben und mich auf den richtigen Weg bringen :thumbup:

    peace

  • Kann man wohl in jeder Sprache programmieren, wenn man denn kann bzw. Lust hat sich damit auseinanderzusetzen.

    Da es sich hier aber um sehr zeitintensive Berechnungen handelt kannst du Autoit mehr oder weniger vergessen (es wird lediglich ein "virtueller" core ausgelastet, der ScriptCode wird außerdem zur Laufzeit interpretiert, kein Maschinencode). Wenn du das unbedingt mit Autoit machen willst bleibt dir nur die Möglichkeit mit multiplen Scriptinstanzen zur besseren Auslastung zu arbeiten oder aber du informierst dich näher darüber wie man Berechnungen auf die Grafikkarte auslagert, was prinzipiell auch mit Autoit gehen sollte (siehe Forensuche "OpenCL" --> https://autoit.de/index.php?page…enCL#post319367 ). Aber dafür benötigst du dann letztlich ohnehin auch Wissen über andere Sprachen, kannst es also auch gleich in C oder anderen performanteren Hochsprachen programmieren.

    Realistischer und einfacher ist es wohl lediglich eine Autoit GUI zu schreiben und bereits fertige / compilierte Miner (exe / dll) darüber anzusteuern. Da ich Bitcoin Mining für Zeit- und Stromverschwendung halte hab ich mich aber nie damit auseinandergesetzt was es da alles an Miningtools / Bibliotheken gibt. Prinzipiell sollten auf der offiziellen Projektpage genügend Code Beispiele / Dokumentationen zum Mining zu finden sein.

  • Hi,

    Zitat

    Also ein Script, womit man hash Codes ausrechnen kann, mithilfe der CPU oder GPU. Ist so etwas überhaupt mit Autoit möglich ?

    Ja, das ist mit AutoIt möglich.
    Wie schon angesprochen, bietet sich dafür OpenCL an.
    Das Grundgerüst für die Berechnung mit OpenCL ist gerade in AutoIt sehr einfach gehalten, alles was du brauchst ist der entsprechende OpenCL-Kernel. Dieser ist in einer C-ähnlichen Sprache erstellt und wird vor der Laufzeit vom Treiber compiliert. z.B. den hier

    Spoiler anzeigen

    oder den

    Spoiler anzeigen


    Die Leistungsfähigkeit beim Bitcoin-Mining ist abhängig von der vorhandenen (Grafik)-Hardware, auf CPU´s gewinnt man keinen Blumenpott...

    Den Kernel hast du nun, das ist eigentlich nichts weiter als eine Funktion, die du nur noch mit den entsprechenden Parametern füttern musst...


    Zitat

    Aber dafür benötigst du dann letztlich ohnehin auch Wissen über andere Sprachen, kannst es also auch gleich in C oder anderen performanteren Hochsprachen programmieren.

    genau das ist der Witz, dass man KEINE "performante" Hochsprache programmieren muss!
    Da es keine Programmteile gibt, die nur annähernd Performancerelevant sind, ist die Verwendung der "Sprache" ehrlich gesagt völlig egal. Ob man den Kernel in C/C++ einbindet oder in eine beliebige andere Programmiersprache, ändert an der Ausführungsgeschwindigkeit des Kernels auf der entsprechenden Hardware.....NICHTS!

    Die Frage lautet eher, ob sich Bitcoin-Mining in Deutschland überhaupt lohnt, da die Berechnung aufgrund der Energiekosten höher ist als das Ergebnis!
    Was uns aber nicht abhalten sollte, einen Miner in AutoIt zu schreiben^^

    //EDIT mit Phoenix 2.0 und einer ATI Radeon HD6750 schaffe ich 95 MHashes pro Sekunde
    mit den 2 Cores des AthlonII X2 250 schaffe ich immerhin 4,5 MHashes/Sekunde !!!

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    2 Mal editiert, zuletzt von Andy (20. Mai 2013 um 11:40)

  • Zu den Grafikkarten: Natürlich verbrauchen Leistungsfähigere Grafikkarten mehr Strom, allerdings gibts da auch einen Trick. Die Core-Anzahl der GPU Chips kann man natürlich nicht erhöhen, aber man kann schon eine ganze Ecke an Geschwindigkeit mit OC rausholen ohne den Stromverbrauch signifikant zu erhöhen. Getestet habe ich das mit der 5450, einer 20€ GraKa, die nach der Modifikation (passiv gekühlt) schon in der Liga der 150€ Karten rechnet. Aus 600MHz wurden 1GHz. Dabei ist der Stromverbrauch um ca. 2 Watt gestiegen: http://www.techpowerup.com/gpuz/egxm2/

    Damit lässt sich schon deutlich besser minen. Aus schon viel Leistungsfähigeren Karten lässt sich sicher noch viel mehr rausholen. Auch hat es keinen Sinn sich fürs Minen eine Titan für 1k€ zu kaufen, stattdessen lieber eine bessere Multicorekarte wie die 7990. Die hat dann nämlich zweimal so viel Kerne und kann in einem Rutsch doppelt so viel erledigen, für den selben Preis. ^^

  • Die Frage lautet eher, ob sich Bitcoin-Mining in Deutschland überhaupt lohnt, da die Berechnung aufgrund der Energiekosten höher ist als das Ergebnis!

    Naja, bei einem momentanen Wert von ca. 90€ pro Bitcoin und 25 Bitcoins pro Block könnte sich das durchaus lohnen.


    Was uns aber nicht abhalten sollte, einen Miner in AutoIt zu schreiben^^

    Ganz genau. :thumbup:

    Bei einem kleinen Testskript (ohne OpenCL; nur AutoIt + Crypt) komme ich auf ca. 3200 Hashes pro Sekunde. Kombiniert mit der aktuellen Wahrscheinlichkeit würde es also nur ca. 475000 Jahre dauern, bis ich damit einen Block gelöst hätte. :D

  • Wieso will/macht man sowas? Und wie kommt ihr auf Sachen wie 90€ pro Bitcoin und 25 Bitcoins pro Block 8| ?!

    Kann mich einer vll. kurz in wenigen Sätzen aufklären? Kann grad garnet nachvollziehen wieso hier von Sachen wie "da die Berechnung aufgrund der Energiekosten höher ist als das Ergebnis!" gesprochen wird ^^

    Ich habe Bitcoin bisher nur in Verbindung mit Banken gehört, dass also "Hacker" sich Informationen erschleichen und die sind verschlüsselt und durch das auflösen eines Hashs kann man dann quasi Daten erlangen mit denen man Unfug betreiben könnte.

    Grüße Yaerox

    Grüne Hölle

  • Nicht böse gemeint, aber wenn du nichts über Bitcoin weißt solltest du dich erstmal selbst schlau darüber machen. Ein guter Anfang wäre z.B. der deutschsprachige Wikipedia Artikel: http://de.wikipedia.org/wiki/Bitcoin

    Und ja Bitcoin war in letzter Zeit aufgrund diverser virtueller "Raubüberfälle", Steuerhinterziehung usw. öfter mal in den Medien. Was wohl auch daran liegt, dass es sich um eine recht anonyme Online Währung handelt die von vielen Amateuren verwaltet wird. Ein ideales Milieu für Kriminelle.

  • Bitcoin ist eine neuartige virtuelle Währung, die dezentral durch ein Computernetz geschöpft und verwaltet wird und für internationale elektronische Überweisungen geeignet ist. Das Bitcoin-Netzwerk wird aus den Teilnehmern gebildet, die einen Bitcoin-Client ausführen. Der Besitz von Geldeinheiten kann durch den Besitz von kryptographischen Schlüsseln nachgewiesen werden. Jede Transaktion von Geldeinheiten zwischen Teilnehmern des Netzwerks wird in einer öffentlichen, vom gesamten Netzwerk unterstützten Datenbank aufgezeichnet und mit digitalen Signaturen versehen.

    Das "Finden" von Bitcoins funktioniert nach dem Proof-of-work System, d.h., dass es durch aufwendige Berechnungen zwar schwer ist einen Block zu finden, aber leicht, dessen Gültigkeit nachzuweisen. Da diese Berechnungen natürlich Zeit in Anspruch nehmen, entstehen dabei Stromkosten. Anhand dieser muss man entscheiden, ob sich der Aufwand überhaupt lohnt, d.h. ob man Gewinn erzielen könnte.

    Ein solcher Block ist eigentlich einfach nur eine Möglichkeit um gültige Transaktionen zu speichern und diese Information durch das Netzwerk zu bewegen.

    Den Wert, welcher momentan bei ca. 90€ pro Bitcoin liegt, habe ich aus dem Wechselkurs abgelesen, zum Beispiel auf bitcoin.de.
    Wie viele Bitcoins pro Block etwa erstellt werden, findet man unter anderem hier.

    Edit: Natürlich gibt es "Hacker" und Menschen, die mit Bitcoins Waffen und ähnliches kaufen, aber das hat doch nicht direkt etwas mit Bitcoin zu tun. Das war ja schließlich (wahrscheinlich) nicht der Grundgedanke hinter diesem System.

  • misterspeed: Joa das ist korrekt, nur weil dazu bei dem Wikipedia-Eintrag steht, dass die Informationen nicht unbedingt der Wahrheit entsprechen müssen, und es möglicherweise zwei verschiedene Thematiken zu diesen Thema geben könnte wollte ich hier mal direkt fragen ^^

    Grüße Yaerox

    Grüne Hölle

  • Hi,

    Zitat

    Bei einem kleinen Testskript (ohne OpenCL; nur AutoIt + Crypt) komme ich auf ca. 3200 Hashes pro Sekunde.

    cool, immer her damit! 8o
    Woher holst du dir deine Blöcke ab bzw wie stimmst du dich mit den anderen Nodes ab?

    Zitat

    Kombiniert mit der aktuellen Wahrscheinlichkeit würde es also nur ca. 475000 Jahre dauern, bis ich damit einen Block gelöst hätte.

    Dafür haben wir ja den "Turbo" in Form von div. OpenCL-Kernels, die wir nur noch "füttern" müssen :thumbup:
    Ggf. würde sich ein sogar ein "AutoIt-Pool" lohnen, die geminten Bitcoins könnte man an AutoIt.de spenden.
    Mitmachen könnte jeder, der sich den Client auf den Rechner lädt und "nebenbei" bissl minen möchte. Und nicht zuletzt ein schönes Community-Projekt, da sich auch jeder an der Programmierung beteiligen könnte!

  • Hi,

    cool, immer her damit! 8o
    Woher holst du dir deine Blöcke ab bzw wie stimmst du dich mit den anderen Nodes ab?


    Scheint, als hätte ich mich etwas zu ungenau ausgedrückt:
    Das Testskript ist lediglich dazu da die Geschwindigkeit von SHA256 in AutoIt zu testen.
    Einen Bitcoin Client / Miner habe ich leider noch nicht. :D

    [autoit]

    #include <Crypt.au3>

    [/autoit][autoit][/autoit][autoit]

    Global Const $CALG_SHA_256 = 0x0000800C ; schön, dass dieser Wert nicht in der UDF steht

    [/autoit][autoit][/autoit][autoit]

    _Crypt_Startup()

    [/autoit][autoit][/autoit][autoit]

    Local $test = "AutoIt", $n = 0, $timer

    [/autoit][autoit][/autoit][autoit]

    $timer = TimerInit()
    Do
    $test = _Crypt_HashData($test, $CALG_SHA_256)
    $n += 1
    Until (TimerDiff($timer) >= 1000)
    ConsoleWrite($n & @CRLF)

    [/autoit][autoit][/autoit][autoit]

    _Crypt_Shutdown()

    [/autoit]

    Ggf. würde sich ein sogar ein "AutoIt-Pool" lohnen, die geminten Bitcoins könnte man an AutoIt.de spenden.
    Mitmachen könnte jeder, der sich den Client auf den Rechner lädt und "nebenbei" bissl minen möchte. Und nicht zuletzt ein schönes Community-Projekt, da sich auch jeder an der Programmierung beteiligen könnte!

    Sehr gute Idee. :thumbup:

    AutoIt Version (Prod): 3.3.14.2

    AutoIt Version (Beta): 3.3.9.5

    ausgewählte Skripte: Chatbot, komplexe Zahlen (UDF)

    Einmal editiert, zuletzt von James1337 (21. Mai 2013 um 23:55) aus folgendem Grund: n = 0

  • Mit n = 1 schummelst du dir aber einen dazu ^^ . Gibt es im engl. Forum nicht einen ASM Code für diesen Hash?

    James Wenn die Hashberechnung nur Integer einbezieht, wäre das doch mal eine Aufgabe für Perseus ^^

  • Mit n = 1 schummelst du dir aber einen dazu ^^ .

    Schande über mich. Aber bei Schwankungen im dreistelligen Bereich sollte das nicht allzu viel ausmachen. :D

    Gibt es im engl. Forum nicht einen ASM Code für diesen Hash?

    Meinst du diesen Thread?

    Wenn die Hashberechnung nur Integer einbezieht, wäre das doch mal eine Aufgabe für Perseus ^^

    Laut Wikipedia ist dem so. Eigentlich eine gute Idee. :thumbup:

  • Zitat

    sowieso mit der WinAPI rechnet, wird das wohl kaum schneller sein.

    *hust*
    *husthust*
    *räusper* *husthust*

    [und das von einem, der es sooooo viel besser weiss....]

  • Habs ausprobiert, macht bei mir kaum Unterschied. Maximal ca. 20 ms. Das macht schon bei Massen an Hashes etwas aus, aber die Zeit ist fürs Minen immer noch viel zu groß. Klar könnte man hier mit multiplen Instanzen + Multithreading was machen, aber trotzdem wirds noch kein Blumentopf :P

    Spoiler anzeigen
    [autoit]

    ; -----------------------------------------------------------------------------
    ; SHA224/256 Hash Machine Code UDF
    ; Purpose: Provide The Machine Code Version of SHA224/256 Hash Algorithm In AutoIt
    ; Author: Ward
    ; -----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    #Include-once
    #Include <Memory.au3>
    #include <Crypt.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $_SHA224_256_CodeBuffer, $_SHA224_256_CodeBufferMemory
    Global $_SHA224_InitOffset, $_SHA224_InputOffset, $_SHA224_ResultOffset
    Global $_SHA256_InitOffset, $_SHA256_InputOffset, $_SHA256_ResultOffset

    [/autoit] [autoit][/autoit] [autoit]

    Global $_HASH_SHA224[4] = [28, 104, '_SHA224_', '_SHA224_256_']
    Global $_HASH_SHA256[4] = [32, 104, '_SHA256_', '_SHA224_256_']

    [/autoit] [autoit][/autoit] [autoit]

    $Timer = TimerInit()
    For $i = 1 To 1000
    _SHA256("AutoIt")
    Next
    ConsoleWrite("!> ASM: " & timerdiff($Timer) & @lf)

    [/autoit] [autoit][/autoit] [autoit]

    _Crypt_Startup()
    $Timer = TimerInit()
    For $i = 1 To 1000
    _Crypt_HashData("AutoIt", 0x0000800C)
    Next
    ConsoleWrite("!> WinAPI: " & timerdiff($Timer) & @lf)
    _Crypt_Shutdown()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _SHA224_256_Exit()
    $_SHA224_256_CodeBuffer = 0
    _MemVirtualFree($_SHA224_256_CodeBufferMemory, 0, $MEM_RELEASE)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _SHA224_256_Startup()
    If Not IsDllStruct($_SHA224_256_CodeBuffer) Then
    If @AutoItX64 Then
    Local $Code = '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'
    $Code &= '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'
    $Code &= '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'
    $Code &= '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'
    $Code &= 'WEh3QMEtKrn0cM8OF/s9phD0ENMSD4hQDxhKMokfGQCDxHhbXl8cXUFctwiO3lnDIuylcgQxKPpIZTATy+loITiMv4DTTP5k3YxyH1BezDGUQWBWsR4UzdP/qRSkJCF/AvmD4D/32XhPg8fXQwEJAB74OEKIDAMPKIbWHoDeuECgR41r7ki6ovwpGMAx0rzf6CjFA1xn6hbZsZfV/8T2wxgBujhRD4V5As8MQO7H+RQGGASB3EBK0THAtYE89sIE6MnzMkirKrItHJhRlROD4kABhIoCo0Ng4xUo1gStNw/IvNU4MmUyIEWF5HQoIUHxZQGUSgaMpQRfSJAlAQNAD8qJFCEAA70EoDnIdXnulHK/S1rGCpML/FRgUgZ/iqJBWMOR1jgUEcvU0N+D6PICGyTpfM6RxgeREHQeZsdqkVGDzAiehGJiJevkiBMVlAS8hYRECBXXwYPqBEEY6RJDQwMDSI17AbI38fD+TUmRPgJ0cenTI+yYy0nB/lSeCsx/UOXHn8ShCihNhcCxA3FgdF/h5j9ClXlhD74ifgXrDUkBANVgSIX/dGRGFN2Bw/Upy6Lrgu77dkFN/fe0xsKKSdgodqPNigFBACkgnhaoy4P+GUB1yCz6ngbhQTD26PHTo+5GCXW6JAco20hP5SRBaNdWjQjOU2QiVxMgSQIKf3Z+ZDSSIih1R48MZkAx7UD5zD7iyOnfRCQzGpyrpqwrGgz4P3fkRENowDrBN152QWfFMlQHD4Mm4wFeYCPfIArDvdFCKcWGsugyZ++Q63kTIbOiPbDxJmAxoy5oC1DpyNRRI5uu7MKLx42Vj8JAbiRnH+YJaqwhPJ6FrpS7rDwU4BkIcvNuYDwRDDr1T0SlEAh/Ug5RgRSMaAWbEBir2TGDH+JRQGJjMAgjHBnNIOBbfFCEbhATkIgYukgphcNTC67RK1sJGRL9BoMwZzAgCP/ofvyqlEOeB0swW+lfyqF2CNieBcFAB9V8NoUCF91wMBA5WSEO9wIxC8D/EBEVIVhoAqeP+WQ2CKRP+r5/kAeE3ft8VpLmZM8G1oCowfzzCqRfXsMQRNAyqmMIAAA='
    Else
    Local $Code = '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'
    $Code &= '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'
    $Code &= '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'
    $Code &= 'ZxAcPDi2/iXjJ/rX2/5ZUGoqUchQkRSIEFFQDT8lKwBPrDcIAsdSjIpZgS48iZFceHyNSDVmm/w3GBQ5iVRskM4q9Qy3izcohPmqDRMNAetP1Vjpw1vbaXRCT3DWzANMtTFXAznvWhPL81xYjrfIUUwSNJOwvLzYskw5MxMsJnM8SGC0Hvr/N76QHyuljSjSlVgqT0sblO2pXN5hpXHJlB62EgHZEzyWc0eqF+g8Md2qDCq4cCCsb9OTvamKEhCUZejX1tS2/GVDrifrZrOCrgX4/algjVSj4/L71g7pW5aUKB9qN58ArDvrbFCkVoujdiWJzwIwIcuGCwHm8Sg6mijmOCn3AY6k5Uny+7OWJQGIwzHXc5gWIfPIKRScLBDTMx9ZDHTVnCxJcBiWLET781lBouSNvAYd96P5vjimN+lvJKGgn8tTEfRLglkKoglYAfowny8/lxKu+TFFm1I3Bl+dMxDVlUEWAdiItouZX6SeFt2Nugy+IUj3QU9lvihFGJZPa1BEnrxF3UUM6wNJCQwAICvyeHFExjSaVU1EPC0MRGOCqCiuI75Sq4wcQwzPCVjSxuUIlghFxUmPDJF6BjWmScV13hSQESuJMvuhEGqKwoCRshwkyAKpMfstk2wnIBam4EtgUl8yn12EspzuNhAsFXgBO8dypNf0F/h14ZMbYDcd9x7nV21D83Y3lUtl+0WETnDyARoLgcSEgH1bXl9dw1UoV79KWFa2KFOZJIPsiANAYNP/QG/m+Uz3iwPRg+A/CcuIeO49wAGD+DgPhrEYWbpACynCPI17Slj3tAjH3q53Jwncz4x1AxH69Ni+w7w/37wouP+D9sMBujgMPw+Fwg33KscCDESmiQDRMcDB6QL2wubzZKskgUWD4gHEd4t7ZDrDo9K4c2APB6T3A8HmO4ZxEabx9cnR0NHIScvwQzjAxUs86MnXwb6F7XQWPdlsljaD7TuBxRSGUq45h4rw4sQsm+RG/LFCruQgjI1DQJfKIoNqxgeHUYRmx9qthjATiQ/rc3K8KevoExDqYyzpSlglWmBoewGyN/oxyRtVBbpXgh1WRj0ATIXJi1BgdHk4jUDmfj+rWDx5hesirfxZGycwLHL9NISRNQABSGARWGQEhf90R76MU9YSOf52HfwoL/j3mhZaBBJLhsN3eghS0K871O1zJfjygwz6QHWoFzygLejCUdaJQTDrl0LxTE7VgpGTzDNySEFAdtn+/lJ/5lHCO9lI66FCYCTddU5E4oc9/5LFQENS6in4y+/J6HOtnw9Ef0c/d+qARsCJwqPOrlmY9WQT6i5YYQFyoLt6ZJFhQr9AIInaKcem6h75AfuH/ujjOSQ8ovtmMCrKbATCRBJG67xx+vHQYDwa6btRBqwgr7DJGEJAxwZn5jMJag5gcKX99ASFGK5nuw4IchDzbjwCDDr1T6UAEH9SDkBRFAiMaAWbARir2YMfABwZzTLgW3BkEwPAIMNTMckmrhhGklz8I51k90QIZAPq6AX9euzYNVQYWyvrgIBg2J4FwYcCB9V8NiAX3XAwiDlZIg73CDELwP+CERVYaCCnj/lkiKRPI/q++QcLEYX8oVZXKRNMt5LlCiFG5C/8KIP59GYn2AFl/AIspEk2z0EFZqWDYTB4kmcK86sPPofhA3Ok63QWDF9ew1d3EIgwD2K21AxpwwJmA60IdEIDCgqqSQpCdfalP/yEciBAql/DwAA='
    EndIf
    Local $Opcode = String(_SHA224_256_CodeDecompress($Code))
    $_SHA224_InitOffset = (StringInStr($Opcode, "89DB") - 3) / 2
    $_SHA224_InputOffset = (StringInStr($Opcode, "87DB") - 3) / 2
    $_SHA224_ResultOffset = (StringInStr($Opcode, "09DB") - 3) / 2
    $_SHA256_InitOffset = (StringInStr($Opcode, "89C9") - 3) / 2
    $_SHA256_InputOffset = (StringInStr($Opcode, "87C9") - 3) / 2
    $_SHA256_ResultOffset = (StringInStr($Opcode, "09C9") - 3) / 2
    $Opcode = Binary($Opcode)

    [/autoit] [autoit][/autoit] [autoit]

    $_SHA224_256_CodeBufferMemory = _MemVirtualAlloc(0, BinaryLen($Opcode), $MEM_COMMIT, $PAGE_EXECUTE_READWRITE)
    $_SHA224_256_CodeBuffer = DllStructCreate("byte[" & BinaryLen($Opcode) & "]", $_SHA224_256_CodeBufferMemory)
    DllStructSetData($_SHA224_256_CodeBuffer, 1, $Opcode)
    OnAutoItExitRegister("_SHA224_256_Exit")
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _SHA224Init()
    If Not IsDllStruct($_SHA224_256_CodeBuffer) Then _SHA224_256_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    Local $Context = DllStructCreate("byte[" & $_HASH_SHA224[1] & "]")
    DllCall("user32.dll", "none", "CallWindowProc", "ptr", DllStructGetPtr($_SHA224_256_CodeBuffer) + $_SHA224_InitOffset, _
    "ptr", DllStructGetPtr($Context), _
    "int", 0, _
    "int", 0, _
    "int", 0)

    [/autoit] [autoit][/autoit] [autoit]

    Return $Context
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _SHA256Init()
    If Not IsDllStruct($_SHA224_256_CodeBuffer) Then _SHA224_256_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    Local $Context = DllStructCreate("byte[" & $_HASH_SHA256[1] & "]")
    DllCall("user32.dll", "none", "CallWindowProc", "ptr", DllStructGetPtr($_SHA224_256_CodeBuffer) + $_SHA256_InitOffset, _
    "ptr", DllStructGetPtr($Context), _
    "int", 0, _
    "int", 0, _
    "int", 0)

    [/autoit] [autoit][/autoit] [autoit]

    Return $Context
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _SHA224Input(ByRef $Context, $Data)
    If Not IsDllStruct($_SHA224_256_CodeBuffer) Then _SHA224_256_Startup()
    If Not IsDllStruct($Context) Then Return SetError(1, 0, 0)

    [/autoit] [autoit][/autoit] [autoit]

    $Data = Binary($Data)
    Local $InputLen = BinaryLen($Data)
    Local $Input = DllStructCreate("byte[" & $InputLen & "]")
    DllStructSetData($Input, 1, $Data)
    DllCall("user32.dll", "none", "CallWindowProc", "ptr", DllStructGetPtr($_SHA224_256_CodeBuffer) + $_SHA224_InputOffset, _
    "ptr", DllStructGetPtr($Context), _
    "ptr", DllStructGetPtr($Input), _
    "uint", $InputLen, _
    "int", 0)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _SHA256Input(ByRef $Context, $Data)
    If Not IsDllStruct($_SHA224_256_CodeBuffer) Then _SHA224_256_Startup()
    If Not IsDllStruct($Context) Then Return SetError(1, 0, 0)

    [/autoit] [autoit][/autoit] [autoit]

    $Data = Binary($Data)
    Local $InputLen = BinaryLen($Data)
    Local $Input = DllStructCreate("byte[" & $InputLen & "]")
    DllStructSetData($Input, 1, $Data)
    DllCall("user32.dll", "none", "CallWindowProc", "ptr", DllStructGetPtr($_SHA224_256_CodeBuffer) + $_SHA256_InputOffset, _
    "ptr", DllStructGetPtr($Context), _
    "ptr", DllStructGetPtr($Input), _
    "uint", $InputLen, _
    "int", 0)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _SHA224Result(ByRef $Context)
    If Not IsDllStruct($_SHA224_256_CodeBuffer) Then _SHA224_256_Startup()
    If Not IsDllStruct($Context) Then Return SetError(1, 0, "")

    [/autoit] [autoit][/autoit] [autoit]

    Local $Digest = DllStructCreate("byte[" & $_HASH_SHA224[0] & "]")
    DllCall("user32.dll", "none", "CallWindowProc", "ptr", DllStructGetPtr($_SHA224_256_CodeBuffer) + $_SHA224_ResultOffset, _
    "ptr", DllStructGetPtr($Context), _
    "ptr", DllStructGetPtr($Digest), _
    "int", 0, _
    "int", 0)
    Return DllStructGetData($Digest, 1)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _SHA256Result(ByRef $Context)
    If Not IsDllStruct($_SHA224_256_CodeBuffer) Then _SHA224_256_Startup()
    If Not IsDllStruct($Context) Then Return SetError(1, 0, "")

    [/autoit] [autoit][/autoit] [autoit]

    Local $Digest = DllStructCreate("byte[" & $_HASH_SHA256[0] & "]")
    DllCall("user32.dll", "none", "CallWindowProc", "ptr", DllStructGetPtr($_SHA224_256_CodeBuffer) + $_SHA256_ResultOffset, _
    "ptr", DllStructGetPtr($Context), _
    "ptr", DllStructGetPtr($Digest), _
    "int", 0, _
    "int", 0)
    Return DllStructGetData($Digest, 1)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _SHA224($Data)
    Local $Context = _SHA224Init()
    _SHA224Input($Context, $Data)
    Return _SHA224Result($Context)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _SHA256($Data)
    Local $Context = _SHA256Init()
    _SHA256Input($Context, $Data)
    Return _SHA256Result($Context)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _SHA224_256_CodeDecompress($Code)
    If @AutoItX64 Then
    Local $Opcode = '0x89C04150535657524889CE4889D7FCB28031DBA4B302E87500000073F631C9E86C000000731D31C0E8630000007324B302FFC1B010E85600000010C073F77544AAEBD3E85600000029D97510E84B000000EB2CACD1E8745711C9EB1D91FFC8C1E008ACE8340000003D007D0000730A80FC05730783F87F7704FFC1FFC141904489C0B301564889FE4829C6F3A45EEB8600D275078A1648FFC610D2C331C9FFC1E8EBFFFFFF11C9E8E4FFFFFF72F2C35A4829D7975F5E5B4158C389D24883EC08C70100000000C64104004883C408C389F64156415541544D89CC555756534C89C34883EC20410FB64104418800418B3183FE010F84AB00000073434863D24D89C54889CE488D3C114839FE0F84A50100000FB62E4883C601E8C601000083ED2B4080FD5077E2480FBEED0FB6042884C00FBED078D3C1E20241885500EB7383FE020F841C01000031C083FE03740F4883C4205B5E5F5D415C415D415EC34863D24D89C54889CE488D3C114839FE0F84CA0000000FB62E4883C601E86401000083ED2B4080FD5077E2480FBEED0FB6042884C078D683E03F410845004983C501E964FFFFFF4863D24D89C54889CE488D3C114839FE0F84E00000000FB62E4883C601E81D01000083ED2B4080FD5077E2480FBEED0FB6042884C00FBED078D389D04D8D7501C1E20483E03041885501C1F804410845004839FE747B0FB62E4883C601E8DD00000083ED2B4080FD5077E6480FBEED0FB6042884C00FBED078D789D0C1E2064D8D6E0183E03C41885601C1F8024108064839FE0F8536FFFFFF41C7042403000000410FB6450041884424044489E84883C42029D85B5E5F5D415C415D415EC34863D24889CE4D89C6488D3C114839FE758541C7042402000000410FB60641884424044489F04883C42029D85B5E5F5D415C415D415EC341C7042401000000410FB6450041884424044489E829D8E998FEFFFF41C7042400000000410FB6450041884424044489E829D8E97CFEFFFF56574889CF4889D64C89C1FCF3A45F5EC3E8500000003EFFFFFF3F3435363738393A3B3C3DFFFFFFFEFFFFFF000102030405060708090A0B0C0D0E0F10111213141516171819FFFFFFFFFFFF1A1B1C1D1E1F202122232425262728292A2B2C2D2E2F3031323358C3'
    Else
    Local $Opcode = '0x89C0608B7424248B7C2428FCB28031DBA4B302E86D00000073F631C9E864000000731C31C0E85B0000007323B30241B010E84F00000010C073F7753FAAEBD4E84D00000029D97510E842000000EB28ACD1E8744D11C9EB1C9148C1E008ACE82C0000003D007D0000730A80FC05730683F87F770241419589E8B3015689FE29C6F3A45EEB8E00D275058A164610D2C331C941E8EEFFFFFF11C9E8E7FFFFFF72F2C32B7C2428897C241C61C389D28B442404C70000000000C6400400C2100089F65557565383EC1C8B6C243C8B5424388B5C24308B7424340FB6450488028B550083FA010F84A1000000733F8B5424388D34338954240C39F30F848B0100000FB63B83C301E8CD0100008D57D580FA5077E50FBED20FB6041084C00FBED078D78B44240CC1E2028810EB6B83FA020F841201000031C083FA03740A83C41C5B5E5F5DC210008B4C24388D3433894C240C39F30F84CD0000000FB63B83C301E8740100008D57D580FA5077E50FBED20FB6041084C078DA8B54240C83E03F080283C2018954240CE96CFFFFFF8B4424388D34338944240C39F30F84D00000000FB63B83C301E82E0100008D57D580FA5077E50FBED20FB6141084D20FBEC278D78B4C240C89C283E230C1FA04C1E004081189CF83C70188410139F374750FB60383C3018844240CE8EC0000000FB654240C83EA2B80FA5077E00FBED20FB6141084D20FBEC278D289C283E23CC1FA02C1E006081739F38D57018954240C8847010F8533FFFFFFC74500030000008B4C240C0FB60188450489C82B44243883C41C5B5E5F5DC210008D34338B7C243839F3758BC74500020000000FB60788450489F82B44243883C41C5B5E5F5DC210008B54240CC74500010000000FB60288450489D02B442438E9B1FEFFFFC7450000000000EB9956578B7C240C8B7424108B4C241485C9742FFC83F9087227F7C7010000007402A449F7C702000000740566A583E90289CAC1E902F3A589D183E103F3A4EB02F3A45F5EC3E8500000003EFFFFFF3F3435363738393A3B3C3DFFFFFFFEFFFFFF000102030405060708090A0B0C0D0E0F10111213141516171819FFFFFFFFFFFF1A1B1C1D1E1F202122232425262728292A2B2C2D2E2F3031323358C3'
    EndIf
    Local $AP_Decompress = (StringInStr($Opcode, "89C0") - 3) / 2
    Local $B64D_Init = (StringInStr($Opcode, "89D2") - 3) / 2
    Local $B64D_DecodeData = (StringInStr($Opcode, "89F6") - 3) / 2
    $Opcode = Binary($Opcode)

    [/autoit] [autoit][/autoit] [autoit]

    Local $CodeBufferMemory = _MemVirtualAlloc(0, BinaryLen($Opcode), $MEM_COMMIT, $PAGE_EXECUTE_READWRITE)
    Local $CodeBuffer = DllStructCreate("byte[" & BinaryLen($Opcode) & "]", $CodeBufferMemory)
    DllStructSetData($CodeBuffer, 1, $Opcode)

    [/autoit] [autoit][/autoit] [autoit]

    Local $B64D_State = DllStructCreate("byte[16]")
    Local $Length = StringLen($Code)
    Local $Output = DllStructCreate("byte[" & $Length & "]")

    [/autoit] [autoit][/autoit] [autoit]

    DllCall("user32.dll", "none", "CallWindowProc", "ptr", DllStructGetPtr($CodeBuffer) + $B64D_Init, _
    "ptr", DllStructGetPtr($B64D_State), _
    "int", 0, _
    "int", 0, _
    "int", 0)

    [/autoit] [autoit][/autoit] [autoit]

    DllCall("user32.dll", "int", "CallWindowProc", "ptr", DllStructGetPtr($CodeBuffer) + $B64D_DecodeData, _
    "str", $Code, _
    "uint", $Length, _
    "ptr", DllStructGetPtr($Output), _
    "ptr", DllStructGetPtr($B64D_State))

    [/autoit] [autoit][/autoit] [autoit]

    Local $ResultLen = DllStructGetData(DllStructCreate("uint", DllStructGetPtr($Output)), 1)
    Local $Result = DllStructCreate("byte[" & ($ResultLen + 16) & "]")

    [/autoit] [autoit][/autoit] [autoit]

    Local $Ret = DllCall("user32.dll", "uint", "CallWindowProc", "ptr", DllStructGetPtr($CodeBuffer) + $AP_Decompress, _
    "ptr", DllStructGetPtr($Output) + 4, _
    "ptr", DllStructGetPtr($Result), _
    "int", 0, _
    "int", 0)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _MemVirtualFree($CodeBufferMemory, 0, $MEM_RELEASE)
    Return BinaryMid(DllStructGetData($Result, 1), 1, $Ret[0])
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von minx (22. Mai 2013 um 08:41)

  • Ahja hier gibt es btw eine GUI Lösung in Autoit für zwei gängige (nehm ich jedenfalls an...) cmdline Miner. Hab den Quellcode nur kurz überflogen, wer das ernsthaft nutzen will sollte sich aber selbst intensiv in den Quellcode einarbeiten, um mögliche versteckte "Schweinereien" auszuschließen. Die vorkompilierte Variante würde ich jedenfalls nicht einfach so nutzen: https://bitcointalk.org/?topic=10264.0

  • Das ist schlampiger aber halbwegs funktionierender Code nur um Phoenix zu wrappen. Schade, denn die Überschrift lässt ja die AutoIt eigene Nutzung von OpenCL vermuten. Eigentlich müsste es eher "AutoIt Phoenix GUI" heißen. Naja, wers braucht...

  • minx

    Zitat

    Eigentlich müsste es eher "AutoIt Phoenix GUI" heißen. Naja, wers braucht...

    Kein Mensch braucht das, auch mit dem Hintergrund, dass Phoenix mittlerweile in Version 2.0 vorliegt und nicht mehr per Parameter in einer Batchdatei, sondern per *.INI angesprochen wird

    Zitat

    ...SHA256...WinAPI... Habs ausprobiert, macht bei mir kaum Unterschied. Maximal ca. 20 ms.....aber die Zeit ist fürs Minen immer noch viel zu groß.

    Ja, der Code könnte von 1876 sein, da hat einer mit dem Schalter -8086/8088 compiliert....
    Sicherlich könnte man noch Faktor 2-3 rausholen, aber dann wäre man immer noch Faktor 10-20 langsamer als eine Billig-Grafikkarte!
    Und die CL-Kernel sind ja schon vorhanden!