孔乙己懂“回”字的四种写法,你会智能合约的四种调用方式吗?
在中大型的项目中,我们不可能在一个智能合约中实现所有的功能,而且这样也不利于分工合作。一般情况下,我们会把代码按功能划分到不同的库或者合约中,然后提供接口互相调用。
在Solidity中,如果只是为了代码复用,我们会把公共代码抽出来,部署到一个library中,后面就可以像调用C库、Java库一样使用了。但是library中不允许定义任何storage类型的变量,这就意味着library不能修改合约的状态。如果需要修改合约状态,我们需要部署一个新的合约,这就涉及到合约调用合约的情况。
合约调用合约有下面4种方式:
- CALL
- CALLCODE
- DELEGATECALL
- STATICCALL
1.CALL vs. CALLCODE
CALL和CALLCODE的区别在于:代码执行的上下文环境不同。
具体来说,CALL修改的是被调用者的storage,而CALLCODE修改的是调用者的storage。
我们写个合约验证一下我们的理解:
pragma solidity ^0.4.25;
contract A {
int public x;
fun