Solidity
兩個合約之間的 Solidity 介面
我正在嘗試連接兩個不同的智能合約。一方面,我有 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
如果您想讀取整個資料結構而不僅僅是某個索引處的數據條目。為此申請循環。