譯者 | 李睿
Web3、區塊鏈技術和加密貨幣如今都是令人關注的熱門話題。技術、應用、生態系統以及對社會的影響都在以驚人的速度發展。本文將從開發人員Alvin Lee的角度來討論如何學習開發Web3,雖然他開發經驗豐富,但是在開發Web3方面則是一名新手。本文將了解Web3開發的先決條件,如何使用Python/ target=_blank class=infotextkey>Python通過Web3的頂級API服務Infura訪問區塊鏈,最后介紹用于管理錢包的一個簡單項目。
如何開始
盡管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)Mai.NET
- 以太坊主網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>
為了測試是否可以訪問API,可以使用curl獲取錢包余額。
將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”項目,因為它所做的就是獲取余額并將一些錢發送到目標賬戶。自從Alvin Lee采用Sepolia faucet賺錢以來,他決定發送一些資金來回饋它。先檢查一下代碼。
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_balance()方法獲得加密錢包的余額,然后傳遞所請求的單位(以太幣),并將其顯示在屏幕上。接下來,該函數調用send_eth()方法將20,000 Gwei發送到目標帳戶。最后,它在匯款后再次獲取并顯示余額。
復制
def main():
wm = WalletManager()
sepolia_faucet_account = wm.w3.toChecksumAddress('0xea4d57b2dd421c5bfc893d126ec15bc42b3d0bcd')
balance = str(wm.get_balance('ether'))
print(f'balance before transaction: {balance}')
print(f'send 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(f'balance 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()是一個靜態方法,因為它不需要來自WalletManager類的任何信息。它從環境中獲取Infura API密鑰和API密鑰秘密,然后將它們編碼為基本身份驗證令牌。它在Sepolia測試網上為項目準備了適當的端點,然后用所有信息實例化了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 = f'https://sepolia.infura.io/v3/{infura_api_key}'
headers = dict(Authorization=f'Basic {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()方法。這里有很多內容,所以可以將其分成多個塊。
首先,send_eth()轉換要發送給Wei的金額(如果需要),然后它獲取該帳戶的交易計數并將其存儲為nonce。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