Bereitstellen eines Vertrags mit Konstruktorargumenten über Geth RPC

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

Antworten (1)

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:

Geben Sie hier die Bildbeschreibung ein

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:



Antwort auf Kommentar unten

Ich habe zwei weitere Beispiele hinzugefügt, um die Berechnung der Offsets zu demonstrieren.

Beispiel 2

 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 

Beispiel 3

 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 
Danke, das hilft viel, ich habe online gelesen, dass die Argumente irgendwie nach dem Bytecode kommen mussten, aber ich war mir nicht sicher, in welcher Form. Der einzige Teil, den ich nicht verstehe, ist die "0x40", die für den Offset verwendet wird? 64 ist der Offset der ganzen Zahl?
Ich habe zwei weitere Beispiele hinzugefügt, um die Verwendung des Offsets zu demonstrieren.
Sehr umfassende Beispiele, vielen Dank für Ihre Zeit!