| 知乎專欄 | 多維度架構 | | | 微信號 netkiller-ebook | | | QQ群:128659835 請註明“讀者” |
當合約已經部署到鏈上,如需擴展合約的功能可以採用此種方法。
pragma solidity ^0.4.24;
contract ERC20 {
uint256 public totalSupply;
uint public decimals;
function balanceOf(address _address) constant public returns (uint256);
function transfer(address _to, uint256 _value) public returns (bool success);
}
contract NetkillerBatchTransfer {
ERC20 public token;
constructor(address _contractAddress) public {
token = ERC20(_contractAddress);
}
function getBalance(address _address) view public returns (uint256){
return token.balanceOf(_address);
}
}
當一個合約訪問另一個合約是,msg.sender 與 this 的區別是什麼呢?
pragma solidity ^0.4.24;
/******************************************/
/* Netkiller Mini TOKEN */
/******************************************/
/* Author netkiller <netkiller@msn.com> */
/* Home http://www.netkiller.cn */
/* Version 2018-05-31 Fixed transfer bool */
/******************************************/
contract NetkillerMiniToken {
constructor() public { }
function test1() public view returns (address addr){
return msg.sender;
}
function test2() public view returns (address addr){
return this;
}
}
例子
Contract A: 0xf328c11c4df88d18fcbd30ad38d8b4714f4b33bf Contract B: 0xb9b7e0cb2edf5ea031c8b297a5a1fa20379b6a0a
Contract A 調用 Contract B
msg.sender = 0xF328c11c4dF88d18FcBd30ad38d8B4714F4b33bF this = 0xB9B7e0cb2EDF5Ea031C8B297A5A1Fa20379b6A0a
在合約中出現地址,例如下面:
pragma solidity ^0.4.24;
contract ERC20 {
function totalSupply() public constant returns (uint);
function balanceOf(address tokenOwner) public constant returns (uint balance);
function allowance(address tokenOwner, address spender) public constant returns (uint remaining);
function transfer(address to, uint tokens) public returns (bool success);
function approve(address spender, uint tokens) public returns (bool success);
function transferFrom(address from, address to, uint tokens) public returns (bool success);
event Transfer(address indexed from, address indexed to, uint tokens);
event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
}
contract TestContract{
ERC20 public token = ERC20(0xAeeD5A0C200efA0670330d0C7509C854c52AF859);
function tot() public view returns (uint){
return token.totalSupply();
}
function balance(address _address) public view returns (uint){
return token.balanceOf(_address);
}
}
合約中不支持全小寫的地址。
正確的:0xAeeD5A0C200efA0670330d0C7509C854c52AF859 錯誤的:0xaeed5a0c200efa0670330d0c7509c854c52af859