时间:2022-07-09 12:19:34
注意:如果在通过底层函数delegatecall发起调用时需要访问存储中的变量,那么这两个合约的存储布局需要一致,以便被调用的合约代码可以正确地通过变量名访问合约的存储变量。这不是指在库函数调用(高级的调用方式)时所传递的存储变量指针需要满足那样情况。
效率:一个有状态的合约可以有多个内部功能。每次它改变状态时,并不是所有的都必须被调用。然而,由于它们都是合约的一部分,它们都必须包含在内,从而导致交易规模膨胀。通过将它们放入单独的合约中,只从主合约调用给定调用所需的那些,从而节省大量成本,尤其是在有许多功能时。
调用:合约可以调用其他合约,只需知道地址和ABI,我们就可以在合约内部调用其他合约,需要注意的是,调用合约也是事务性操作,因此,你不需要通过手动管理异步操作的方式来等待返回结果。在合约内部调用其他合约需要消耗额外的Gas费用。调用合约可能由于ABI错误或者不支持某个函数方法而导致失败,但Gas费用并不会返还,我们需要确保在调用其他第三方合约前理解对方合约的接口(包括参数类型,顺序,返回结构)
这是我们的直接目标,之前调用合约V1的调用者全部改为调用合约V2,但这样一来所有调用者都需要更改,只要有1个调用者漏改,那么他就会调用失败。有没有一种方案不需要调用者感知呢?计算机设计中"加一层"的思想又得到了充分应用,我们增加代理合约,调用方只对接代理合约,合约升级代理合约内部解决。
ACE系统分为三个部分,客户端,服务提供商,和矿工。客户端可以通过广播指定被调用合约的签名交易来调用智能合约。除了调用合约外,客户端还可以通过广播包含合约代码及其交易规范规范来部署新的智能合约作为合约创建者。该规范定义了应该执行合同调用的服务提供者和执行结果的接受标准。矿工负责在区块中收集和排序交易,并对交易执行基本的有效性和状态依赖性进行检查。服务提供者负责执行合约调用然后通过网络传递执行结果。