# web3py第一课:web3合约交互基础部分 **Published by:** [ourens.eth](https://paragraph.com/@ourens/) **Published on:** 2022-01-02 **URL:** https://paragraph.com/@ourens/web3py-web3 ## Content 这一篇是正式建立DFarm DAO以来的第一篇文章了,本来这周不准备分享。但是感觉基础的一些知识可以先讲,大家先熟悉一下,所以今天就分享一下web3py跟智能合约交互的一些基础知识。 这部分都是非常简单的代码,希望大家尝试一下。安装python、pycharm这些环境和开发工具大家自行安装即可,网上一搜都是教程,比我写的好很多,这部分内容不再赘述。 web3py文档: https://web3py.readthedocs.io/en/stable/index.html web3py应该是python上跟智能合约交互最好用的包了,首先我们安装一下。 如果你是mac系统,直接使用:`pip install web3` 进行安装。 如果你是windows系统,则需要先装一下c++环境。 下载 vs_buildtools: https://visualstudio.microsoft.com/zh-hant/thank-you-downloading-visual-studio/?sku=BuildTools&rel=16 之后如图安装下面勾选的包,一定要装全,已包含和可选两部分你都要装!安装好之后,重启电脑,再进行 `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。 https://chainlist.org/ 好了,我们继续说代码。后面就是实例化了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举例,我们打开智能合约地址: https://bscscan.com/address/0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82#code可以下面找到合约的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: https://kovan.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161 领水地址: https://faucets.chain.link/kovan 可以领取0.1ETH和10LINK进行查询余额、转账的测试。最后本系列教程刚刚开始编写,还有很多不足,希望大家多多包涵。 如有问题可以在discord内交流。 本篇文章大概在半个月后会免费公开到网络上。 ## Publication Information - [ourens.eth](https://paragraph.com/@ourens/): Publication homepage - [All Posts](https://paragraph.com/@ourens/): More posts from this publication - [RSS Feed](https://api.paragraph.com/blogs/rss/@ourens): Subscribe to updates