从零到英雄:使用Infura和Python学习开发Web3

2023-05-26 0 586

原副标题:从零到英雄人物:选用Infura和Python自学合作开发Web3

翻译者 | 汝龙

将从合作开发者Alvin Lee的视角来探讨怎样自学合作开发Web3,虽然他合作开发训练有素,但是在合作开发Web3方面则是一位初学者。责任编辑将了解Web3合作开发的必要条件,怎样选用Python通过Web3的世界顶级API服务Infura出访区块链,最后介绍用作管理工作手提包的两个单纯工程项目。

从零到英雄:使用Infura和Python学习开发Web3

怎样已经开始

尽管Alvin Lee从20世纪90年代末就已经开始展开程式设计,但在Web3世界里,他看似一位初学者。他并不是研究者,所以不能企图说明Web3基本概念。但市售有很多较好的手册和讲义,因而他建议从Infura文件格式已经开始,它非常全面性且更易认知。

假如选用者讨厌更交互的自学形式,也能从技术街道社区获得支持。

现在,自学Web3先从许多基本知识已经开始。首先须要建立两个Infura帐户,两个储存身份验证货币的手提包,当然还须要许多钱。

建立Infura帐户

Infura公司是区块链API和合作开发者选用辅助工具的服务供应商。这意味著假如服务供应商想出访区块链,不须要自己运转节点。与恰好相反,只需选用两个亲善的API,Infura就会完成所有紧迫的工作。Infura全然免费并且安全可靠,因为它不能储存选用者的私钥,也无法修正其交易或贝阿尔恩县放它们。

选用者能全然免费收款,不须要选用网银。

建立Infura工程项目

建立工程项目是事情显得有意思的地方。每一工程项目都有两个API私钥,用作标记它并容许选用者选用Infura,选用者能按照说明展开操作。

增设身份验证手提包

下两个痛点是增设身份验证手提包。在区块链环境中,身份验证手提包所持的银行存款全然由几组位数私钥掌控,因而没有简而言之的个人帐户使用权,每一账号都有两个私钥(在区块链中由此可见)和两个掌控该账号的私钥。所持私钥的选用者全然掌控了两个帐户。选用者还能将数个账号作为几组私钥展开管理工作。身份验证手提包为选用者提供了一种安全可靠的形式来管理工作其账号/私钥以及其他好处,例如便利性、便携性和兼容性。

Infura推荐选用MetaMask,选用者能将MetaMask作为浏览器扩展安装。

在增设身份验证手提包之后,能已经开始探讨怎样赚钱。

怎样赚钱

区块链不是全然免费选用的,身份验证货币经济学须要投入更多的资金。单纯地说,每笔交易都要支出费用。假如想尝试区块链技术则须要投入资金。幸运的是,对于合作开发者来说,有许多测试网络能全然免费获得测试资金,虽然不能用它来换取真实的货币,但是能用它来合作开发和测试Web3应用程序。

Alvin Lee在这个工程项目中选用了测试网Sepolia。他能通过faucet站点从Sepolia获得测试ETH(ETH是以太坊的原生身份验证货币,能用它来支付以太坊网络上的交易。而测试ETH是以太坊合作开发的必要条件) 。

faucet站点能将少量的测试网ETH转移到身份验证手提包中。faucet站点要求选用者挖矿来赚钱,有些会定期给选用者许多钱。Alvin Lee成功地选用了ConsenSys Sepolia faucet,它每天向两个地址发送0.5个Sepolia ETH。

在介绍了这些基本知识之后,以下了解Infura API。

出访Infura API

Infura通过HTTPS(REST)和WebSockets提供了两个JSON-RPC API。它有几个类别,选用者能通过许多文章了解关于它们的内容。

此外,Infura API支持多种不同的网络。每一网络都有自己的https端点,能在出访API时将其用作基本URL。

以下是以太坊的端点:

(1)Mainnet

以太坊主网JSON-RPC基于HTTPS—https://mainnet.infura.io/v3/<API-KEY> 以太坊主网JSON-RPC基于WebSocket — wss://mainnet.infura.io/ws/v3/<API-KEY>

(2)Goerli

以太坊Goerli测试网JSON-RPC基于 HTTPS— https://goerli.infura.io/v3/<API-KEY> 以太坊Goerli测试网JSON-RPC基于WebSocket—wss://goerli.infura.io/ws/v3/<API-KEY>

(3)Sepolia

以太坊Sepolia测试网JSON-RPC 基于HTTPS—https://sepolia.infura.io/v3/<API-KEY> 以太坊Sepolia测试网JSON-RPC基于WebSocket—wss://sepolia.infura.io/ws/v3/<API-KEY>

