EOA使用ABI调用
合约之间使用接口调用
自己写ABI,自己写接口
ABI探秘
- EOA使用的ABI数据与合约间调用时调用者持有的接口时等价的,都是对合约函数签名的完整描述
- 调用者使用ABI数据生成message中的calldata
message上下文的变化
- 合约之间的调用也模拟transaction的结构,并且叫message,变量名msg
- 直接被外部账号调用使用的message可以认为是transaction的一个拷贝
- Message在合约间调用时新产生。调用链条中,合约内部调用看到的是一个message,不同合约看到不同的message
举例
// SPDX-License-Identifier: GPL-3.0pragma solidity >=0.8.2 <0.9.0;contract Callee {uint public x;address public caller;address public eoaaddress;function setX(uint _x)public{caller = msg.sender;eoaaddress = tx.origin;x = _x;}
}
contract Caller{address public caller;address public eoaaddress;address calleeAddress;constructor(address _calleeAddress){calleeAddress = _calleeAddress;}function setCalleeX(uint _x)public{caller = msg.sender;eoaaddress = tx.origin;Callee callee = Callee(calleeAddress);callee.setX(_x);}}
// 外部测试合约地址:0x5B38Da6a701c568545dCfcB03FcB875f56beddC4// Caller合约地址: 0xd8b934580fcE35a11B58C6D73aDeE468a2833fa8
运行结果