知乎專欄 | 多維度架構 | | | 微信號 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