将Infura API私钥和API私钥秘密储存在环境变量中,单纯地称为:INFURA_API_KEY和INFURA_API_KEY_SECRET。还将MetaMask手提包的私钥储存在两个名为SEPOLIA_ACCOUNT的环境变量中。

curl命令如下:

复制

$ curl –user ${INFURA_API_KEY}:${INFURA_API_KEY_SECRET} \

-X POST \

-H “Content-Type: application/json” \

–data {“jsonrpc”:”2.0″,”method”:”eth_getBalance”,”params”:[“”${SEPOLIA_ACCOUNT}””,”latest”],”id”:1} \

https://sepolia.infura.io/v3/${INFURA_API_KEY}

a{“jsonrpc”:”2.0″,”id”:1,”result”:”0x1d7e6e62f1523600″}

正如人们所见,这有两个巨大的银行存款0x1d7e6e62f1523600!!!!但不必太兴奋,其平衡单位是Wei。1个ETH等于1018Wei。假如计算一下位数,能看到帐户里有2个多一点的ETH。当然,这都是测试网络的钱。

须要注意的是,在这里不须要选用账号私钥来检查银行存款。任何人都能查看区块链中任何帐户的银行存款,而账号银行存款并不是敏感信息。但是,账号和所持私钥的人的身份是敏感和机密的。

在直接访问Infura API时有着较好的体验,接下来须要编写许多代码。

选用Python合作开发Web3

Web3生态系统支持多种程式设计语言。能从JavaScript(web3.js和ethers.js)、Golang和Python(web3.py)中的流行库出访Infura API。

选择辅助工具:web3.py

虽然现在大多数代码都是用JavaScript/Node.js和Ruby编写的,但在自学新主题时,Python是较好的选择。web3.py库看起来功能强大、成熟且文件格式齐全。所以Alvin Lee决定选择web3.py。

选择目标:身份验证手提包管理工作器

Web3的世界可能是压倒性的:交易、智能合约、IPFS、DAO(去中心化自治组织)、DeFi(去中心化金融)和NFT。Alvin Lee决定为这个Web3测试工程项目选择两个单纯的身份验证手提包管理工作器概念。身份验证手提包管理工作器是一种“hello web3 world”工程项目,因为它

web3-test dApp(去中心化应用)

这些代码能在Github上找到。

选用Poetry来构建应用程序。自述文件提供了一步一步的增设说明。

在深入研究代码之前,先运转一下程序,看看会发生什么:

复制

$ poetry run python main.py

balance before transaction: 2.1252574454

send 20,000 gwei to 0xea4d57b2dd421c5bfc893d126ec15bc42b3d0bcd (Sepolia faucet account)

balance after transaction: 2.125184945399832

正如人们所看到的那样,Alvin Lee的银行存款最初是略高于2个testnet ETH。然后,将20,000 Gwei(即200亿Wei)发送到最初获得资金的Sepolia faucet帐户。它几乎没有影响资金平衡。这正好说明Wei是两个多么小的单位。

这个代码非常单纯。只有两个名为main.py的文件。该文件包含两个main()函数和两个WalletManager类。先从main()函数已经开始,它是程序的入口点。

main()函数不接受命令行参数或配置文件。一切都是为了单纯而硬编码的。首先,该函数实例化WalletManager类,然后定义Sepolia faucet账号的私钥。现在已经开始行动。该函数通过调用WalletManager的get_bala额。

复制

def main():

wm = WalletManager()

sepolia_faucet_account = wm.w3.toChecksumAddress(0xea4d57b2dd421c5bfc893d126ec15bc42b3d0bcd)

balance = str(wm.get_balance(ether))

print(fbalance before transaction: {balance})

print(fsend 20,000 gwei to {sepolia_faucet_account} (Sepolia faucet account))

wm.send_eth(sepolia_faucet_account, 20000, gwei)

balance = str(wm.get_balance(ether))

print(fbalance after transaction: {balance})

if __name__ == __main__:

main()

然后看一下WalletManager类。它有四种方法:

复制

·__init__(),

·__create_web3_instance()

·get_balance()

·sent_eth()

方法1:__init__()

以下逐一展开了解。__init__()方法作为构造函数,它首先调用__create_web3_instance()方法,并将结果储存在两个名为w3的变量中。然后__init__()提取几个环境变量并储存它们。它继续计算许多Gas费用(Gas是区块链运转的燃料)和给验证交易的人员的奖励。

它还储存链ID,用于标记Sepolia测试网(在本例中)。稍后在向Sepolia测试网发送交易时,将须要这个ID。

复制

Import

import os

import web3

class WalletManager:

