合约之间调用-如何实现函数静态调用?

合约之间的函数调用

  • EOA,external owned account,外部账号,例如metamask
  • 调用最终总是由EOA发起的
  • 合约之间的调用使得一次完整的调用成为一个调用链条

合约间调用过程

  • 调用者须持有被调用合约的地址
  • 得到被调用合约的信息
  • 将地址重载为被调用合约,调用它的函数

最直接的调用方式(源文件内部)

  • 调用者直接将被调用合约的地址重载为合约的实例
  • 用合约实例调用合约函数
javascript 复制代码
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.8.2 <0.9.0;

contract Callee {
    uint public x;
    function setX(uint _x)public{
        x = _x;
    }
}
contract Caller{
    address calleeAddress;
    constructor(address _calleeAddress){
        calleeAddress = _calleeAddress;
    }
    function setCalleeX(uint _x)public{
        Callee callee = Callee(calleeAddress);
        callee.setX(_x);

    }

}
//0xd9145CCE52D386f254917e481eB44e9943F39138 // Callee合约实例的地址 先部署Callee合约获取地址作为Caller的构造参数

通过import调用合约函数(源文件之间)

  • import被调用合约的源文件
  • 调用者将被调用合约的地址重载为合约实例
  • 用合约实例调用合约函数

Callee.sol

javascript 复制代码
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.8.2 <0.9.0;

contract Callee {
    uint public x;
    function setX(uint _x)public{
        x = _x;
    }
}

Caller.sol

javascript 复制代码
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.8.2 <0.9.0;
import "./Callee.sol";

contract Caller{
    address calleeAddress;
    constructor(address _calleeAddress){
        calleeAddress = _calleeAddress;
    }
    function setCalleeX(uint _x)public{
        Callee callee = Callee(calleeAddress);
        callee.setX(_x);

    }

}
// 0xd9145CCE52D386f254917e481eB44e9943F39138

通过接口的调用

  • 合约的接口等价于其ABI
  • 接的定义方法
  • 接口的使用方法

ICallee.sol

javascript 复制代码
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.8.2 <0.9.0;

interface ICallee {
    function setX(uint _x) external;
    
}

Callee.sol

javascript 复制代码
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.8.2 <0.9.0;
// import "./ICallee.sol"; // 柔性,不强制一定要is Icallee 只要实现是一致就行 

// contract Callee is Icallee {
contract Callee {
    uint public x;
      uint public y;
    function setX(uint _x)public{
        x = _x;
    }
    function setY(uint _y)public {
        y=_y;
    }
    //.....
}

Caller.sol

javascript 复制代码
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.8.2 <0.9.0;

 interface ICallee {
    function setX(uint _x) external;
    function setY(uint _x) external;
}

contract Caller{
    address calleeAddress;
    constructor(address _calleeAddress){
        calleeAddress = _calleeAddress;
    }
    function setCalleeX(uint _x)public{
        ICallee callee = ICallee(calleeAddress);
        callee.setY(_x);

    }

}
// 0xd9145CCE52D386f254917e481eB44e9943F39138

面向接口

  • 与一般开发语言一样,面向接口而不是实现
  • 不要求被调用者语法上实现一个接口
  • 接口最小化(有必要的才放入接口)
相关推荐
m0_3801671410 天前
面向开发者的Top10加密货币数据API(2026年最新)
大数据·人工智能·区块链
2601_9594801510 天前
Moneta Markets亿汇:“比特币高位修复风险偏好”
区块链
m0_3801671411 天前
加密货币价格 API、市场数据 API 与 分析 API 有什么区别?
人工智能·ai·区块链
LedgerNinja11 天前
AEGET:提升决策效率,助力交易者建立清晰的交易体系
区块链
2601_9619633811 天前
Spring Boot集成电子签章的7个典型问题与解决方案:从入门到生产级实践
大数据·人工智能·spring boot·python·区块链·智能合约
zhuhai_xigedian11 天前
物联网技术在源网荷储系统中的创新应用
大数据·运维·人工智能·区块链·能源
2601_9594801511 天前
Moneta Markets亿汇:“比特币长期预期继续升温”
区块链
2601_9619633811 天前
数据室里的“第一道锁”:电子保密协议(NDA)签署与防泄漏机制全解析
网络·人工智能·安全·金融·区块链·政务
HavenlonLabs12 天前
重塑链上未来的隐形基石:长期主义下的生态演进
大数据·人工智能·安全·区块链
LedgerNinja12 天前
2026美国5月未季调CPI年率
区块链