关于web3py的ETH(以太坊)真正实现批量转账开发的教程

看到网上很多关于以太坊批量转账的文章,都没有一篇完整的代码实例讲解一下关于ETH批量转账的实现,想当年我也是因为这样费了大量时间去从头开始了解ETH才搞定的,而有时候我们做开发的需求并不需要去精通一样东西,只需要知道怎么用就行,效率嘛,最重要,对吧,而有可能因为效率耽误了进程而被领导批头一顿大骂,一天心情都没了,还怎么好好工作对吧。

看图这肯定是你们需要的,我是基于eth ropsten测试。
ropsten.etherscan.io/tx/0xe382252b45073788e015d6d7e3e4847cef540ed24fa0e4c3ec43f8adaf4cd210


image.png

图中从form转账转入多个地址to里面实现了3笔转账,实际消耗0.2退回0.78多余不用的
好了,需求分析完毕,我们开始

首先要做eth开发,你得先了解web3.js,你想要开发智能合约得了解solidity,你想用python开发eth得了解web3py,你想要搭建私链得了解geth、以太坊的网络和parity
至于详细的解说我这里就不啰嗦了,你都搜索到批量转账了说明你已经有一定开发基础了。

至于从solidity智能合约编译到部署到调用,我这里就懒得讲了,网上有更多详细的教程。

这里有一个歪果仁开源的一套批量转账dapp,里面有详细的eth转账和token代币转账的代码实现,可以去参考,它也有详细的说明文档,还打包成了DAPP供你测试
github.com/rstormsf/multisender

而它是基于we3.js开发的,这里我们主要讲web3py的开发,开发我们需要测试账户,需要ETH余额,还有用于we3连接的私链节点。

这里我使用的是infura的ropsten测试网络

至于测试账户,我使用的是Metamask metamask.io插件
ropsten需要领取测试币,领取方法


image.png

点击右上角的头像,创建账户,或者选择默认账户
点中间选择 ropsten测试网络
点击Buy按钮


image.png

点击获取记得得到测试币,每次一个,最多5个

好了,账户有了,我们还需要转账的私钥


image.png

点击右边的...竖着的3个点,即可查看账户详情
然后导出私钥即可

接下来就是使用we3py实现转账操作,直接上代码

#!/usr/bin/python3
# -*- coding: utf-8 -*-

from web3 import Web3
import json

#这里我使用的是infura的ropsten测试网络
web3 = Web3(Web3.HTTPProvider("https://ropsten.infura.io/v3/cf9f29fb4f674714be8047085920bbd9"))

# Metamask转账账户
fromAddress = web3.toChecksumAddress("0xa22fAF9Ad34c9B7b7dFc1520CBffc3fe4dEe1EE8")
# Metamask账户私钥
private_key = "0x6442818855fd7dc3429351a8c35fee52245a26880e5e0ea638fa69322a9fe781"

# 定义批量转账合约
multiSenderAddr = web3.toChecksumAddress("0xa5025faba6e70b84f74e9b1113e5f7f4e7f4859f")
multiSenderAbi = []
with open("./abis/StormMultisender.json", 'r', encoding='utf8') as data:
    multiSenderAbi = json.load(data)

#定义智能合约对象
multi_sender = web3.eth.contract(address=multiSenderAddr, abi=multiSenderAbi)

#取得当前汽体价格
gas_price = web3.eth.gasPrice
# 取得转账账户的交易nonce数据
nonce = web3.eth.getTransactionCount(fromAddress)

# 转账eth
addresses_to_send = ["0x5844de50Cf99F95ca073AC7B205f9C0C75E827A8", "0x8775039fCa840bde05519E4a743B2973F3C30B24"]
balances_to_send = [web3.toWei(0.1, "ether"), web3.toWei(0.1, "ether")]

# 构建交易数据
txn = multi_sender.functions.multisendEther(addresses_to_send, balances_to_send).buildTransaction({
    "from": fromAddress,
    "gasPrice": web3.toHex(web3.toWei(90, "Gwei")),# 指定汽体价格
    "gas": web3.toHex(210000),# 限制使用汽体最大量
    "value": web3.toHex(web3.toWei(1, "ether")),# 发送总额必须大于转账金额+手续费否则会打包失败
    "nonce": nonce # 防重放nonce,这个是必须的
})
print(txn)

# 发送交易
signed_txn = web3.eth.account.signTransaction(txn, private_key=private_key)
# 发送到网络打包,如果报错 already known 就是上一笔交易正在打包,需要打包完成才能下一笔
web3.eth.sendRawTransaction(signed_txn.rawTransaction)

# 取得转账哈希
txhash = web3.toHex(web3.sha3(signed_txn.rawTransaction))

# 打印交易哈希类似 0xe382252b45073788e015d6d7e3e4847cef540ed24fa0e4c3ec43f8adaf4cd210
print(txhash)

代码里需要注意一下,./abis/StormMultisender.json这个文件是该智能合约得ABI数据,获得方式在它的github源码里github.com/rstormsf/multisender/tree/master/src/abis
也可以通过ropsten.etherscan.io浏览器查询0xa5025faba6e70b84f74e9b1113e5f7f4e7f4859f这个地址获得合约得ABI

还需要注意buildTransaction里的参数value的转账数量必须大于你批量转账的数量并加上可能消耗的eth手续费,否则会打包失败
可以在构建交易数据 txn之前加入以下代码计算可能消耗的 gas

# 构建转账数据
encodedData = multi_sender.encodeABI(fn_name="multisendToken",args=[token_address, addresses_to_send, balances_to_send])

# 取得需要消耗的汽体,这里时灵时不灵,经常报错
gas = web3.eth.estimateGas({
    "from": fromAddress,
    "data": encodedData,
    "value": web3.toHex(web3.toWei(0.1, "ether")),
    "to": multiSenderAddr
})

这里合约是使用它已经部署好的合约地址进行测试,有兴趣自己编译合约并上线部署成自己专用合约的可以参考它的源码目录下 multisender/contracts/flats/UpgradebleStormSender_flat.sol
这个文件,然后拷贝到remix.ethereum.org 编译测试,参考其multisendToken和multisendEther这两个方法

©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容