Solidity
我如何使另一份契約的價值保持不變?
有3份契約;
A
,B
, 和C
.C
有一個帶有預設值的狀態變數。A
將該狀態變數更改為Yerevan
. 之後,B
看到那個變數。評估A
成功但B
再次看到預設值。似乎B
無法呼叫更新的智能合約。如何通過其他智能合約永久更改狀態變數?有沒有相關的工作?請指導初學者。謝謝你。C:
pragma solidity ^0.5.12; contract C{ bytes public name; function rep(bytes memory pseudonym) public returns(string memory){ name=pseudonym; return string(name); } }
A:
pragma solidity ^0.5.12; import "./C.sol"; contract A{ bytes public fname="Yerevan"; function naming() public returns(string memory){ return C(0x8fcECc5B8d42EcF099E1cF032B1F505fbDA230A3).rep(fname); } }
乙:
pragma solidity ^0.5.12; import "./C.sol"; contract B{ function rep() public returns(string memory){ return string(C(0x8fcECc5B8d42EcF099E1cF032B1F505fbDA230A3).name()); } }
請注意,在 Truffle 控制台中,您應該嘗試
naming()
如下:A_instance.naming.sendTransaction()
或者
A_instance.naming()
這會將事務發送到網路,從而執行您所需的程式碼。這個過程改變了分類帳和契約的狀態。
.call()
相反,使用.sendTransaction()
只會在兩個合約之間進行互動,而不會改變它們的狀態。它會導致它們之前的狀態不會發生變化,並且您看不到新值。
有些情況你可能沒注意:
- 您正在執行
naming()
fromA
by.call()
not by.sendTransaction()
。顯然,它永遠不會改變狀態。我確實猜到了,truffle-contract
因此在您問題的標籤列表中。- 也許,你在插入和呼叫
C
時的真實地址時犯了一個錯誤。我的意思是: . 那可以是另一個部署的地址。A``B``C(0x8fcECc5B8d42EcF099E1cF032B1F505fbDA230A3).rep(...)``C
- 同樣的案例@Rob Hitchens 回答了。