我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何通过web3.py用Python存取Ethereum

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何通过web3.py用Python存取Ethereum

这篇文章主要介绍了如何通过web3.py用Python存取Ethereum的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何通过web3.py用Python存取Ethereum文章都会有所收获,下面我们一起来看看吧。

配置 web3.py 执行环境

web3.py 可以直接通过 pip 安装。

pip install web3

需注意的是,在 Windows 上想安装时,会需要事先安装 Visual C++ Builder,否则在安装的最后阶段会因为无法编译而失败。

通过 web3.py 连结 Ethereum 节点

web3.py 因为自身不会作为一个区块链的节点存在,因此它需要有一个节点用来存取区块链上的资料。一般来说最安全的方式应该是自己使用 geth 或者 parity 来自建节点,不过如果在不想要自建节点的状况时,可以考虑看看 infura 提供的 HTTP 节点服务。

以 infura 现在的 API 来说,如果要连结 Ropsten 测试链,连结的网址是 https://ropsten.infura.io/v3/api_key,其中 api_key 要去注册帐号才取得。以下的程序仿照了 web3.py 内建的 auto.infura 的作法,会从环境变数读取 INFURA_API_KEY 这个参数来组出 infura.io 的 HTTP 位址,用来建立跟 Ropsten 测试链的连线。

存取区块链上的 ERC20 合约
import osfrom web3 import (HTTPProvider,Web3,)INFURA_ROPSTEN_BASE_URL = 'https://ropsten.infura.io/v3'def load_infura_url():key = os.environ.get('INFURA_API_KEY', '')return "%s/%s" % (INFURA_ROPSTEN_BASE_URL, key)w3 = Web3(HTTPProvider(load_infura_url()))

在开始存取合约之前,需要先谈谈什么是 ABI 。在 Ethereum 中,因为合约都是以编译过的 binary code 形式存在,因此其实函数库没办法直接知道合约传输的内容到底是什么,因为合约的回传值全都是 binary。因此在操作合约之前,需要提供一份 ABI 文件,告诉函数库如何使用合约。

# Assume the contract we're going to invoke is a standard ERC20 contract.with open("erc20.abi.json") as f:erc20_abi = json.load(f)# Web3 accept only checksum address. So we should ensure the given address is a# checksum address before accessing the corresponding contract.contract_addr = w3.toChecksumAddress('0x4e470dc7321e84ca96fcaedd0c8abcebbaeb68c6');erc20_contract = w3.eth.contract(address=contract_addr, abi=erc20_abi)for func in erc20_contract.all_functions():logger.debug('contract functions: %s', func)logger.debug("Name of the token: %s", erc20_contract.functions.name().call())

这里假设我们想存取 Ropsten 测试链上位址是 0x4e470dc7321e84ca96fcaedd0c8abcebbaeb68c6 的智能合约。这个合约是透过 etherscan 随便找的某个 ERC20 的合约,因此可以用标准的 ERC20 的 ABI 来存取它。我们在建立这个合约的 instance 时,先跑一个回圈印出合约内所有的 function(这个步骤其实是在列出 ABI 上的信息),接着试着呼叫合约中的 name() 来取得这个合约宣告的代币名称。最后输出的内容如下:

2018-09-07 15:02:53,815 | __main__ | DEBUG | contract functions:2018-09-07 15:02:53,816 | __main__ | DEBUG | contract functions:2018-09-07 15:02:53,824 | __main__ | DEBUG | contract functions:2018-09-07 15:02:53,824 | __main__ | DEBUG | contract functions:2018-09-07 15:02:53,824 | __main__ | DEBUG | contract functions:2018-09-07 15:02:53,824 | __main__ | DEBUG | contract functions:2018-09-07 15:02:53,824 | __main__ | DEBUG | contract functions:2018-09-07 15:02:53,825 | __main__ | DEBUG | contract functions:2018-09-07 15:02:53,825 | __main__ | DEBUG | contract functions:2018-09-07 15:02:54,359 | __main__ | DEBUG | Name of the token: KyberNetwork
签署并送出交易

