Grundfrage:
Wenn ich das tue myContract = eth.contract([abi goes here])
, dann bekomme ich Folgendes:
var contract = myContract.new(
/* args */,
{
from: eth.accounts[0],
data: compiledContract,
gas: 1000000
}
)
Ich bekomme zurück:
fullhash=0x830e6922af1008...
contract=0xA94C943B7b...
Wofür wird dieser contract
Hashwert eigentlich verwendet?
Tatsächlich führt die Erstellung eines Vertrags zu einem vollständigen Hash, der die Absenderadresse und Nonce enthält; die contract
Adresse wird dann genommen, 0x
gefolgt von den letzten 20 Bytes dieses Hashs. Dies ist sofort bei Vertragserstellung bekannt, da es nur von der Absenderadresse und Nonce abhängt, und wird in die Blockchain aufgenommen, sobald die Transaktion erfolgreich abgebaut wurde.
durch Weglassen des bis-Felds wird ein Vertrag erstellt. Doch wie wird die Vertragsadresse ermittelt? Nehmen Sie zum Beispiel diese Transaktion
console.log(web3.eth.getTransactionReceipt('0x77a4f46ff7bf8c084c34293fd654c60e107df42c5bcd2666f75c0b47a9352be5').contractAddress); //0x950041c1599529a9f64cf2be59ffb86072f00111
Die Vertragsadresse ist der letzte 160-Bit-Hash der Absenderadresse und seine Nonce kann vorher bestimmt werden. Für diese Transaktion können Absender und Nonce gefunden werden
var contractTx = web3.eth.getTransaction('0x77a4f46ff7bf8c084c34293fd654c60e107df42c5bcd2666f75c0b47a9352be5'); console.log(contractTx.from); //0x84f9d8b0e74a7060e20b025c1ea63c2b171bae6f console.log(contractTx.nonce); //0
Also die Vertragsadresse ist
console.log('0x' + util.bufferToHex(util.rlphash(['0x84f9d8b0e74a7060e20b025c1ea63c2b171bae6f', 0])).slice(26)); //0x950041c1599529a9f64cf2be59ffb86072f00111
Das bedeutet, dass wir für eine bestimmte Absenderadresse wissen können, was die zukünftigen Adressen für alle von ihr bereitgestellten Verträge sein werden, solange sie sie in der richtigen Reihenfolge (d. h. mit der richtigen Nonce) bereitstellen. Es gibt einige interessante Möglichkeiten, die dies ermöglicht, wie z. B. das Senden von Ether an eine leere Adresse, um einen Vertrag vorzufinanzieren, der später bereitgestellt wird – achten Sie nur darauf, nicht die Gelegenheit zu verpassen, den Vertrag an diese bestimmte Adresse zu senden, oder es würde eine geben keine Chance, es zurückzubekommen - siehe "Verstecken vor aller Augen" hier für weitere Informationen
Das ist im Grunde eine Vertragsadresse, die verwendet wird, wenn Sie mit dem bereitgestellten Vertrag interagieren möchten. Um mit dem bereits bereitgestellten Vertrag zu interagieren, benötigen Sie dessen ABI und Adresse.
Derselbe Vertrag kann mehrmals bereitgestellt werden und kann daher dieselbe ABI haben, aber die Vertragsadresse ist jedes Mal anders. Die Vertragsadresse ist also ein eindeutiges Eigentum des Vertrags.
Die Vertragsadresse wird zum Zeitpunkt der Vertragsübergabe an das Netzwerk generiert. Die Vertragserstellung ist auch eine Transaktion, daher generiert eth einen Transaktionshash. In Ethereum ist Vertrag ein unüberschaubares Konto.
Der Algorithmus zur Generierung von Ethereum-Vertragsadressen lautet:
Ersteller (Sender) und wie viele Transaktionen der Ersteller gesendet hat (Nonce). Der Absender und die Nonce werden RLP-codiert und dann mit Keccak-256 gehasht.
Weitere Einzelheiten finden Sie unter dem folgenden Link: http://martin.swende.se/blog/Ethereum_quirks_and_vulns.html
Wenn Sie einen Vertrag in Geth bereitgestellt haben, erstellt eth ein Vertragsobjekt. Wenn Sie auf den bereitgestellten Vertrag zugreifen möchten, benötigen Sie eine Identität. Hier ist die Vertragsidentität die Vertragsadresse. Und vollständiger Hash ist Transaktionshash. ABI ist eine JSON-Datei zum einfachen Laden von Methoden, die der bereitgestellte Vertrag enthält. Verwenden Sie also web3js oder einen anderen Client, um diese Methoden aufzurufen. bin sind aktuelle Vertragsanweisungen oder Opcodes.
Prashant Prabhakar Singh
successfully deployed
. Ich denke die müssen gleich sein.