def __init__(self):

self.w3 = self.__create_web3_instance()

self.account = os.environ[‘SEPOLIA_ACCOUNT’]

self.account_private_key = os.environ[‘METAMASK_PRIVATE_KEY’]

self.max_fee_per_gas = self.w3.toWei(‘250’, ‘gwei’)

self.max_priority_fee_per_gas = self.w3.eth.max_priority_fee

self.chain_id = self.w3.eth.chain_id

方法2:__create_web3_instance()

能了解__create_web3_instance()方法内部发生了什么。

__create_web3_instance()是两个静点,然后用所有信息实例化了Web3库中的两个Web3对象。这个对象将容许通过两个方便的Python接口调用Infura API(而不是构造JSON-RPC请求并解析结果)。

复制

@staticmethod

def __create_web3_instance():

infura_api_key = os.environ[INFURA_API_KEY]

infura_api_key_secret = os.environ[INFURA_API_KEY_SECRET]

data = f{infura_api_key}:{infura_api_key_secret}.encode(ascii)

basic_auth_token = .b64encode(data).strip().decode(utf-8)

infura_sepolia_endpoint = fhttps://sepolia.infura.io/v3/{infura_api_key}

headers = dict(Authorization=fBasic {basic_auth_token})

return web3.Web3(web3.HTTPProvider(infura_sepolia_endpoint, request_kwargs=dict(headers=headers)))

方法3:get_balance()

下两个是get_balance()方法。

这是一种极其单纯的方法。它只调用Web3对象的w3.eth.get_balance()方法并传递账号。eth.get_balance()总是返回Wei的结果,Wei通常太小。而这种方法提供了将结果转换为另一种面额(例如Gwei或Ether)的选项。它通过调用Web3实例再次提供的w3.fromWei()方法来实现。须要注意的是,不必选用私钥来检查银行存款。

复制

balance = self.w3.eth.get_balance(selpytf.account)

if unit != wei:

return self.w3.fromWei(balance, unit)

方法4:send_eth()

最后但同样重要的是send_eth()方法。这里有很多内容,所以能将其分成数个块。

once。nonce容许在须要时覆盖挂起的交易。

复制

def send_eth(self, target_account, amount, unit=wei):

if unit != wei:

amount = self.w3.toWei(amount, unit)

nonce = self.w3.eth.get_transaction_count(self.account)

接下来,它构造两个交易对象。最重要的字段是from(身份验证手提包的帐户)、to(交易的接收者)和value(要发送多少钱)。然后,还要决定支付多少Gas,Gas越多,验证器包含交易的可能性就越大。chainId标记运转这一交易的网络和几个管理工作字段(空数据和类型)。

复制

tx = {nonce: nonce,

maxFeePerGas: self.max_fee_per_gas,

maxPriorityFeePerGas: self.max_priority_fee_per_gas,

from: self.account,

to: target_account,

value: amount,

data: b,

type: 2,

chainId: self.chain_id}

tx[gas] = self.w3.eth.estimate_gas(tx)

这里有一笔交易,能发送吗?先不要这么快发送。首先,须要选用私钥签名。这是防止其他人从选用者的帐户转账的原因。选用私钥签署交易容许验证器确认私钥与账号的私钥相对应。

复制

signed_tx = self.w3.eth.account.sign_transaction(tx, self.account_private_key)

现在能将交易作为原始交易发送。这意味著Infura永远不能看到选用者的私钥,它不能改变交易或将其转账到另两个帐户。这就是区块链的魔力。在发送交易后,返回两个哈希码并等待交易完成。假如结果的状态为1,则一切正常。假如不是,代码将引发异常。

复制

tx_hash = self.w3.eth.send_raw_transaction(signed_tx.rawTransaction)

result = self.w3.eth.wait_for_transaction_receipt(tx_hash)

if result[status] != 1:

raise RuntimeError(transaction failed: {tx_hash})

这就是以一种非常基本但安全可靠的形式与区块链交互所须要的全部内容。

结论:用Infura已经开始Web3之旅

即使对于一位训练有素的程序员来说,从头开始进入Web3的世界也可能令人望而生畏。而在逐步的自学中学到了很多技巧。在大多数情况下,人们知道自己还有很多内容要学。Infura通过提供可靠的API、出色的指导以及与生态系统的其他组件(例如MetaMask和web3.py库)的强大集成,使其显得单纯。假如人们处于类似的位置,希望自学Web3合作开发,或者甚至想要已经开始Web3的职业生涯,那么强烈建议从Infura已经开始。

原文副标题:From Zero to Hero: Learning Web3 With Infura and Python,作者:Alvin Lee

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务