资讯专栏INFORMATION COLUMN

以太坊智能合约之批量转币

sPeng / 2997人阅读

摘要:用途我们为什么需要批量转币这样的智能合约呢大大节约转币的资金成本。但是使用这个批量转币的智能合约,一般来说,两百次左右可以一次性操作完,那么也就是两百次转币费只需要支付一次转币费即可。大大节约转币的人工成本。

一直想写这篇教程来着,因为你会发现网络上很少有关于批量转币的详尽的教程,一些提供该工具的网站也并不会将其智能合约代码开源出来。虽然最终我们会发现原来这个批量转币的智能合约原来就这么几行代码就够啦,但是整个流程不明所以的话,给你这个合约代码我相信你也是用不了的,因此对于新手来说想要写出这个功能多少还是有不小的难度的。

批量转币其实也属于空投的一种,所谓空投,笔者的理解是利用程序或者人工的方式,将代币发放至目标账户。

注意:这里所说的代币均指代的是 ERC20 Token,对于更新的代币例如 ERC721 Token 等,由于本身就优化了这方面,因此不需要我们这样折腾。

用途

我们为什么需要批量转币这样的智能合约呢?

大大节约转币的资金成本。很明显,如果我们人工一次次的进行转币操作,那么转个几百次所需要的 gas 费用会让你吃一惊。但是使用这个批量转币的智能合约,一般来说,两百次左右可以一次性操作完,那么也就是两百次转币费只需要支付一次转币费即可。

大大节约转币的人工成本。和支付费用成本类似,让你手工转个几百次估计怕是要疯掉了。

有足够的需求。前面也讲到,新的 ERC721 Token 等不需要我们这样折腾,但是目前 ERC20 Token 几乎是绝大多数代币的模板,因此需求足够大,也就是应用场景足够大。

前置知识点

合约调用合约

授权转账方法

合约调用合约

要在智能合约中调用其他合约,就需要了解抽象合约的概念,具体细节可以看这里。

以本文所要讲的转币合约为例,我们要在合约中调用 ERC20 Token 的 transferFrom 方法,那么我们首先要先创建一个 ERC20 Token 的抽象合约,代码如下:

/**
 * @dev ERC20 Token abstract constract.
 */
contract ERC20Token {
    function transferFrom(address, address, uint256) public returns (bool);
}

因为我们只需要用到代币的 transferFrom 方法,因此我们只需要声明该方法即可,注意是没有函数体的空方法。

那么我们在批量转币的合约中如何进行调用呢?和大多数面向对象的编程语言一样,我们只需要创建这个代币合约,然后调用这个代币合约实例的授权转账方法即可,代码如下:

/**
    * @dev calls the ERC20 token"s transferFrom function
    * @param _token address The address of ERC20 token.
    * @param _dsts address The addresses which be air dropped.
    * @param _values uint256 The token values that each address will receive.
    */
function transfer(address _token, address[] _dsts, uint256[] _values) 
    public
    payable
{
    ERC20Token token = ERC20Token(_token);
    for (uint256 i = 0; i < _dsts.length; i++) {
        token.transferFrom(msg.sender, _dsts[i], _values[i]);
    }
}

我们的批量转币代码是不是非常简单~可以看到,我们首先创建了 ERC20 Token 的合约实例,然后循环要转币的地址列表,每次遍历中调用目标 ERC20 Token 的 transferFrom 方法即可。

这个函数可以做的更好:对于代码边际判断,我们可以判断一下 _token 以及 _dsts 是否均为合法账户,或者判断一下 _values 是否均为合法正数值,又或者比较一下 _dsts 和 _values 的数组长度是否相等(健壮的代码一定是边际安全的)。。。是否还能完善的更好一些?当然是可以的,比如我们增加一个 Event 事件供调用者监听以便做出相应处理。。。
授权转账方法

那么是不是上面的这些代码就足够了呢?对于批量转币合约来说核心代码就是这些。

但是!有个前提!

我们在使用这个合约转币前,需要授权给这个合约一定的代币数额授权给这个合约一定的代币数额授权给这个合约一定的代币数额

这里就引出了授权转账的概念,还是以批量转币为例:

首先我们需要明确,假如你拥有 1000 个 SIM 代币,那么这些代币就独属于你,没人能拿走(别给我瞎扯什么被盗啊之类的情况,讲例子的时候我们纯真些。。。)那么如果你啥也不做,想要让转币合约能够转走你的 SIM 代币,显然这是不可能的,因为是你拥有这些代币,而不是转币合约拥有。

所以此时你就需要把自己的 SIM 代币授权给转币合约,至于授权多少看你要转多少。一旦你完成授权操作,那么转币合约就有权利将你的代币进行转账操作了(等下,我可以之后突然改主意取消授权吗?可以,你再次授权一次,数目为零即可。)

