ERC223对ERC220的改进

ERC223是以太坊上最新的代币(token)接口标准,主要是为了解决ERC220代币转账丢失问题,那么怎么解决的呢,一起来看看.

1. ERC220 存在问题

ERC220接口中存在诸多转账接口,以transfer为例.

 /// @notice send `_value` token to `_to` from `msg.sender`
/// @param _to The address of the recipient
/// @param _value The amount of token to be transferred
/// @return Whether the transfer was successful or not
function transfer(address _to, uint256 _value) public returns (bool success);

这个接口意思就是我给一个指定地址转多少token,功能非常简单,但是当初设计的时候没有考虑到的一个问题就是如果接收者是一个智能合约,那么合约是没法感知自己收到了多少token的.

当然ERC220只是一个接口标准(类似于dll接口),具体实现者完全可以考虑_to是智能合约时,采取一些特殊动作.

2. ERC223 标准化_to是合约地址时如何响应

上文提到具体实现者可以自己采取特殊动作,但是这缺乏规范,无法推广.

2.1 合约规范化的响应动作

  function transfer(address to, uint value) public returns (bool ok);
function transfer(address to, uint value, bytes data) public returns (bool ok);

第一个接口兼容ERC220,第二个则是扩展ERC220,可以传递给合约一些数据(参数data).

具体实现就是,如果to是合约,那么会尝试调用该合约的tokenFallback函数,如果成功,则token转移成功,否则失败.

这个思路实际上就是以太坊上智能合约接收以太币时有一个fallback函数.

2.2 更灵活的响应机制

transfer(address _to, uint _value, bytes _data, string _custom_fallback)

如果接收方合约没有提供tokenFallback函数,则可以通过合约的fallback函数来传递信息,让合约知道有人给他转token了.

具体就是在这里

  assert(_to.call.value(0)(bytes4(keccak256(_custom_fallback)), msg.sender, _value, _data));

这里的_to.call.value(0)(...) 就是直接调用合约fallback函数,但是我没给你转以太币,只是给你捎了个信儿,可以包含更多的自定义信息.当然gas也不便宜啊..

ERC230 VS ERC223的更多相关文章

  1. Solidity的三种合约间的调用方式 call、delegatecall 和 callcode

    0x00 前言 Solidity(http://solidity.readthedocs.io/en/v0.4.24/) 是一种用与编写以太坊智能合约的高级语言,语法类似于 JavaScript. S ...

  2. [转帖](区块链补习班)ERC20很多人都听过,但ERC是什么你真的了解吗?

    (区块链补习班)ERC20很多人都听过,但ERC是什么你真的了解吗? http://baijiahao.baidu.com/s?id=1600948969290990883&wfr=spide ...

  3. ETH&EOS开发资源及工具集合(完整汇总版)

    ETH&EOS开发资源及工具集合(完整汇总版) 3113 ETH开发资源篇 一.开发语言 ·         Solidity - 官方推荐以太坊智能合约开发语言,也是目前最为主流的智能合约语 ...

  4. 以太坊再爆高危漏洞!黑客增发ATN 1100万枚token事件始末

    事情发生在5月中旬,ATN技术人员发现Token合约由于存在漏洞受到攻击.不过ATN基金会随后透露,将销毁1100万个ATN,并恢复ATN总量,同时将在主链上线映射时对黑客地址内的资产予以剔除,确保原 ...

随机推荐

  1. Java-Runoob:Java 教程

    ylbtech-Java-Runoob:Java 教程 1.返回顶部 1. Java 教程 Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言. Java可运行于 ...

  2. Java-Maven-Runoob:Maven 快照(SNAPSHOT)

    ylbtech-Java-Maven-Runoob:Maven 快照(SNAPSHOT) 1.返回顶部 1. Maven 快照(SNAPSHOT) 一个大型的软件应用通常包含多个模块,并且通常的场景是 ...

  3. 1023 Have Fun with Numbers

    题意: 给定一个正整数(最多有20位),假设这个数是a1a2a3...ak,把这个数乘以2倍,看得到的结果是否仍然是a1a2a3...ak的一个排列    思路: 大整数与int型整数的乘法:简单哈希 ...

  4. linux下dmesg命令详解

    前言:     有时候想查看一下开机启动信息,可以通过这个命令查询. 1,命令格式 功能说明:显示开机信息.  语 法:dmesg [-cn][-s <缓冲区大小>]  补充说明:kern ...

  5. C++11 类的六个默认函数及其使用

    六个默认函数: 构造函数(construct) 析构函数(destruct) 复制构造函数(copy construct) 赋值(assign) 移动构造函数(move construct) 移动赋值 ...

  6. python's twenty-sixth day for me 模块

    configparser 模块: 该模块适用于配置文件的格式与windows ini文件类似,可以包含一个或多个节(section),每个节可以有多个参数(键 = 值). 创建文件: # 创建文件 i ...

  7. Python Twisted系列教程13:使用Deferred新功能实现新客户端

    作者:dave@http://krondo.com/deferred-all-the-way-down/  译者:杨晓伟(采用意译) 你可以从这里从头阅读这个系列. 介绍 回忆下第10部分中的客户端5 ...

  8. python ftp 上传

    #!/usr/bin/python # -*-coding:utf- -*- from ftplib import FTP def ftpconnect(host,username,password) ...

  9. Java之Object类与instanceof关键字

    Object类是所有类的父类: 我们上下代码: package com.learn.chap03.sec14; public class A { // 上面类A继承了Object类,因此又可这样定义: ...

  10. BurpSuite—-Sequencer模块(定序器)

    一.简介 Burp Sequencer是一种用于分析数据项的一个样本中的随机性质量的工具.你可以用它来测试应用程序的session tokens(会话tokens)或其他重要数据项的本意是不可预测的, ...