EOA使用ABI调用
合约之间使用接口调用
自己写ABI,自己写接口
ABI探秘
- EOA使用的ABI数据与合约间调用时调用者持有的接口时等价的,都是对合约函数签名的完整描述
- 调用者使用ABI数据生成message中的calldata
message上下文的变化
- 合约之间的调用也模拟transaction的结构,并且叫message,变量名msg
- 直接被外部账号调用使用的message可以认为是transaction的一个拷贝
- Message在合约间调用时新产生。调用链条中,合约内部调用看到的是一个message,不同合约看到不同的message
举例
// SPDX-License-Identifier: GPL-3.0
pragma 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
运行结果