Gibt es eine Möglichkeit, die Vertragserstellungsadresse aus einer Transaktion zu erfahren?

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.

Antworten (3)

Ok, ich habe die Antwort tatsächlich selbst gefunden, leider sind die Dinge in der Dokumentation zumindest bisher nicht aktualisiert, aber createsin jeder Transaktion gibt es ein Feld.

Wenn Sie also beispielsweise getBlockalle Blöcke ausführen und erhalten , transactionskö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 toerwähnt wird .creates

Können Sie einen Verweis auf die Dokumentation oder das JSON-Beispiel hinterlassen.
Vertragsadresse ist in der Quittung der Transaktion enthalten: eth.getTransactionReceipt(hash).ContractAddress
@Nulik deine Antwort ist nicht richtig. Ich will es nicht vom Transaktionsbeleg

@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.

( Info zur Verwendung von Web3 in Python )

Der springende Punkt ist, die Adresse ohne zu erhalten, getTransactionReceiptalso 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 durch
@MoeElsharif Entschuldigung ... Sie haben Recht. Wenn Sie die Adresse des Transaktionserstellers und die nächste verwendete Nonce kennen (muss nicht zufällig sein), können Sie die nächste Vertragsadresse vorhersagen. Unter diesem Link – blockchain-ctf.securityinnovation.com/# – gibt es eine CTF TrustFund, 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.
@MoeElsharif Übrigens, ich denke, was mich verwirrt hat, war Ihre beste Antwort auf Ihre Frage, die Ihre Frage auch nicht zu beantworten scheint. In Ihrer Frage fragen Sie "[gibt es] eine Möglichkeit, die Adresse aus der Transaktion selbst vorherzusagen" (dh Adressen vorherzusagen). Dann erklären Sie in Ihrer Antwort, wie Sie die Vertragsadresse eines bereits bestehenden Vertrags über die getBlocks-Funktion finden können ... Vielleicht haben Sie (sowohl vorher als auch jetzt) ​​vergessen, was Ihre Frage wirklich war.

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:])
}