目录
合约调用
智能合约升级
1、主-从模式
2、代理模式
?
合约调用
以下是一个合约调用另一个合约示例:
pragma solidity^0.6.0;
contract C1{
string private name;
function getName() external view returns (string memory) {
return name;
}
function setName(string calldata _name) external {
name = _name;
}
}
contract C2{
C1 c;
constructor(address addr) public {
//部署时填写被调用合约C1的地址
c = C1(addr);
}
function getName() external view returns (string memory) {
return c.getName();
}
function setName(string calldata _name) external {
c.setName(_name);
}
}
引用被调用合约的地址:
? ? constructor(address addr) public { ? ? ? ? c = C1(addr);? //部署时填写被调用合约C1的地址 ? ? }
部署如下图所示:?
智能合约升级
1、主-从模式
主合约地址永恒不变
从合约地址可以更改或设置多个?
从合约地址可以通过主合约地址获取?
合约部署后会生成一个合约地址,一个合约多次部署会生成不同的合约地址,不同的合约地址对应的是不同的实例,如果想调用一个合约,必须知道合约地址,还需要知道合约的ABI。主合约知道从合约地址与从合约ABI就可以进行调用了。如下示例:
pragma solidity^0.6.0;
//接囗IC
interface IC {
//获取名称
function getName() external view returns(string memory);
//设置名称
function setName(string calldata _name) external;
}
//合约C1实现接囗IC
contract C1 is IC {
//状态变量
string name;
//获取名称
function getName() external view override returns(string memory){
return name;
}
//设置名称
function setName(string calldata _name) external override{
name = _name;
}
}
//合约C2实现接囗IC
contract C2 is IC {
//状态变量
string name;
//获取名称
function getName() external view override returns(string memory){
return name;
}
//设置名称
function setName(string calldata _name) external override{
name = _name;
}
}
//合约C通过合约地址调用C1或C2
contract C {
//状态变量,接囗IC
IC c;
//设置合约地址
function setICAddress(address addr) public {
c = IC(addr);
}
//通过接囗调用 获取名称
function getName() public view returns (string memory) {
return c.getName();
}
//通过接囗调用 设置名称
function setName(string memory _name) public {
c.setName(_name);
}
}
2、代理模式
代理模式借鉴的是回调思想,只关注合约地址,并不关注合约的ABI。
合约想要收取外部账户给的以太(钱)时,要使用fallbak或receive。
未使用fallbak或receive时,合约接收钱,如下例代码所示:
pragma solidity^0.6.0;
contract C1{
function getContractAccountBalance() public view returns (uint256) {
return address(this).balance;
}
}
contract C{
function transfer(address payable _to, uint256 _value) public payable{
require(msg.value >= _value, "转账金额要充足");
_to.transfer(_value);
}
}
部署后,运行结果如下图所示:?
合约C1中增加fallback或receive,表示能够接收外部账户转账的钱,代码如下:
pragma solidity^0.6.0;
contract C1{
function getContractAccountBalance() public view returns (uint256) {
return address(this).balance;
}
//fallback表示此合约能够接收外部账户转账的钱
fallback() external payable {
}
}
contract C{
function transfer(address payable _to, uint256 _value) public payable{
require(msg.value >= _value, "转账金额要充足");
_to.transfer(_value);
}
}
?部署后,运行结果如下图所示:?
?
|