主页 > imtoken钱包苹果 > 以太坊智能合约批量转币-小专栏

以太坊智能合约批量转币-小专栏

imtoken钱包苹果 2023-08-03 05:15:09

一直想写这个教程,因为你会发现网上关于批量转币的详细教程很少,而且有些提供这个工具的网站不会开源他们的智能合约代码。 虽然最后我们会发现批量转币的智能合约只有几行代码,但是整个过程并不清楚,所以如果我给你合约代码,我相信你不会使用它,所以对于新手来说,如果要写这个功能还是比较吃力的。

批量转币其实就是一种空投。 所谓空投,笔者的理解是通过程序或人工的方式,将代币分发给目标账户。

注:这里所说的token都是指ERC20 Token。 对于较新的token,比如ERC721 Token等,由于这方面已经做了优化,我们就不用这么大惊小怪了。

利用

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

大大节省了货币转移的资金成本。 显然,如果我们一次又一次地手动转币,数百次转账所需的 gas 成本会让你大吃一惊。 但是使用这个智能合约批量转币以太坊合约教程,一般来说一次可以完成200次左右,所以200次的转账手续费只需要交一次。 大大节省了货币转移的人工成本。 类似于支付费用成本,如果你必须手动转动它数百次,你可能会发疯。 有足够的需求。 前面说了新的ERC721 Token不需要我们这么大惊小怪,但是目前ERC20 Token几乎是大部分token的模板,所以需求足够大,也就是应用场景足够大。前置知识点合约调用合约授权转移方法合约调用合约

调用智能合约中的其他合约,需要了解抽象合约的概念,具体细节就好了。

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

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

因为我们只需要使用token的transferFrom方法,所以只需要声明这个方法即可。 请注意,它是一个没有函数体的空方法。

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

