Go-Ethereum
Geth 返回的“合約”雜湊有什麼意義?
基本問題:
如果我這樣做
myContract = eth.contract([abi goes here])
,那麼我會做一個:var contract = myContract.new( /* args */, { from: eth.accounts[0], data: compiledContract, gas: 1000000 } )
我收到回:
fullhash=0x830e6922af1008... contract=0xA94C943B7b...
這個
contract
雜湊值實際用於什麼?
有效地創建合約會導致包含發送者地址和隨機數的完整雜湊;然後將該
contract
地址視為0x
該雜湊的最後 20 個字節。這在契約創建時立即知道,因為它僅取決於發送者地址和隨機數,並且一旦成功探勘交易將包含在區塊鏈中。通過省略 to 欄位,將創建一個契約。但是合約的地址是如何確定的呢?以本次交易為例
console.log(web3.eth.getTransactionReceipt('0x77a4f46ff7bf8c084c34293fd654c60e107df42c5bcd2666f75c0b47a9352be5').contractAddress); //0x950041c1599529a9f64cf2be59ffb86072f00111
合約地址是發送者地址的最後 160 位散列,其 nonce 可以預先確定。對於此交易,可以通過以下方式找到發送者和隨機數
var contractTx = web3.eth.getTransaction('0x77a4f46ff7bf8c084c34293fd654c60e107df42c5bcd2666f75c0b47a9352be5'); console.log(contractTx.from); //0x84f9d8b0e74a7060e20b025c1ea63c2b171bae6f console.log(contractTx.nonce); //0
因此合約地址為
console.log('0x' + util.bufferToHex(util.rlphash(['0x84f9d8b0e74a7060e20b025c1ea63c2b171bae6f', 0])).slice(26)); //0x950041c1599529a9f64cf2be59ffb86072f00111
這意味著對於給定的發件人地址,我們可以知道它部署的任何合約的未來地址是什麼,只要它以正確的順序部署它們(即使用正確的隨機數)。這會帶來一些有趣的可能性,例如將乙太幣發送到一個空地址以預先為稍後部署的合約提供資金 - 請注意不要錯過將合約部署到該特定地址的隨機數,否則會有沒有機會取回它-有關更多資訊,請參見此處的“隱藏在視線中”