近期爆出了大量ERP20的代币漏洞问题,给广大币友带了了很大的损失。这些遵守ERP20协议的代币都是基于ETH做的,那么什么才是ERP20协议呢?
ERC20简述
ERC-20 标准是在2015年11月份推出的,使用这种规则的代币,表现出一种通用的和可预测的方式。
简单地说,任何 ERC-20 代币都能立即兼容以太坊钱包(几乎所有支持以太币的钱包,包括Jaxx、MEW、imToken等,也支持 erc-20的代币),由于交易所已经知道这些代币是如何操作的,它们可以很容易地整合这些代币。这就意味着,在很多情况下,这些代币都是可以立即进行交易的。
Token代表着数字资产,具有价值,但是各种各样的token并不具有统一的规范,因此彼此独立,很难产生交集。而基于ERC20协议的token具有统一的规范,并且可以在不同的DApps上工作。ERC20规范可以让token更兼容,ERC20的标准化使得该类型的token非常具有优势,因为这些token可以应用于不同的平台和项目。否则token则只能应用在特定的场合。
ERC20标准规定了哪些内容?
ERC20 是各个代币的标准接口。ERC20 代币仅仅是以太坊代币的子集。为了充分兼容 ERC20,开发者需要将一组特定的函数(接口)集成到他们的智能合约中,以便在高层面能够执行以下操作:
- 获得代币总供应量
- 获得账户余额
- 转让代币
- 批准花费代币
ERC20 让以太坊区块链上的其他智能合约和去中心化应用之间无缝交互。一些具有部分但非所有ERC20标准功能的代币被认为是部分 ERC20兼容,这还要视其具体缺失的功能而定,但总体是它们仍然很容易与外部交互。
ERC20 标准定义了一个兼容协议, 需要实现一以下函数. 具体如下:
//ERC Token Standard #20 Interface
// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md
contract ERC20Interface {
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); }
同时规定了三个必须定义的变量,分别是
- 合约名称
- 合约代号
- 合约进制
string public constant name = "Token Name";
string public constant symbol = "SYM";
uint8 public constant decimals = 18;
// 18 is the most common number of decimal places
ERC20的缺陷
ERC-20标准还有待完善。
-
其中一个障碍是,将令牌直接发送给令牌的智能合同将导致资金损失。这是因为一个令牌的合同只会跟踪和分配资金。例如,当您从钱包中向另一个用户发送令牌时,该钱包将调用令牌的合约来更新数据库。所以如果您试图将令牌直接传输到令牌的合约中,那么由于该令牌的合约无法响应,所以金钱就“丢失”了。
-
ERC20标准无法通过接收方合同处理传入的交易。这是该令牌存在的最大问题,也是开发者一直希望改进的地方。ERC20令牌无法将令牌发送给一个与这些令牌不兼容的契约,也正因为这样,部分资金存在丢失的风险。
-
Reddit上的一篇文章指出,由于被发送到“错误”的合同上,大约价值40万美元的ERC20令牌被困,这对整个以太坊生态系统而言是一个巨大的威胁。幸运的是,ERC223令牌可以解决这一难题,前提是该令牌能够获得批准并被引入。
ERC20 漏洞解析
ERC20里有两种操作代币转账的方法,分别是针对不同的目的地,账户和智能合约地址。我觉得这里可以理解成个人账户,和一个有智能合约代码的“对公账户”:
-
从你的账户把token发到别人的账户,用“Transfer”方法。
-
从你的账户把token发到一个智能合约地址,需要连续调用两个方法:“approve ”和“transferFrom’”。也就是两步:
a. 授权:我允许这个智能合约账户来转我的token
b. 转币:从我的账户转xxx token过去
这看起来没什么问题,但如果有人写代码的时候,不小心在一个“私对公”的转账功能里面,错用了“Transfer”呢?下面的错误就会发生:
举个例子,假设你把币从A交易所转到B交易所(一般打到一个智能合约地址),假设A交易所用错了tranfer方法,结果就是你的币余额减少了,但B交易所那边其实收到了币,但由于使用了错误的转账方法,没有显示到账。
新解决方案:ERC223、ERC777、BCH彩色币
社区成员基于安全提出了一个ERC223标准,检查tranfer方法的目的地是账户地址,还是只能合约地址。如果发现不是正常账户地址则返回错误,并且调用一个tokenFallback的方法把币转回来。
ERC777标准诞生于2017年11月,是试图解决漏洞,并且可以对ERC20向下兼容的一个新版本,也就是说,任何使用ERC20的应用程序也可以与ERC777一起使用。
这个协议的好处还有:
用户和智能合约交互的时候,从2次交互变成1次交互,也就是说时间、资源和需要支付的ether都变少了。反过来说这样消耗了更少的以太网络资源,解决了部分拥堵问题。
可以设置黑名单地址,在一定程度上避免通过黑客攻击引起的损失。
这也使得交易所更容易遵守“认识你的客户”(KYC)和反洗钱法(AML),有利于Ethereum区块链的合规发展。
更多区块链知识请关注公众号:blockchain_jiangsong
网友评论