web3py第一课:web3合约交互基础部分

这一篇是正式建立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内交流。

本篇文章大概在半个月后会免费公开到网络上。

Subscribe to 0xD42F…E7B6
Receive the latest updates directly to your inbox.
Verification
This entry has been permanently stored onchain and signed by its creator.