我一直在阅读ERC20令牌的不同实现,我注意到它们中的许多将balanceOf地址定义为balances地址,然后创建一个公共getter()来匹配balanceOf()标准。类似地,totalSupply通常以不同的名称在本地存储,然后创建一个getter来匹配标准的totalSupply() https://theethereum.wiki/w/index.php/ERC20_令牌_标准,我想知道手动为这两个变量创建getter的目的是什么?Solidity会自动为公共变量创建getter,那么为什么不将它们命名为正确的名称呢?
发布于 2018-04-06 15:53:00
尽管这是一个重复的问题,但我不确定其他答案是否足以解释这个问题。
通过一个简单的例子,这个问题很容易被证明:
pragma solidity ^0.4.21;
interface ERC20 {
function balanceOf(address) external view returns (uint);
function transfer(address, uint) external returns (bool);
}
contract TestA is ERC20 {
mapping(address=>uint) public balanceOf;
function TestA() public {
balanceOf[this] = 1000;
}
function transfer(address _to, uint256 _value) external returns (bool success){
require(balanceOf[msg.sender] >= _value);
balanceOf[msg.sender] -= _value;
balanceOf[_to] += _value;
require(balanceOf[_to] >= _value);
return true;
}
}
contract TestB {
address a;
function TestB() public {
a = new TestA();
}
function aBalance() external view returns (uint) {
return ERC20(a).balanceOf(a);
}
}如果您尝试编译此契约,则最终会出现如下错误:
browser/contract.sol:28:13: TypeError: Trying to create an instance of an abstract contract.
a = new TestA();
^-------^
browser/contract.sol:4:5: Missing implementation:
function balanceOf(address) external view returns (uint);
^-------------------------------------------------------^原因是,尽管它获得了一些虚拟的getter,并且充当了一个ERC20令牌,但它没有实现函数,因此不能从编译器的角度将其视为ERC20令牌。
如果您从契约中删除了is ERC20,或者手动添加了想要的函数,它将完全按照预期的方式工作,您就不能有一种温暖的模糊感觉,认为您已经保证了正确地实现了接口,同时最小化了代码。
我相信这可能是编译器的错误或者其他什么的。
https://ethereum.stackexchange.com/questions/44954
复制相似问题