在上面的例子中,呼叫智能合约时是直接呼叫合约里的 function,但这一般只能用在读取区块链上的资料的状况。如果是想要通过呼叫智能合约来写入资料到区块链,就必须要用另一种方式来呼叫合约,也就是必须先签署交易,然后付 gas 去执行这个交易。

假设我们一样是要呼叫一个 ERC20 的合约,要执行合约上的 transferFrom() 这个函数。transferFrom() 需要三个参数 _from、 _to、 _value,表示要从 _from 帐号转帐给 _to 帐号,转帐金额是 _value。

# Set the account which makes the transaction.account = w3.toChecksumAddress(os.environ.get('ETHEREUM_ACCOUNT', ''))w3.eth.defaultAccount = account# Web3 accept only checksum address. So we should ensure the given address is a# checksum address before accessing the corresponding contract.contract_address = w3.toChecksumAddress('0x4e470dc7321e84ca96fcaedd0c8abcebbaeb68c6')contract = w3.eth.contract(address=contract_address, abi=contract_abi)# Prepare the necessary parameters for making a transaction on the blockchain.estimate_gas = contract.functions.transferFrom(account, account, w3.toWei('1', 'eth')).estimateGas()nonce = w3.eth.getTransactionCount(account)# Build the transaction.txn = contract.functions.transferFrom(account, account, w3.toWei('1', 'eth')).buildTransaction({'chainId': 3,'gas': estimate_gas,'gasPrice': w3.toWei('1', 'gwei'),'nonce': nonce})logger.debug('Transaction: %s', txn)# Sign the transaction.private_key = bytes.fromhex(os.environ.get('ETHEREUM_ACCOUNT_PKEY', ''))signed_txn = w3.eth.account.signTransaction(txn, private_key=private_key)tx_hash = w3.eth.sendRawTransaction(signed_txn.rawTransaction)logger.debug('Txhash: 0x%s', bytes.hex(tx_hash))

在上面的程序中,首先第 2 ~ 3 行先从环境变量中读取我们要使用的帐号,这个帐号将会用来发送交易,当然要付 gas 时也会从这个帐号扣。第 10 ~ 20 行建立一个原始交易(raw transaction),这个交易中因为我们需要自行指定包括 gas、nonce 等参数,因此需要在前面 11 ~ 12 行确认参数要设定多少。然后最重要的第 25 ~ 26 行读取私钥,并且用私钥去签署交易。这里假设私钥的组成会是用 Hex 编码的文字,所以使用 bytes.fromhex 把 Hex 编码转回成 byte 格式。签好以后就送出交易,送出交易时 API 会回传 byte 格式的交易的 transaction hash,可以把它编码后印出来,之后就可以去 etherscan 上查找这笔交易了。

关于“如何通过web3.py用Python存取Ethereum”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“如何通过web3.py用Python存取Ethereum”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何通过web3.py用Python存取Ethereum

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何通过web3.py用Python存取Ethereum

这篇文章主要介绍了如何通过web3.py用Python存取Ethereum的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何通过web3.py用Python存取Ethereum文章都会有所收获,下面我们一起来看
2023-07-06

python如何通过函数取差

小编给大家分享一下python如何通过函数取差,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!通过函数取差如下方法首先会应用一个给定的函数,然后再返回应用函数后结果
2023-06-27

python如何通过psutil获取服务器cpu、内存、磁盘使用率

这篇文章主要介绍了python通过psutil获取服务器cpu,内存,磁盘使用率,使用psutil,可以很方便地监控系统的运行状况,诊断问题和优化性能,需要的朋友可以参考下
2023-05-17

如何通过python获取甲流分布数据

这篇文章主要讲解了“如何通过python获取甲流分布数据”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何通过python获取甲流分布数据”吧!1、分析网页的网络数据,取得请求头,并用pyt
2023-07-05

如何通过python抓取二手房价数据

