Solidity

我如何使另一份契約的價值保持不變?

  • May 18, 2021

有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()只會在兩個合約之間進行互動,而不會改變它們的狀態。它會導致它們之前的狀態不會發生變化,並且您看不到新值。

有些情況你可能沒注意:

  1. 您正在執行naming()from Aby .call()not by .sendTransaction()。顯然,它永遠不會改變狀態。我確實猜到了,truffle-contract因此在您問題的標籤列表中。
  2. 也許,你在插入和呼叫C時的真實地址時犯了一個錯誤。我的意思是: . 那可以是另一個部署的地址。A``B``C(0x8fcECc5B8d42EcF099E1cF032B1F505fbDA230A3).rep(...)``C
  3. 同樣的案例@Rob Hitchens 回答了。

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