IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> web3-python:使用python调用智能合约交互 -> 正文阅读

[网络协议]web3-python:使用python调用智能合约交互

安装

python、pycharm这些环境和开发工具大家自行安装即可,网上一搜都是教程,比我写的好很多,这部分内容不再赘述。
web3py文档:https://web3py.readthedocs.io/en/stable/index.html
web3py应该是python上跟智能合约交互最好用的包了,首先我们安装一下。

直接使用: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。
gwei
最后我们打印出来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进行查询余额、转账的测试。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-02-04 11:22:00  更:2022-02-04 11:22:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:27:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码