是否可以从其他智能合约访问存储类型变量



我正试图开发一个应用程序来跟踪供应链,但由于供应链有几个参与者,主合同的功能已经扩展到超过25kb的限制。

因此,我将合同的功能划分为几个合同,我有一个问题,即是否可以从其他合同中访问存储类型变量。如果可能的话,你能给我一个线索吗,因为我还没有找到关于它的信息?

如果存储属性具有public可见性修饰符,则可以读取存储属性。

您还可以创建相应的setter函数。请注意,这个示例实现允许任何人设置数字,因此您应该添加一个授权机制,以便只有一些发件人可以设置值。

// deployed on 0x123
contract A {
uint256 public number;
function setNumber(uint256 _number) external {
number = _number;
}
}
// deployed on 0x456
contract B {
function getNumberInA() external view returns (uint256) {
return A(0x123).number();
}

}

如果您对实验功能持开放态度,您还可以使用Diamond模式(EIP-2535,目前尚未批准(来利用代理协议的公共存储,以及部署在多个地址上的实现。

看起来您想要一个基本合同,然后创建分包合同。因此,您的基本合同将访问分包合同的函数和变量。您必须实现inheritance。假设您有基本合同和分包合同;

// with this import you will have access to contract Name inside Sub.sol file
import "./Sub.sol"
contract Base is Sub{
// here you can just refence storage variables inside Sub.sol
// BUT storage variables inside Sub.sol has to be  "public"
}

是的,EIP2535 Diamonds解决了24kb大小的限制。它不是通过访问其他合约中的状态变量来实现这一点的,而是通过将所有状态变量存储在一个合约中,而是利用其他合约的代码。关于它的一篇深入文章如下:https://eip2535diamonds.substack.com/p/introduction-to-the-diamond-standard

EIP2535钻石超越了实验技术。以太坊和Polygon上部署了持有数百万美元资产的钻石。30多个项目正在使用它作为这一点。

智能合约不能直接从彼此访问存储。相反,它们通过函数调用交换数据。然而,正如您所提到的,可以部署到区块链的代码数量是有限制的(24kB(。

Nick Mudge在EIP-2535中提出的一种可能的解决方案是;钻石";将函数调用委托给它们的适当的实现合同,称为";facets";。24kB大小限制问题得到了解决,因为您可以拥有任意数量的facet。此外,菱形的所有方面共享相同的存储上下文,这就不需要在它们之间调用函数。

该规范非常健壮和强大。特别是,Cartesi一直在使用Diamonds将智能合约的功能扩展到通常的限制之外,并利用共享存储上下文来降低函数调用的天然气成本。如果您想阅读更多关于EIP-2535及其对代码和存储可升级性的影响,请随时阅读我在Medium上的文章。

最新更新