# web3py第一课：web3合约交互基础部分 — Mirror

By [ourens.eth](https://paragraph.com/@ourens) · 2022-01-01

---

这一篇是正式建立DFarm DAO以来的第一篇文章了，本来这周不准备分享。但是感觉基础的一些知识可以先讲，大家先熟悉一下，所以今天就分享一下web3py跟智能合约交互的一些基础知识。

这部分都是非常简单的代码，希望大家尝试一下。

安装
--

python、pycharm这些环境和开发工具大家自行安装即可，网上一搜都是教程，比我写的好很多，这部分内容不再赘述。

web3py文档：

web3py应该是python上跟智能合约交互最好用的包了，首先我们安装一下。

如果你是mac系统，直接使用：\`pip install web3\` 进行安装。

如果你是windows系统，则需要先装一下c++环境。

下载 vs\_buildtools：

之后如图安装下面勾选的包，一定要装全，已包含和可选两部分你都要装！

![](https://storage.googleapis.com/papyrus_images/b88db1e1f7893c9fa5530b85e656273b4bb9f3da0f6aae24e4228aa23511c8aa.png)

安装好之后，重启电脑，再进行 \`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](https://cloudflare-eth.com/)

BSC | [https://bsc-dataseed1.binance.org:443](https://bsc-dataseed1.binance.org/)

Ploygon | [https://rpc-mainnet.matic.network](https://rpc-mainnet.matic.network/)

Fantom | [https://rpcapi.fantom.network](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。

![](https://storage.googleapis.com/papyrus_images/289169e81e9d3f943032b5711ac96c7076890fd9359c9842f0cb04f77e64ebf0.png)

最后我们打印出来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://storage.googleapis.com/papyrus_images/53e11ba223cfc950ce4d12802c3e7038c947b437fdf6d2ba6e9b5fe51f8bc323.png)

可以下面找到合约的ABI，点击复制按钮即可复制，粘贴到我们的代码中即可。其实也有获取ABI的接口，这里就不讲了。

有了合约地址和ABI就可以实例化这个合约了，这就是参数token\_contract。

token\_contract.functions.balanceOf 这句话的意思就是调用了CAKE合约的balanceOf 方法，这个方法是CAKE的智能合约提供的，我们在区块链浏览器上也可以看到该方法。

![](https://storage.googleapis.com/papyrus_images/91b2e55ae73d5da42e96d25937330c9d1d52b042ed6cd05b321532961a8aff48.png)

看到这里你可能明白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内交流。

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

---

*Originally published on [ourens.eth](https://paragraph.com/@ourens/web3py-web3-mirror)*
