Go-Ethereum

Geth 返回的“合約”雜湊有什麼意義?

  • February 15, 2018

基本問題:

如果我這樣做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

https://medium.com/@codetractio/inside-an-ethereum-transaction-fa94ffca912f

這意味著對於給定的發件人地址,我們可以知道它部署的任何合約的未來地址是什麼,只要它以正確的順序部署它們(即使用正確的隨機數)。這會帶來一些有趣的可能性,例如將乙太幣發送到一個空地址以預先為稍後部署的合約提供資金 - 請注意不要錯過將合約部署到該特定地址的隨機數,否則會有沒有機會取回它-有關更多資訊,請參見此處的“隱藏在視線中”

引用自:https://ethereum.stackexchange.com/questions/38520