Go-Ethereum

是什麼導致 .deployed() 在每個測試中返回相同的合約實例

  • April 9, 2020

我花了一段時間來診斷問題。起初我只是注意到我的合約狀態在執行時受到先前測試的影響,truffle test然後我查看了我正在為我的專用網路執行 geth 的終端選項卡。我查看了交易和合約部署,並註意到每次另一個測試文件開始執行時,我的所有合約都會按預期再次部署。然後我意識到,即使在這之後,來自測試的所有交易都在與第一次測試中部署的第一個合約進行互動。.deployed() 在第二次到最後一次測試中返回的所有合約實例都指的是最初在第一次測試中部署的合約。下面是我在執行 geth 節點的選項卡中看到的更簡化版本。

//executing test/first.js
Submitted contract creation fullhash=0xTransactionHash0 contract=0xContractAddress0
Submitted contract creation fullhash=0xTransactionHash1 contract=0xContractAddress1
Submitted transaction fullhash=0xTransactionHash2 recipient=0xContractAddress1
//executing test/second.js
Submitted contract creation fullhash=0xTransactionHash3 contract=0xContractAddress2
Submitted contract creation fullhash=0xTransactionHash4 contract=0xContractAddress3
Submitted transaction fullhash=0xTransactionHash5 recipient=0xContractAddress1

geth version=> 1.9.12-穩定

truffle version=> Truffle v5.1.20 (core: 5.1.20) Solidity v0.5.16 (solc-js) Node v8.10.0 Web3.js v1.2.1

這是我的 startnode.sh 文件

geth --networkid 122349 --mine --minerthreads 2 --datadir "." --nodiscover --rpc --rpcport "8545" --port "30303" --rpccorsdomain "*" --nat "any" --rpcapi eth,web3,personal,net,debug --unlock 0 --password ./password.sec --ipcpath "~/.ethereum/geth.ipc" --allow-insecure-unlock --targetgaslimit '9000000'

當我使用 ganache-cli 時我沒有這個問題,這似乎是 geth 特有的。如果你們中的任何人對這個錯誤的原因有任何想法,或者對我如何解決這個問題有任何建議,我真的很感激他們。謝謝你們!

您好,在發布此問題後不久,我發現這可以通過使用 .new() 而不是 .deployed() 來解決,使用 .new() 可確保合約將再次部署並將實例返回到新地址

是什麼導致.deployed()在每個測試中返回相同的合約實例?

每次執行測試時創建一個全新的區塊鏈都會產生這種行為。


在執行 truffle 測試時,我的合約狀態受到先前測試的影響。

我使用 ganache-cli 時沒有這個問題;這似乎是geth特有的。

預設情況下:

  • Ganache 每次啟動時都會初始化一個新的區塊鏈(除非您指定--db標誌)
  • Geth 繼續在現有區塊鏈上執行(除非您事先將其刪除)

這解釋了您的觀察(以及您正在處理的問題)。

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