Solidity

合約讀取另一個合約返回的字元串

  • February 3, 2022

我有 2 個契約,Parents其中Child有一個公共字元串變數 - name

contract Child {
   string public name;
   function child (string _name){
      name = _name;
   }
}

Parents需要獲得該名稱:

contract Parents {
   string public childName;
   Child child;
   function Parents(address _childAddress){
       child = Child(_childAddress);
       childName = child.name();  // I also tried child.name
   }
}

但我收到以下錯誤:

Error: Type tuple() is not implicitly convertible to expected type string storage ref.
       childName = child.name();

所以我試圖創建另一個函式Child,它將返回一個字元串:

function getName() returns (string name) {
   return name;
}

Parents我已經改變了

childName = child.name();  into--->  childName = child.getName();

但我不斷收到同樣的錯誤。有任何想法嗎?一如既往,感謝您的幫助。

一個合約返回的可變大小數據不能被另一個合約讀取。

Parents正在嘗試讀取 astringChild因此出現錯誤。

參考:

EVM 無法從外部函式呼叫中讀取可變大小的數據…請注意,另一方面,可以返回可變大小的數據,只是無法從 EVM 中讀取。

EIP 5是對 EVM的提議更新它允許合約讀取其他合約返回的動態大小的數據。

這是一個可以編譯的版本。

由於address類型更容易轉換為string類型,因此我將原始地址儲存為address類型,並添加了一個函式以在需要時轉換addressstring

contract Child {
   address public addr;

   function child (address _addr) {
       addr = _addr;
   }    

   function getAddress() returns (address) {
       return addr;
   }

   function toBytes(address x) returns (bytes b) {
       b = new bytes(20);
       for (uint i = 0; i < 20; i++) {
           b[i] = byte(uint8(uint(x) / (2**(8*(19 - i)))));
       }
   }

   function getName() returns (string) {
       return string(toBytes(addr));
   }
}

contract Parents {
   address public childAddr;
   Child child;

   function Parents(address _childAddress) {
       child = Child(_childAddress);
       childAddr = child.getAddress();
   }
}

我已將所有地址儲存為address類型。

我添加了toBytes(...)address類型轉換為類型的函式bytes(來自如何將地址轉換為 Solidity 中的字節?)。

您可以bytes通過string使用string(...).

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