Solidity

兩個合約之間的 Solidity 介面

  • July 28, 2022

我正在嘗試連接兩個不同的智能合約。一方面,我有 CRUD.sol,它在結構“數據”中實現 CRUD 操作。我編寫了一個方法 readAllData() 返回儲存在結構中的所有數據,程式碼如下:

contract CRUD {
   
   struct Data {
       uint id;
       bytes32 contentHash;
       string description;
   }
    
   Data[] data;

   function readAllData() external view returns (Data[] memory){
       return data;
   }
}

我想從另一個智能合約呼叫這個函式。我通過使用介面來做到這一點:

interface ICRUD{
   function readAllData() external view returns (Data[] memory);
}

contract verifyData{

   function read() external{
       ICRUD.readAllData();
   }
}

但是,重新混合會返回此錯誤:

聲明錯誤:未找到標識符或標識符不唯一。–> 介面.sol:5:51: | 5 | 函式 readAllData() 外部視圖返回(數據

$$ $$記憶); | ^^^^ 你們知道我做錯了什麼嗎?

謝謝指教

一個介面只是說明另一個合約有什麼功能(或者,我們感興趣的功能子集)。它沒有說明功能在哪裡。這就是你所缺少的。

為了使用介面,必須已經部署了其他合約,並且您必須在使用介面時提供地址。所以你的程式碼應該是這樣的:部署合約的地址在ICRUD(0xabc).readAllData();哪裡。0xabc

FILE CRUD.sol 主合約文件

// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;

import "./ICRUD.sol";
contract CRUD is ICRUD {

   struct Data {
       uint id;
       bytes32 contentHash;
       string description;
   }
    
   Data[] data;

   function AddData(uint _id, bytes32 _contentHash, string memory _description) public {
   Data memory new_data = Data(_id, _contentHash, _description);
   data.push(new_data);
}

   function readAllData(uint index) external override view returns (uint, bytes32, string memory) {
       Data memory d = data[index];

       return (d.id, d.contentHash, d.description);
   }

} 

文件 ICRUD.sol CRUD.sol 介面

// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;

interface ICRUD {
   function readAllData(uint index) external view returns (uint, bytes32, string memory);

}

文件 verifyData.sol 在這個合約中,我們呼叫 CRUD.sol 的 readAllData()

// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;

import "./ICRUD.sol";

contract verifyData {

   ICRUD public crud;

   constructor(address _crudAddress) {
       crud = ICRUD(_crudAddress);
   }

   function read(uint index) external view returns (uint, bytes32, string memory) {
       return (crud.readAllData(index));
   }
}

剛剛部署了 CRUD.sol 並添加了一項數據

在此處輸入圖像描述

使用建構子參數作為 CRUD.sol 的地址部署 verifyData.sol

然後從 verifyData.sol 讀取數據 在此處輸入圖像描述

如果您想讀取整個資料結構而不僅僅是某個索引處的數據條目。為此申請循環。

你可以參考這篇文章——https://medium.com/coinmonks/solidity-tutorial-returning-structs-from-public-functions-e78e48efb378

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