Wie erhalte ich die Adresse des bereitgestellten Vertrags über JSON RPC?

Wenn ich den Hash einer Transaktion kenne, die den Vertrag erstellt hat, wie erhalte ich die Adresse des erstellten Vertrags?

Zum Beispiel:

curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_getTransactionByHash","params":["0x622b3d3b880666e2447458c09e87f50a2f45f72d87d8bcb0e5924ccb73d92e59"],"id":1}' http://10.10.10.10:8545 | python -m json.tool
{
    "id": 1,
    "jsonrpc": "2.0",
    "result": {
        "blockHash": "0x0375c57448e43a56e3c0e8e5bbeb744bda0cf6cde246e521d0dc9271fb17ce22",
        "blockNumber": "0x40342b",
        "from": "0xd534d9f6e61780b824afaa68032a7ec11720ca12",
        "gas": "0x4c4b40",
        "gasPrice": "0xee6b2800",
        "hash": "0x622b3d3b880666e2447458c09e87f50a2f45f72d87d8bcb0e5924ccb73d92e59",
        "input": "0x6060604052341561000f57600080fd5b6040516040806111498339810160405280805191
...
000000000000000000010db6b405c4cff3185926f5bda140703a77c5",
        "nonce": "0x0",
        "r": "0xea3abf44bb80534553042f11d0465be54a2f3f5910c861c154a397f677549161",
        "s": "0x5bf893f90270dd9aa0092ce15b13c7a8ea9c541c13190e9ed874f7d3841ce0d1",
        "to": null,
        "transactionIndex": "0xd",
        "v": "0x26",
        "value": "0x0"
    }
}

Von Etherscan weiß ich, dass die Adresse lautet 0xb5fe93ccfec708145d6278b0c71ce60aa75ef925, aber wie bekomme ich diese Adresse über JSON RPC?

Antworten (2)

Sie können eth_getTransactionReceipt verwenden , der zurückgegebene json hat ein Feld namens contractAddress, das die Adresse des erstellten Vertrags enthält.

Das Beispiel aus dem Wiki

Anfrage:

curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238"],"id": 1}'

Ergebnis:

{
"id":1,
"jsonrpc":"2.0",
"result": {
     transactionHash: '0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238',
     transactionIndex:  '0x1', // 1
     blockNumber: '0xb', // 11
     blockHash: '0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b',
     cumulativeGasUsed: '0x33bc', // 13244
     gasUsed: '0x4dc', // 1244
     contractAddress: '0xb60e8dd61c5d32be8058bb8eb970870f07233155' // or null, if none was created
     logs: [{
         // logs as returned by getFilterLogs, etc.
     }, ...],
     status: '0x1'
  }
}

Dies funktioniert nicht, wenn der Vertrag indirekt durch einen anderen Vertrag erstellt wird, dh wenn Sie beispielsweise das Fabrikmuster verwenden.

Ich glaube nicht, dass es eine Möglichkeit gibt, die JSON-RPC-API dazu zu bringen, Ihnen die Adresse mitzuteilen, aber die Adresse eines Vertrags wird programmgesteuert aus der Adresse des Transaktionssenders und der Nonce bestimmt. Der Transaktions-Hash gibt Ihnen diese beiden Informationen. Sie müssen sie RLP-codieren und dann die letzten 20 Bytes des Keccak-256-Hashes nehmen. Pseudocode:

keccak256(rlp(address, nonce))[-20:]

Code mit pyethereum:

>>> ethereum.utils.mk_contract_address(0xd534d9f6e61780b824afaa68032a7ec11720ca12, 0).hex()
'b5fe93ccfec708145d6278b0c71ce60aa75ef925'

Etwas expliziter:

>>>  binascii.hexlify(ethereum.utils.sha3(ethereum.utils.rlp.encode([0xd534d9f6e61780b824afaa68032a7ec11720ca12, 0]))[-20:])
b'b5fe93ccfec708145d6278b0c71ce60aa75ef925'

Code mit nur pysha3und ein bisschen manueller RLP-Codierung:

>>> binascii.hexlify(sha3.keccak_256(binascii.unhexlify(b'd6' + b'94' + b'd534d9f6e61780b824afaa68032a7ec11720ca12' + b'80')).digest()[-20:])
b'b5fe93ccfec708145d6278b0c71ce60aa75ef925'

Erläuterung:

  • d6= 0xc0+ 20(Länge der Adresse) + 1(Länge der codierten Nonce)
  • 80= 0x80+ 0(Länge der Nonce) — Für eine Nonce von 1 würden Sie 01stattdessen (die Codierung eines einzelnen Bytes mit dem Wert 1) verwenden.

Siehe auch: Wie wird die Adresse eines Ethereum-Kontrakts berechnet?