/**
    * calls the ERC20 token's transferFrom function
    * _token address The address of ERC20 token.
    * _dsts address The addresses which be air dropped.
    * _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]);
    }

以太坊智能合约编写_siteqq.com 以太坊智能合约_以太坊合约教程

}

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

这个函数可以做得更好:对于代码边际判断,我们可以判断_token和_dsts是否为合法账户,或者判断_values是否为合法正值,或者比较_dsts和_values数组长度是否相等(健壮的代码必须边际安全的)。 . . 还能改进得更好吗? 当然是可以的,比如我们添加一个Event事件供调用者监听,以便进行相应的处理。 . .

授权转让方式

那么上面的代码够了吗? 以上就是批量转账合约的核心代码。

但! 有一个前提!

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

这里引入授权转账的概念,还是以批量转账为例:

首先,我们要明确一点,如果你有1000个SIM token,那么这些token是你一个人的,谁也拿不走(别告诉我什么东西被偷了什么的,以后再天真点我们讲例子。。。)然后如果你什么都不做,想让转账合约转账你的 SIM 代币,显然这是不可能的,因为你拥有这些代币,而不是转账合约。

所以这个时候,你需要将你的 SIM 代币授权给转币合约。 至于授权多少,就看你要转多少了。 一旦你完成授权操作,代币转账合约就有权转账你的代币(等一下,我可以突然改变主意取消授权吗?可以,你可以重新授权,金额为零。)

案子

笔者之前花点时间做了一个网页,把批量转币的功能放在上面。 下面简单看一下整个过程,再结合示例图就更清楚了:)

获取代币信息

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

填写转币数量和账户

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

确认并空投

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

这是ERC20代币批量转账的交易记录:

Ropsten 交易 0x630b868e41ecfbd97273371ed33242439230355d9110095b814ae3029b88d829

扩张

这里给新手留个功课,如果想批量转ETH怎么办? 直接用上面的代码不太方便,但是思路是一样的,代码会更简洁~

附上批量转账到ETH的交易记录:

Ropsten 交易 0x4fcfc6245d7ffecfae7c02eb2f983f203806b83b5a1cf2fc0450a61d7c226401

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

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

这个在低版本的Solidity中可以正常使用,因为和上面的本质上是一样的,但是在高版本中放弃了这个用法,所以当我尝试在高版本中使用时,会出现批量传输coins every time 最后一个总是失败。 因此,推荐的方法是通过抽象合约调用其他合约的方法。

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

以太坊智能合约编写_以太坊合约教程_siteqq.com 以太坊智能合约

一直想写这个教程,因为你会发现网上关于批量转币的详细教程很少,而且有些提供这个工具的网站不会开源他们的智能合约代码。 虽然最后我们会发现批量转币的智能合约只有几行代码,但是整个过程并不清楚,所以如果我给你合约代码,我相信你不会使用它,所以对于新手来说,如果要写这个功能还是比较吃力的。

批量转币其实就是一种空投。 所谓空投,笔者的理解是通过程序或人工的方式,将代币分发给目标账户。

注:这里所说的token都是指ERC20 Token。 对于较新的token,比如ERC721 Token等,由于这方面已经做了优化,我们就不用这么大惊小怪了。

利用

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

大大节省了货币转移的资金成本。 显然,如果我们一次又一次地手动转币,数百次转账所需的 gas 成本会让你大吃一惊。 但是使用这个智能合约批量转币,一般来说一次可以完成200次左右,所以200次的转账手续费只需要交一次。 大大节省了货币转移的人工成本。 类似于支付费用成本,如果你必须手动转动它数百次,你可能会发疯。 有足够的需求。 前面说了新的ERC721 Token不需要我们这么大惊小怪,但是目前ERC20 Token几乎是大部分token的模板,所以需求足够大,也就是应用场景足够大。前置知识点合约调用合约授权转移方法合约调用合约

调用智能合约中的其他合约,需要了解抽象合约的概念,具体细节就好了。

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

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

因为我们只需要使用token的transferFrom方法,所以只需要声明这个方法即可。 请注意,它是一个没有函数体的空方法。

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

/**
    * calls the ERC20 token's transferFrom function
    * _token address The address of ERC20 token.
    * _dsts address The addresses which be air dropped.
    * _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]);

siteqq.com 以太坊智能合约_以太坊合约教程_以太坊智能合约编写

} }

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

这个函数可以做得更好:对于代码边际判断,我们可以判断_token和_dsts是否为合法账户,或者判断_values是否为合法正值,或者比较_dsts和_values数组长度是否相等(健壮的代码必须边际安全的)。 . . 还能改进得更好吗? 当然是可以的,比如我们添加一个Event事件供调用者监听,以便进行相应的处理。 . .

授权转让方式

那么上面的代码够了吗? 以上就是批量转账合约的核心代码。

但! 有一个前提!

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

这里引入授权转账的概念,还是以批量转账为例:

首先,我们要明确一点,如果你有1000个SIM token,那么这些token是你一个人的,谁也拿不走(别告诉我什么东西被偷了什么的,以后再天真点我们讲例子。。。)然后如果你什么都不做,想让转账合约转账你的 SIM 代币,显然这是不可能的,因为你拥有这些代币,而不是转账合约。

所以这个时候,你需要将你的 SIM 代币授权给转币合约。 至于授权多少,就看你要转多少了。 一旦你完成授权操作,代币转账合约就有权转账你的代币(等一下,我可以突然改变主意取消授权吗?可以,你可以重新授权,金额为零。)

案子

笔者之前花点时间做了一个网页,把批量转币的功能放在上面。 下面简单看一下整个过程,再结合示例图就更清楚了:)

获取代币信息

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

填写转币数量和账户

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

确认并空投

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

这是ERC20代币批量转账的交易记录:

Ropsten 交易 0x630b868e41ecfbd97273371ed33242439230355d9110095b814ae3029b88d829

扩张

这里给新手留个功课,如果想批量转ETH怎么办? 直接用上面的代码不太方便,但是思路是一样的,代码会更简洁~

附上批量转账到ETH的交易记录:

Ropsten 交易 0x4fcfc6245d7ffecfae7c02eb2f983f203806b83b5a1cf2fc0450a61d7c226401

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

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

这个在低版本的Solidity中可以正常使用,因为和上面的本质上是一样的,但是在高版本中放弃了这个用法,所以当我尝试在高版本中使用时,会出现批量传输coins every time 最后一个总是失败。 因此,推荐的方法是通过抽象合约调用其他合约的方法。

以太坊合约教程_以太坊智能合约编写_siteqq.com 以太坊智能合约

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

一直想写这个教程,因为你会发现网上关于批量转币的详细教程很少,而且有些提供这个工具的网站不会开源他们的智能合约代码。 虽然最后我们会发现批量转币的智能合约只有几行代码,但是整个过程并不清楚,所以如果我给你合约代码,我相信你不会使用它,所以对于新手来说,如果要写这个功能还是比较吃力的。

批量转币其实就是一种空投。 所谓空投,笔者的理解是通过程序或人工的方式,将代币分发给目标账户。

注:这里所说的token都是指ERC20 Token。 对于较新的token,比如ERC721 Token等,由于这方面已经做了优化以太坊合约教程,我们就不用这么大惊小怪了。

利用

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

大大节省了货币转移的资金成本。 显然,如果我们一次又一次地手动转币,数百次转账所需的 gas 成本会让你大吃一惊。 但是使用这个智能合约批量转币,一般来说一次可以完成200次左右,所以200次的转账手续费只需要交一次。 大大节省了货币转移的人工成本。 类似于支付费用成本,如果你必须手动转动它数百次,你可能会发疯。 有足够的需求。 前面说了新的ERC721 Token不需要我们这么大惊小怪,但是目前ERC20 Token几乎是大部分token的模板,所以需求足够大,也就是应用场景足够大。前置知识点合约调用合约授权转移方法合约调用合约

调用智能合约中的其他合约,需要了解抽象合约的概念,具体细节就好了。

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

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

因为我们只需要使用token的transferFrom方法,所以只需要声明这个方法即可。 请注意,它是一个没有函数体的空方法。

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

/**
    * calls the ERC20 token's transferFrom function
    * _token address The address of ERC20 token.
    * _dsts address The addresses which be air dropped.
    * _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++) {

以太坊智能合约编写_以太坊合约教程_siteqq.com 以太坊智能合约

token.transferFrom(msg.sender, _dsts[i], _values[i]); } }

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

这个函数可以做得更好:对于代码边际判断,我们可以判断_token和_dsts是否为合法账户,或者判断_values是否为合法正值,或者比较_dsts和_values数组长度是否相等(健壮的代码必须边际安全的)。 . . 还能改进得更好吗? 当然是可以的,比如我们添加一个Event事件供调用者监听,以便进行相应的处理。 . .

授权转让方式

那么上面的代码够了吗? 以上就是批量转账合约的核心代码。

但! 有一个前提!

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

这里引入授权转账的概念,还是以批量转账为例:

首先,我们要明确一点,如果你有1000个SIM token,那么这些token是你一个人的,谁也拿不走(别告诉我什么东西被偷了什么的,以后再天真点我们讲例子。。。)然后如果你什么都不做,想让转账合约转账你的 SIM 代币,显然这是不可能的,因为你拥有这些代币,而不是转账合约。

所以这个时候,你需要将你的 SIM 代币授权给转币合约。 至于授权多少,就看你要转多少了。 一旦你完成授权操作,代币转账合约就有权转账你的代币(等一下,我可以突然改变主意取消授权吗?可以,你可以重新授权,金额为零。)

案子

笔者之前花点时间做了一个网页,把批量转币的功能放在上面。 下面简单看一下整个过程,再结合示例图就更清楚了:)

获取代币信息

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

填写转币数量和账户

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

确认并空投

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

这是ERC20代币批量转账的交易记录:

Ropsten 交易 0x630b868e41ecfbd97273371ed33242439230355d9110095b814ae3029b88d829

扩张

这里给新手留个功课,如果想批量转ETH怎么办? 直接用上面的代码不太方便,但是思路是一样的,代码会更简洁~

附上批量转账到ETH的交易记录:

Ropsten 交易 0x4fcfc6245d7ffecfae7c02eb2f983f203806b83b5a1cf2fc0450a61d7c226401

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

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

这个在低版本的Solidity中可以正常使用,因为和上面的本质上是一样的,但是在高版本中放弃了这个用法,所以当我尝试在高版本中使用时,会出现批量传输coins every time 最后一个总是失败。 因此,推荐的方法是通过抽象合约调用其他合约的方法。

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