《我学区块链》—— 三十六、以太坊批量转账(空投)节省费用
三十五、智能合约收发 ETH 详解
前段时间 fcoin 的空投把 eth 堵得不成样,看见好几个空投竟然是一个个地 transfer转账,但是实际上如果用合约实现批量转账,不管是成功率还是效率都会高很多,还省 gas。
整个过程的模型如下:
一、空投合约
本文讲解如何用合约实现批量转账,下面直接上合约。
pragma solidity ^0.4.23;contract Airdrop {function transfer(address from, address caddress, address[] _tos, uint v) public returns (bool) {require(_tos.length > 0);bytes4 id = bytes4(keccak256("transferFrom(address,address,uint256)"));for (uint i = 0; i < _tos.length; i++) {require(caddress.call(id, from, _tos[i], v));}return true;}
}
代码不复杂,最关键的一点是用到了 solidity 中对地址的操作,在合约中 call 另一个合约,首先得知道要调用的是哪一个函数,因为是批量转账,这里用 transferFrom 函数,为什么不用 transfer 呢?因为这里发起交易的主体是合约地址,而不是原来的账户地址,我们可以看看 transfer 函数和 transferFrom 函数有什么不同
function transfer(address _recipient, uint256 _value) onlyPayloadSize(2 * 32) public {require(balances[msg.sender] >= _value && _value > 0);balances[msg.sender] -= _value;balances[_recipient] += _value;Transfer(msg.sender, _recipient, _value);
}
function transferFrom(address _from, address _to, uint256 _value) public {require(balances[_from] >= _value && allowed[_from][msg.sender] >= _value && _value > 0);balances[_to] += _value;balances[_from] -= _value;allowed[_from][msg.sender] -= _value;Transfer(_from, _to, _value);
}
让合约实现代币转账首先需要做得是让合约得到操纵一定量代币的权利,可以看到transfer 函数首先检查地址的余额,意味着要让合约替你转账,你得先转给它一部分代币才行,但让合约直接拥有代币是不太安全的,而 transferFrom 就不同了,它检查的是授信额度,意思是你只需要先授信给合约它能操纵的代币数量,这样的好处是降低风险。
二、代币合约
另外,再准备一份代币合约。
pragma solidity ^0.4.23;import 'zeppelin-solidity/contracts/token/ERC20/MintableToken.sol';contract XToken is MintableToken {string public name = "X Token";string public symbol = "XTH";uint8 public decimals = 8;uint public INITIAL_SUPPLY = 10 ** 11; // equal 10 ^ 11, 1000亿constructor() public {totalSupply_ = INITIAL_SUPPLY * 10 ** uint256(decimals);balances[owner] = totalSupply_;}/*** 覆盖 Ownable -> transferOwnership 方法.*/function transferOwnership(address _newOwner) public onlyOwner {balances[_newOwner] = balances[owner].add(balances[_newOwner]); // Owner 余额要转移给 新所有者。balances[owner] = 0; // 清空旧所有人余额。super._transferOwnership(_newOwner);}
}
三、发布合约
笔者的合约是由 truffle 构建的,在部署文件中配置好两份合约,并发布到网络中。
var XToken = artifacts.require("XToken");
var Airdrop = artifacts.require("Airdrop");module.exports = function(deployer) {deployer.deploy(XToken);deployer.deploy(Airdrop);
};
发布合约
truffle migrate --reset
四、授权额度
编写 node 脚本,执行授权。
#!/usr/bin/env nodeconst fs = require('fs');
const Web3 = require('web3');
const web3 = new Web3('http://127.0.0.1:8545/');
const json = JSON.parse(fs.readFileSync('build/contracts/NPToken.json'));/*** Code: approve(c99, Airdrop.sol, 1000 eth)*/
let code = web3.eth.abi.encodeFunctionCall({name: 'approve',type: 'function',inputs: [{type: 'address',name: '_spender'}, {type: 'uint256',name: '_value'}]
}, ['{airdroip address}', '1000000000000000000000']);/*** ETH 合约调用*/
web3.eth.accounts.signTransaction({to: '{airdrop address}',value: '0', // 0 ethergas: '21000', // 21000 个gasPrice: '5000000000', // 5 gweidata: code
}, '{private-key}').then(res => {web3.eth.sendSignedTransaction(res.rawTransaction).on('transactionHash', hash => {console.log('### hash: ' + hash);}).on('receipt', receipt => {console.log('### receipt: ' + JSON.stringify(receipt));}).on('confirmation', (confirmationNumber, receipt) => {console.log('### confirmation: ' + confirmationNumber);}).on('error', err => {console.error('### error: ' + err);});});
修改脚本中的 private-key、airdrop-address 等信息,并执行脚本,进行授权。
node airdrop.js
五、批量空投
修改上面脚本中的 let code 值为:
let code = web3.eth.abi.encodeFunctionCall({name: 'transfer',type: 'function',inputs: [{type: 'address',name: 'from'}, {type: 'address',name: 'caddress'}, {type: 'address[]',name: '_tos'}, {type: 'uint256',name: 'v'}]
}, ['{XTH-owner-address}','{airdrop-address}',['0x25387B.....fFdEEcBb','0x25387B.....fFdEEcBb','0x25387B.....fFdEEcBb','0x25387B.....fFdEEcBb','0x25387B.....fFdEEcBb','0x25387B.....fFdEEcBb','0x25387B.....fFdEEcBb','0x25387B.....fFdEEcBb','0x25387B.....fFdEEcBb','0x25387B.....fFdEEcBb',],'1000000000000000']);
注意修改其中的 XTH-owner-address,airdrop-address,以及后面要批量空投的地址。
执行脚本即可开始批量空投。
六、验证结果
下面笔者记录的一组数据。
笔数 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
GAS(个数) | 51871 | 85016 | 92168 | 114320 | 136472 | 158624 | 180776 | 202928 | 225080 |
GAS平均 | 51871 | 42508 | 30723 | 28580 | 27294 | 26437 | 25825 | 25366 | 25009 |
绘制出如下图形
经分析可知,虽然以太坊原币交易的标准费用为 21000 gas,但代币交易的费用却要 51871 gas,且当使用批量空投合约时,批量数 > 3 后,每增加一笔,费用增加 22152 gas。
参考资料:https://blog.csdn.net/qq_35513792/article/details/81116241
《我学区块链》—— 三十六、以太坊批量转账(空投)节省费用相关推荐
- 从零开发区块链应用(十五)--以太坊交易匹配查询
文章目录 一.获取区块内交易 1.1 获取最新区块中的交易详情 1.2 获取指定区块中的交易详情 二. 获取匹配交易回执主要信息 三.获取区块内交易数量 一.获取区块内交易 1.1 获取最新区块中的交 ...
- 从零开发区块链应用(十二)--以太坊余额查询
文章目录 一.账户状态stateTrie 1.2 查询余额代码思路 1.3 余额查询流程 二.获取账户余额 2.1 代码解析 2.2 完整代码 三.获取账户代币余额 一.账户状态stateTrie B ...
- 视频教程-区块链项目:基于以太坊开发拍卖系统DApp教程(含资料)-区块链
区块链项目:基于以太坊开发拍卖系统DApp教程(含资料) 张长志技术全才.擅长领域:区块链.大数据.Java等.10余年软件研发及企业培训经验,曾为多家大型企业提供企业内训如中石化,中国联通,中国移动 ...
- 区块链技术--Ethereum(以太坊)
以太坊项目进一步扩展了区块链网络的能力,从交易延伸为智能合约(Smart Contract) 其官网首页为 ethereum.org. 简介 根据以太坊官方的宣称,以太坊(Ethereum)目标是打造 ...
- 区块链开发之搭建以太坊私有链
(一)区块链开发之搭建以太坊私有链 本文链接:https://blog.csdn.net/rwdxll/article/details/82929417 1.安装ethereum/Go client( ...
- 区块链应用 - 博世的以太坊汽车充电站
2019独角兽企业重金招聘Python工程师标准>>> 德国汽配巨头博世(Bosch)近日测试了基于以太坊区块链的汽车充电站项目,为电动汽车的充电提出了新的愿景. 根据博世CEO V ...
- 区块链2.0应用——以太坊
以太坊 以太坊是采用区块链 2.0 技术实现的产品,它的出现是为了解决比特币系统的不足. 比特币的不足 比特币的出区块时间是 10 分钟,换算出来仅仅支持全球单秒 7-8 比交易,影响交易速度. 比特 ...
- 区块链游戏项目(战舰游戏)基于layer2区块链技术,使用以太坊的solidity语言, 含全栈完整源码
这里介绍一个基于区块链以太坊开发的战舰游戏项目.做这个项目的初衷是对layer2区块链技术的proof-of-concept.因此,本项目是一个可以在每一个人的电脑上面执行的demo.为了让大家也能执 ...
- 《我学区块链》—— 十四、以太坊安全之 太阳风暴
十四.以太坊安全之 太阳风暴 2016年6月20日,以太坊用于开发智能合约的静态语言 Solidity,被发现了一个安全漏洞,它可以影响整个以太坊,而不仅仅是 DAO. 回顾DAO漏洞 还记得DAO漏 ...
最新文章
- 残差神经网络究竟在干啥?
- 了解GAN背后的设计,训练,损失函数和算法
- TIBCO宣布接近达成收购LogLogic
- 首个进入Gartner领导者象限的中国数据库要开发布会了!
- 计算机组成要素三:时序逻辑:构建计算机随机存取单元RAM及计数器PC
- 图像融合亮度一致_重磅干货低光图像处理方案
- 传奇霸业维护服务器,37传奇霸业8月18日部分区服维护计划
- STATS 4014 Advanced Data Science
- Jw-alipay 1.0.0版本发布,开源支付窗管理平台
- 纪念一个曾经的产品(目录)
- word2vec原理CBOW与Skip-Gram模型基础
- android adl格式转换,ADl871型模/数转换器的应用
- SocksCapV2+Socks2HTTP
- win7修复计算机消失,详细教您win7 aero效果消失了怎么恢复
- keyshot可以打开mtl文件吗_KeyShot:bip文件是什么?bip文件用什么打开?
- 基于linkboy+GD32编程实现多种屏幕显示效果(LCD1602、LCD12864、彩屏)
- Shell显示系统时间的全年日
- 呼叫中心新座席必修课
- 互斥锁Mutex解锁两次
- sql 创建表,批量插入数据