这一篇是正式建立DFarm DAO以来的第一篇文章了,本来这周不准备分享。但是感觉基础的一些知识可以先讲,大家先熟悉一下,所以今天就分享一下web3py跟智能合约交互的一些基础知识。
这部分都是非常简单的代码,希望大家尝试一下。
python、pycharm这些环境和开发工具大家自行安装即可,网上一搜都是教程,比我写的好很多,这部分内容不再赘述。
web3py文档:
web3py应该是python上跟智能合约交互最好用的包了,首先我们安装一下。
如果你是mac系统,直接使用:`pip install web3` 进行安装。
如果你是windows系统,则需要先装一下c++环境。
下载 vs_buildtools:
之后如图安装下面勾选的包,一定要装全,已包含和可选两部分你都要装!
安装好之后,重启电脑,再进行 `pip install web3` 即可。
我们新建一个py文件,开始编码吧~
from web3 import Web3, HTTPProvider
address = '0xxx'
rpc = 'https://bsc-dataseed1.binance.org:443'
web3 = Web3(HTTPProvider(rpc))
balance = web3.fromWei(web3.eth.getBalance(address), "ether")
print(balance)
这部分代码就是展示一个地址的ETH余额的代码。
开头一定要引用web的包。
address就是你的地址,这里填上即可。
rpc这个参数大家应该比较熟悉了,每个类evm的公链都有很多rpc,这里罗列一些,如果没有你需要的rpc,去谷歌搜索即可。
Ethereum | https://cloudflare-eth.com
BSC | https://bsc-dataseed1.binance.org:443
Ploygon | https://rpc-mainnet.matic.network
Fantom | https://rpcapi.fantom.network
当你不知道某公链的RPC,可以去chainlist搜索,链接小狐狸钱包即可很快速的添加你想要的公链RPC。
好了,我们继续说代码。后面就是实例化了web3。
调用了getBalance这方法去获取余额,这里只需要传入地址即可获取改地址的ETH余额。如果RPC是BSC的则是BNB余额。切换公链只需要修改RPC,其他都是一样的代码。
fromWei这个方法是进行了一下单位换算,ETH的最小单位为wei,1个ETH相当于10的8次方wei。通常,大家也使用Gwei作为展示单位。比较常用的就是eth,Gwei和wei。
最后我们打印出来balance,就可以看到我们的余额了。你可以找一个你的钱包去试试这段代码!
显示ETH余额完毕,下面来看看如何显示你的ERC-20 Token余额。
from web3 import Web3, HTTPProvider
import json
address = '0xxxx'
rpc = 'https://bsc-dataseed1.binance.org:443'
CAKE_BSC_ADDRESS = Web3.toChecksumAddress('合约地址')
CAKE_BSC_ABI = json.loads('这里需要粘贴一大段ABI')
web3 = Web3(HTTPProvider(rpc))
token_contract = web3.eth.contract(address=CAKE_BSC_ADDRESS, abi=CAKE_BSC_ABI)
balance = web3.fromWei(token_contract.functions.balanceOf(address).call(), "ether")
print(balance)
这段代码就是查询了一下钱包中的CAKE代币余额。
因为市面上的ERC20代币非常多,所以如果要查询代币余额,首先要有该代币的合约地址,代币合约地址我相信大部分人都会查询,可以查询自己的钱包记录,也可以去cmc等网站查询代币合约地址。
然后我们还需要一些代币的ABI,这个ABI如何找呢,我们可以通过代币地址的合约代码去查看。
以CAKE举例,我们打开智能合约地址:
可以下面找到合约的ABI,点击复制按钮即可复制,粘贴到我们的代码中即可。其实也有获取ABI的接口,这里就不讲了。
有了合约地址和ABI就可以实例化这个合约了,这就是参数token_contract。
token_contract.functions.balanceOf 这句话的意思就是调用了CAKE合约的balanceOf 方法,这个方法是CAKE的智能合约提供的,我们在区块链浏览器上也可以看到该方法。
看到这里你可能明白ABI的意义了,就是告诉你这个合约调用的方法和参数。
我们最后打印balance,即可看到自己CAKE的余额了。赶紧换成别的合约地址来试试吧~
转账这部分也分为两块,ETH转账和ERC20的Token转账。
def transfer_eth(target_address, amount, gas_price=5, gas_limit=21000):
nonce = web3.eth.getTransactionCount(address)
params = {
'nonce': nonce,
'to': target_address,
'value': web3.toWei(amount, 'ether'),
'gas': gas_limit,
'gasPrice': web3.toWei(gas_price, 'gwei'),
'from': address,
}
signed_tx = web3.eth.account.signTransaction(params, private_key=private_key)
tx_hash = web3.eth.sendRawTransaction(signed_tx.rawTransaction)
return tx_hash
这里我封装了一个transfer_eth方法,方便以后复用。
target_address就是转账目标的地址也就是收款方,amount就是转账数量,gas_price和
gas_limit是用来计算gas使用,BSC网络一般gas_price是5即可。其他网络gas费用浮动较大,需要查看当时的gas来填写。
首先我们获取nonce,nonce你可以理解为是你的钱包的一个顺序,我们可以按一定的顺序发送交易,也可以覆盖交易。
private_key参数就是你的钱包私钥。私钥可以通过imToken等钱包导出使用。一定要找一个不常用的钱包哦,因为复制私钥十分危险,一定要安全第一。
最后我们会获得一个tx_hash,这个就是区块链记录的哈希值了。我们可以等待交易成功后,查看该tx的记录。
def transfer_token(token_contract, target_address, amount, gas_price=5, gas_limit=500000):
params = {
"from": address,
"value": 0,
'gasPrice': web3.toWei(gas_price, 'gwei'),
"gas": gas_limit,
"nonce": web3.eth.getTransactionCount(address),
}
func = token_contract.functions.transfer(target_address, web3.toWei(amount, "ether"))
tx = func.buildTransaction(params)
signed_tx = web3.eth.account.sign_transaction(tx, private_key=private_key)
tx_hash = web3.eth.sendRawTransaction(signed_tx.rawTransaction)
return tx_hash
transfer_token这部分代码就是转账ERC20代币,看上去跟转ETH大同小异,只不过这里调用了代币合约的transfer方法。
以上转账的方法,我建议大家也跑一下。可以在以太坊的测试网络,测试网络领水之后就可以免费测试自己的代码。
这里推荐kovan测试网。
RPC:
领水地址:
可以领取0.1ETH和10LINK进行查询余额、转账的测试。
本系列教程刚刚开始编写,还有很多不足,希望大家多多包涵。
如有问题可以在discord内交流。
本篇文章大概在半个月后会免费公开到网络上。