在以太坊合约中,一个合约可以调用另一个合约,以实现功能模块化。除了普通的跨合约调用,以太坊还提供了delegatecall来跨合约调用。delegatecall跨合约调用与普通跨合约调用不同,它不会改变代码执行的上下文环境,而是基于当前合约的上下文来执行目标合约代码,就像这些代码是当前合约自己的代码一样。什么是合约上下文?我们以一个简单的示例来说,就可以正确理解delegatecall的调用方式。先编写两个合约:Target和Delegate,完整代码如下:pragma solidity ^0.8.25;contract Target { event Log(string msg, address thisAddr, address msgSender, uint256 msgValue, address txOrigin); string public name = "target"; uint256 public version = 1; function save(string memory _name, uint256 _version) public payable { name = _name; version = _version; emit Log("Target.save", address(this), msg.sender, msg.value, tx.origin);
………………………………