Wie kann ich mit geth rpc einen kompilierten Vertrag mit Konstruktorargumenten bereitstellen?
Ich habe getestet, dass mein Aufruf den kompilierten Vertragsbytecode bereitgestellt hat. Ich verstehe nur nicht, wie ich Konstruktorargumente über einen RPC-Aufruf in der folgenden Form übergeben kann:
{'jsonrpc': '2.0', 'method': 'eth_sendTransaction', 'params': [{'from': account, 'contract': contract}], 'id': 1}
Vielen Dank
Es ist ziemlich kompliziert, dies richtig zu machen, aber hier sind einige Informationen, wie man es herausarbeitet.
Ich verwende einen einfachen Vertrag als Beispiel:
pragma solidity ^0.4.2; contract Test { uint256 public v1; string public v2; function Test(uint256 _v1, string _v2) { v1 = _v1; v2 = _v2; } }
Hier ist meine Bereitstellung in einer --dev
Blockchain mithilfe von Browser Solidity:
Hier ist der Bytecode aus der Browser-Solidität:
Vor dem Bereitstellen des Vertrags in der --dev
Blockchain habe ich den Befehl debug.verbosity(4)
in der geth
der geth
Konsole ausgeführt. Wenn Browser Solidity den Vertrag geth
, werden die folgenden Informationen in geth
angezeigt:
I1222 14: 09: 50.670663 core / tx_pool.go: 542] Heraufstufen einer Transaktion in der Warteschlange:
TX (92a1308637d6ad0a63b181194701114780afdaacfcd73604a1f7f3b6985b9755)
Vertrag: falsch
Von: 000d1009bd8f0b1301cc5edc28ed1222a3ce671e
An: [Vertragserstellung]
Nonce: 457
GasPreis: 20000000000
GasLimit 198696
Wert: 0
Daten: 000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
V: 0x1c
R: 0xe84786ff0c0ed7564a972d3e037ef74d9adada759f845f36246e818f987d2945
S: 0x38ce5aa5b1a283f3270acd4668e99d410cd7f65ac74f4ae72416b0068935bd51
Verhexen:
Durch das Senden des obigen Teils Data:
als Parameter data:
in Ihrer JSON-RPC-Transaktion eth_sendTransaction wird dieselbe Aktion zum Bereitstellen des Vertrags in der Blockchain mit denselben Konstruktorargumenten ausgeführt.
Sie können sehen, dass der erste Teil des Felds Data:
(nicht fett gedruckt) mit dem Vertragsbytecode übereinstimmt, und der zweite Teil des Felds Data:
(fett gedruckt) die Konstruktorargumente darstellt.
Die Konstruktorargumente sind:
// _v1: 0x7b = 123 000000000000000000000000000000000000000000000000000000000000007b // 0x40 = 64. This is the offset from the beginning of _v1 // directly above to the start of the next set of hex strings // ending below 0000000000000000000000000000000000000000000000000000000000000040 // 0xd = 13 - the length of the "Hello, World!" string 000000000000000000000000000000000000000000000000000000000000000d // In geth, // > web3.toUtf8("48656c6c6f2c20576f726c642100000000000000000000000000000000000000") // "Hello, World!" 48656c6c6f2c20576f726c642100000000000000000000000000000000000000
Weitere Referenzen:
ethabi
Tools Ich habe zwei weitere Beispiele hinzugefügt, um die Berechnung der Offsets zu demonstrieren.
pragma solidity ^0.4.2; contract Test { uint256 public v1; uint256 public v2; string public v3; function Test(uint256 _v1, uint256 _v2, string _v3) { v1 = _v1; v2 = _v2; v3 = _v3; } }
Bereitgestellter Vertrag oben mit den folgenden Parametern:
123,456,"thequickbrownfoxjumpsoverthelazydog"
Hier sind die Daten zum Bereitstellen des Vertrags mit dem Konstruktor mit den fettgedruckten Parametern:
000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000001c800000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000023746865717569636b62726f776e666f786a756d70736f7665727468656c617a79646f670000000000000000000000000000000000000000000000000000000000
// _v1: 0x7b = 123 000000000000000000000000000000000000000000000000000000000000007b // _v2: 0x1c8 = 456 00000000000000000000000000000000000000000000000000000000000001c8 // 0x60 = 96. This is the offset from the start of _v1 to the // start of v3. 32 x 3 = 96 0000000000000000000000000000000000000000000000000000000000000060 // _v3: 0x23 = 35 0000000000000000000000000000000000000000000000000000000000000023 // In geth: // > web3.toUtf8("746865717569636b62726f776e666f786a756d70736f7665727468656c617a79646f67") // "thequickbrownfoxjumpsoverthelazydog" (35 chars) 746865717569636b62726f776e666f786a756d70736f7665727468656c617a79 646f670000000000000000000000000000000000000000000000000000000000
pragma solidity ^0.4.2; contract Test { uint256 public v1; uint256 public v2; string public v3; string public v4; function Test(uint256 _v1, uint256 _v2, string _v3, string _v4) { v1 = _v1; v2 = _v2; v3 = _v3; v4 = _v4; } }
Bereitgestellter Vertrag oben mit den folgenden Parametern:
123,456,"thequickbrownfoxjumpsoverthelazydog","shesellsseashellsontheseashore"
Hier sind die Daten zum Bereitstellen des Vertrags mit dem Konstruktor mit den fettgedruckten Parametern:
000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000001c8000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000023746865717569636b62726f776e666f786a756d70736f7665727468656c617a79646f670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e73686573656c6c737365617368656c6c736f6e74686573656173686f72650000
Und hier ist die Dekodierung der Parameter:
// _v1: 0x7b = 123 000000000000000000000000000000000000000000000000000000000000007b // _v2: 0x1c8 = 456 00000000000000000000000000000000000000000000000000000000000001c8 // 0x80 = 128. This is the offset from the start of _v1 to the // start of v3. 32 + 32 + 32 + 32 = 128 0000000000000000000000000000000000000000000000000000000000000080 // 0xe0 = 224. This is the offset from the start of _v1 to the // start of v4. 32 x 7 = 224 00000000000000000000000000000000000000000000000000000000000000e0 // _v3: 0x23 = 35 0000000000000000000000000000000000000000000000000000000000000023 // In geth: // > web3.toUtf8("746865717569636b62726f776e666f786a756d70736f7665727468656c617a79646f67") // "thequickbrownfoxjumpsoverthelazydog" (35 chars) 746865717569636b62726f776e666f786a756d70736f7665727468656c617a79 646f670000000000000000000000000000000000000000000000000000000000 // v4: 0x1e = 30 000000000000000000000000000000000000000000000000000000000000001e // In geth: // > web3.toUtf8("73686573656c6c737365617368656c6c736f6e74686573656173686f72650000") // "shesellsseashellsontheseashore" (30 chars) 73686573656c6c737365617368656c6c736f6e74686573656173686f72650000
Samuel Barnes
Die offizielle BokkyPooBah
Samuel Barnes