案例

笔者之前花了点时间做了一个 Web 页面,将批量转币的功能做在了上面,下面我们简单的看下整个流程,配合示例图会更加清晰 :)

第一步主要是获取用户需要批量转账的代币信息,通过用户填写的代币合约地址,然后获取到基本的代币信息。

第二步主要是获取用户转币的数目和账户信息,然后需要让用户授权相应数目的代币给我们的转币合约。

第三步主要是让用户确认信息,并开始空投。

这是批量转 ERC20 代币的交易记录:
Ropsten Transaction 0x630b868e41ecfbd97273371ed33242439230355d9110095b814ae3029b88d829

扩展

这里笔者给新手们留个作业,如果我想要批量转 ETH 怎么办?如果直接使用上面的代码可不好使哦,但是思路是一毛一样的,而且代码上会更简洁~

附上一个批量转 ETH 的交易记录:
Ropsten Transaction 0x4fcfc6245d7ffecfae7c02eb2f983f203806b83b5a1cf2fc0450a61d7c226401

哦,大家可能还会看到另外一种批量转币的合约代码的写法,代码如下:

bytes4 id = bytes4(keccak256("transferFrom(address,address,uint256)"));
token_address.call(id, msg.sender, _dsts[i], _valus[i]);

这在低版本的 Solidity 中是可以正常运行的,因为本质上和上面讲的是一样的,但在高版本中废弃了该用法,因此笔者在尝试高版本中使用会出现每次批量转币的最后一次总是会失败。所以推荐的做法是通过抽象合约的方式进行调用其他合约的方法。

最后,希望大家在区块链的世界中玩的开心~

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/24234.html

相关文章

  • 以太智能合约开发第二篇:理解以太相关概念

    摘要:原文发表于以太坊智能合约开发第二篇理解以太坊相关概念很多人都说比特币是区块链,以太坊是区块链。它是以太坊智能合约的运行环境。是由以太坊节点提供。以太坊社区把基于智能合约的应用称为去中心化的应用。 原文发表于:以太坊智能合约开发第二篇:理解以太坊相关概念 很多人都说比特币是区块链1.0,以太坊是区块链2.0。在以太坊平台上,可以开发各种各样的去中心化应用,这些应用构成了以太坊的整个生态...

    yibinnn 评论0 收藏0
  • 以太是什么 - 以太开发入门指南

    摘要:以太坊是什么以太坊是一个建立在区块链技术之上,去中心化应用平台。运行环境以太坊虚拟机是以太坊中智能合约的运行环境。是由以太坊客户端提供的是典型的开发以太坊时使用的客户端,基于语言开发。 本文首发于深入浅出区块链社区原文链接:以太坊是什么 - 以太坊开发入门指南原文已更新,请读者前往原文阅读 很多同学已经跃跃欲试投入到区块链开发队伍当中来,可是又感觉无从下手,本文将基于以太坊平台,以通俗...

    tomlingtm 评论0 收藏0
  • 区块链技术学习指引

    摘要:引言给迷失在如何学习区块链技术的同学一个指引,区块链技术是随比特币诞生,因此要搞明白区块链技术,应该先了解下比特币。但区块链技术不单应用于比特币,还有非常多的现实应用场景,想做区块链应用开发,可进一步阅读以太坊系列。 本文始发于深入浅出区块链社区, 原文:区块链技术学习指引 原文已更新,请读者前往原文阅读 本章的文章越来越多,本文是一个索引帖,方便找到自己感兴趣的文章,你也可以使用左侧...

    Cristic 评论0 收藏0
  • SegmentFault 技术周刊 Vol.41 - 深入学习区块链

    摘要:和比特币协议有所不同的是,以太坊的设计十分灵活,极具适应性。超级账本区块链的商业应用超级账本超级账本是基金会下的众多项目中的一个。证书颁发机构负责签发撤 showImg(https://segmentfault.com/img/bV2ge9?w=900&h=385); 从比特币开始 一个故事告诉你比特币的原理及运作机制 这篇文章的定位会比较科普,尽量用类比的方法将比特币的基本原理讲出来...

    qianfeng 评论0 收藏0
  • 区块链学习以太(七)

    摘要:基于以太坊项目,以太坊团队目前运营了一个公开的区块链平台以太坊网络。主要特点以太坊区块链底层也是一个类似比特币网络的网络平台,智能合约运行在网络中的以太坊虚拟机里。以太坊采用交易作为执行操作的最小单位。 以太坊将比特币针对数字交易的功能进一步进行了拓展,面向更为复杂和灵活的应用场景,支持了智能合约这一重要特性。 以太坊项目简介 以太坊:项目最初的目标是打造以个智能合约的平台,该平台支持...

    xiongzenghui 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<