Ich weiß, dass ich in der Transaktionsquittung die Vertragsadresse erhalten kann, indem ich eine Transaktionsquittung von einer generierten Transaktion erhalte.
Aber ich frage mich, da intelligente Vertragsadressen in gewissem Sinne deterministisch sind, ob es eine Möglichkeit gibt, die Adresse aus der Transaktion selbst vorherzusagen, nicht aus der Quittung.
Ok, ich habe die Antwort tatsächlich selbst gefunden, leider sind die Dinge in der Dokumentation zumindest bisher nicht aktualisiert, aber creates
in jeder Transaktion gibt es ein Feld.
Wenn Sie also beispielsweise getBlock
alle Blöcke ausführen und erhalten , transactions
können Sie zuerst feststellen, ob es sich um eine Vertragserstellungstransaktion handelt, indem Sie prüfen, ob Null ist, was in der Dokumentation und als Adresse to
erwähnt wird .creates
@Nulik hat die Antwort, die am klarsten ist.
Die einzige Einschränkung ist der eigentliche Befehleth.getTransactionReceipt(hash).contractAddress
Wenn Sie verwenden Web3
, verwenden Sie web3.eth.getTransactionReceipt(hash).contractAddress
.
getTransactionReceipt
also ist es überhaupt nicht die richtige Antwort: "Ich weiß, dass ich im Transaktionsbeleg die Vertragsadresse erhalten kann, indem ich einen Transaktionsbeleg von einer generierten Transaktion erhalte." Lesen Sie die Frage beim nächsten Mal genau durchTrustFund
, deren Herausforderung genau dies ist. Aber siehe slack-files.com/T0J0350JF-FK5NTH41J-d83c8daf88 für ein Beispiel, wie man diese Informationen in Etherscan sehen kann.Sie können die Vertragsadresse tatsächlich erhalten, bevor eine Transaktion generiert wird. Die Adresse eines Vertrags wird durch die Adresse und Nonce des Vertragserstellers bestimmt.
Aus dem Quellcode :
func CreateAddress(b common.Address, nonce uint64) common.Address {
data, _ := rlp.EncodeToBytes([]interface{}{b, nonce})
return common.BytesToAddress(Keccak256(data)[12:])
}
medwedew1088
Nulik
Moe Elsharif