Private-Blockchain
Solidity:如何獲取私鏈頭塊的雜湊值?
我正在嘗試獲取乙太坊私有鏈中頭塊的雜湊值。我在我的智能合約中使用以下方法:
blockNumber = block.number; blockHashNow = block.blockhash(blockNumber);
但是,價值
blockHashNow
總是這樣:
0x0000000000000000000000000000000000000000000000000000000000000000
此外,在私有鏈中,似乎塊的數量不斷增加,但我沒有向它發送任何交易。
問題一:私鏈中如何獲取雜湊值頭/目前區塊?
問題2:為什麼私鏈中的區塊數量不斷增加,即使沒有交易發送到鏈上?
編輯:我在這裡找到了第一個問題的答案:
簡而言之,我應該這樣做:
blockHashNow = block.blockhash(blockNumber-1); // -1 has been added now
問題 2:為什麼私鏈中的區塊數量不斷增加,即使沒有交易發送到鏈上?
如果您仔細查看區塊鏈的工作原理,這對於確保區塊鏈數據的完整性非常重要。通常,區塊鏈協議以保持塊速率恆定的方式工作,以便難以創建另一個更長的鏈。在乙太坊中,幾乎每 14 秒就會生成一個塊,而困難在於將平均塊率保持在該速率。你可以參考這個答案。
因此,無論是否有交易,礦工都會繼續探勘區塊,這就是為公共網路定義協議的方式,並且由於您在私有鏈(預設 geth 客戶端)中使用相同的協議,因此在您的私有鏈中也是相同的. @StevenJaxon 連結的程式碼可用於更改您的私有鏈,但無論如何它不會模擬公共鏈用於測試目的,這無關緊要,它也會節省您的計算能力。
問題一:私鏈中如何獲取雜湊值頭/目前區塊?
如果您在此處和此處參考 web3 API 參考,這非常簡單,
web3.eth.blockNumber // return current block number web3.eth.getBlock(blockHashOrBlockNumber [, returnTransactionObjects] [, callback]) // returns a block given the hash or number //combine both currentBlock = web3.eth.blockNumber; web3.eth.getBlock(currentBlock, function(block){ //do whatever with the block details });
如果您想在智能合約中執行此操作,則只能獲取上一個塊號,並且可以使用以下程式碼,請參閱此問題。
contract Test { uint public blockNumber; bytes32 public blockHashNow; bytes32 public blockHashPrevious; function setValues() { blockNumber = block.number; blockHashNow = block.blockhash(blockNumber); blockHashPrevious = block.blockhash(blockNumber - 1); } }