这篇文章主要讲解了“如何通过python抓取二手房价数据”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何通过python抓取二手房价数据”吧!模块安装同上次新房一样,这里需要安装以下模块(
2023-06-16

通过与Kubernetes Pod互动如何获取用户IP

学习知识要善于思考,思考,再思考!今天编程网小编就给大家带来《通过与Kubernetes Pod互动如何获取用户IP》,以下内容主要包含等知识点,如果你正在学习或准备学习Golang,就都不要错过本文啦~让我们一起来看看吧,能帮助到你就更好
通过与Kubernetes Pod互动如何获取用户IP
2024-04-04

python中如何通过opencv调用摄像头

这篇文章主要为大家展示了“python中如何通过opencv调用摄像头”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python中如何通过opencv调用摄像头”这篇文章吧。实例源码:#pip3
2023-06-15

如何通过php函数来减少内存的使用?

在开发中,内存的使用是一个很重要的考量因素。如果在程序中使用大量的内存,可能会导致运行速度变慢甚至程序崩溃。因此,合理地管理和减少内存的使用是每个PHP开发者都应该关注的问题。本文将介绍一些通过PHP函数来减少内存使用的方法,并提供具体的代
2023-10-21

如何通过PHP开发缓存提高用户体验

如何通过PHP开发缓存提高用户体验随着互联网的快速发展,用户体验成为网站开发中至关重要的一部分。而对于PHP开发者来说,一个有效的缓存策略可以提高网站的性能和用户体验。通过缓存,可以减少数据库访问次数,降低服务器负载,加快页面加载速度等。本
如何通过PHP开发缓存提高用户体验
2023-11-07

如何使用Node.js调用SQL存储过程并获取结果

Node.js作为一种服务器端JavaScript运行环境,已经成为了一种非常受欢迎的技术。对于Node.js的开发者来说,调用数据库存储过程是进行复杂数据库查询的一种有效方法。然而,与其他编程语言相比,Node.js如何正确地调用SQL存储过程?本文将介绍如何使用Node.js调用SQL存储过程并获取结果。# 连接数据库在使用Node.js连接数据库之前,需要安装相应的Nod
2023-05-14

MySQL的存储过程在Python中如何调用和执行?(Python如何调用并执行MySQL中的存储过程?)

Python中调用MySQL存储过程指南:使用MySQLdb或pymysql模块建立数据库连接。通过cursor.callproc方法调用存储过程,传递输入参数。使用fetchone()、fetchall()或fetchmany()获取结果集。存储过程提供可维护性、性能和安全性优势,但要注意调试和更新的挑战。
MySQL的存储过程在Python中如何调用和执行?(Python如何调用并执行MySQL中的存储过程?)
2024-04-02

Jmeter如何通过OS进程取样器调用Python脚本实现参数互传

这篇文章主要介绍了Jmeter如何通过OS进程取样器调用Python脚本实现参数互传,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、 Python中 sys.argv的用法
2023-06-29

Python如何通过xpath属性爬取豆瓣热映的电影信息

本篇文章给大家分享的是有关Python如何通过xpath属性爬取豆瓣热映的电影信息,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。前言声明一下:本文主要是研究使用,没有别的用途。
2023-06-25

如何在MySQL中使用Python编写存储过程

标题:MySQL中使用Python编写存储过程的示例及实践指南在MySQL中使用存储过程可以有效地将复杂的数据库操作封装起来,提高数据库的执行效率和安全性。本文将介绍如何使用Python编写MySQL的存储过程,并提供具体的代码示例供参考。
2023-10-22

Python如何通过Scrapy框架实现爬取百度新冠疫情数据

这篇文章主要介绍了Python如何通过Scrapy框架实现爬取百度新冠疫情数据,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。环境部署主要简单推荐一下插件推荐这里先推荐一个Go
2023-06-25

Python如何通过requests模块实现抓取王者荣耀全套皮肤

这篇文章主要为大家展示了“Python如何通过requests模块实现抓取王者荣耀全套皮肤”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Python如何通过requests模块实现抓取王者荣耀全
2023-06-25

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录