如何用Python匯款(電腦上如何匯款)

Python開發(fā)人員對于以太坊和區(qū)塊鏈庫的技術(shù)練習(xí)。
警告:下面的教程包含這些元素:顯式加密、點(diǎn)對點(diǎn)金融服務(wù)以及可能的違規(guī)行為。這些例子僅僅是為了說明Python區(qū)塊鏈的強(qiáng)大功能和便捷性。
嗨,Pythoners,你們好!
我真的很喜歡Python社區(qū)。像很多人一樣,Python是我的第一種編程語言。Python hackathon和它的meet-up非常棒。而且我喜歡Monty Python(https://pythonspamclub.com/monty-python-and-programming-language/)!
我正在將熱愛的東西與目前的工作結(jié)合在一起:向開發(fā)人員展示區(qū)塊鏈編程的強(qiáng)大功能,以及這些技能是多么容易掌握。
這是一個(gè)向Python開發(fā)人員介紹Web3.py(一個(gè)區(qū)塊鏈/以太坊庫)的基礎(chǔ)知識(shí)的教程。我們將在Python解釋器中做很多事情。(在下一節(jié)中,我們將給出一個(gè)合適的目錄。但現(xiàn)在,讓我們放輕松!)
注意:出于安全原因,我們將通過測試網(wǎng)絡(luò)進(jìn)行匯款。所有這些技術(shù)都可以在主要的以太坊網(wǎng)絡(luò)上使用。
目錄
·安裝
·建立連接
·初始化
·創(chuàng)建一個(gè)帳戶
·ENS帳戶
·匯款
安裝
我們將使用pip,用命令行安裝web3.py:
對于同時(shí)安裝了Python 2和3的用戶,您應(yīng)該檢查一下使用哪個(gè)版本的pip命令。某些默認(rèn)的是2.7:
如果您使用的是virtualenv,這里還有一些為Web3.py設(shè)置環(huán)境的文檔(https://web3py.readthedocs.io/en/stable/troubleshooting.html#setup-environment)。
很好!我們已經(jīng)開始了。
建立我們的連接
區(qū)塊鏈系統(tǒng)是分散的網(wǎng)絡(luò),由運(yùn)營專門的P2P軟件或“節(jié)點(diǎn)”的人員組成。它類似于torrent網(wǎng)絡(luò):為了與網(wǎng)絡(luò)交互,您必須托管一個(gè)節(jié)點(diǎn),或使用相關(guān)的托管服務(wù)。
由于這是基礎(chǔ)教程,因此我們將使用托管服務(wù)。最受歡迎的是Infura。您可以設(shè)置自己的免費(fèi)帳戶(說明見https://blog.infura.io/getting-started-with-infura-28e41844cc89/),也可以使用下面的產(chǎn)品ID。獲取項(xiàng)目ID和API端點(diǎn)至關(guān)重要——這將是我們通往區(qū)塊鏈的API端點(diǎn),并且用于分析的儀表盤也很有幫助。
復(fù)制這里的Endpoint,并確保在地址前添加https://。
一旦有了它,您就可以用Python連接區(qū)塊鏈了!
初始化
讓我們啟動(dòng)Python解釋器。具體操作取決于您安裝的Python,輸入你通常運(yùn)行Python腳本時(shí)在腳本名稱前面的部分就可以了。對于我的Mac iTerm來說,它同時(shí)安裝了Python 2和3,是下面這樣的:
為了檢查我們的所有設(shè)置是否正確,請運(yùn)行python解釋器和以下命令:
上面的命令導(dǎo)入了一些web3.py中的主要方法,我們要用這些方法連接區(qū)塊鏈,它還導(dǎo)入了內(nèi)置的json。
我們將創(chuàng)建一個(gè)對象(w3),我們將使用Infura API端點(diǎn)(以https://開頭)對其進(jìn)行初始化。在本教程接下來的部分中,它將成為web3.py與區(qū)塊鏈協(xié)作的主要方式。
注意:您需要在Infura API地址前面添加HTTPS://,否則會(huì)出現(xiàn)錯(cuò)誤!
我們還需要添加一些中間件來幫助我們使用Infura和Rinkeby測試網(wǎng):
現(xiàn)在,為了查看一切是否順利,我們運(yùn)行:
如果您得到True的結(jié)果,恭喜!您已連接到區(qū)塊鏈!
如果您得 False的結(jié)果,可以檢查以下事項(xiàng):
1.如果您需要重新啟動(dòng)解釋器,那么必須重新導(dǎo)入庫,并且重新初始化變量
2.您是否正確復(fù)制了Infura API密鑰?
3.您是否安裝了web3.py?是否安裝并導(dǎo)入了Web3和HTTPProvider?
4.您是否已在API密鑰前面加上https://?
創(chuàng)建一個(gè)帳戶
如果我們想在區(qū)塊鏈上匯款,我們需要一個(gè)以太坊賬戶。以太坊賬戶是以太坊區(qū)塊鏈上的主要身份單位——賬戶的地址用于網(wǎng)絡(luò)對用戶的識(shí)別。帳戶系統(tǒng)的基礎(chǔ)是基于公鑰加密的分散身份協(xié)議。本質(zhì)上來說,區(qū)塊鏈網(wǎng)絡(luò)上的身份是通過公共地址對應(yīng)方(由網(wǎng)絡(luò)持有)對單個(gè)私鑰(由用戶秘密持有)的數(shù)字簽名進(jìn)行身份驗(yàn)證來確認(rèn)的。盡管它帶來了一定的用戶體驗(yàn)障礙,但它確實(shí)提供了一種快速的、點(diǎn)對點(diǎn)的身份驗(yàn)證協(xié)議。
用web3.py生成一個(gè)可以在以太坊網(wǎng)絡(luò)上使用的賬戶非常容易。
注意:在接下來的幾個(gè)步驟中,我將違反一些加密和安全方面的規(guī)則。(1)我將生成一個(gè)熵不足的私鑰(隨機(jī)地),并且(2)我將在線公開私鑰。在本教程之外,我不會(huì)使用此私鑰——它只是出于教學(xué)的目的。您應(yīng)該始終使用正確的私鑰管理,例如Geth或MetaMask,并且永遠(yuǎn)不要共享您的私鑰。
上面的命令使用輸入的字符串生成了my_account對象,該對象包含一個(gè)私鑰(my_account._private_key)和相關(guān)的以太坊地址(my_account._address)。但是,由于我已經(jīng)公開該私鑰,因此其他人可以生成和使用相同的私鑰。(幸運(yùn)的是,本教程僅在用于測試的區(qū)塊鏈網(wǎng)絡(luò)上使用它。)
因此,用戶通常將私鑰的創(chuàng)建和管理委托給名為客戶端(如Geth)或錢包(如MetaMask)的軟件。這些軟件提供了一種非常安全的方式來生成和處理用于區(qū)塊鏈交互的私鑰。
ENS帳戶
以太坊的地址是十六進(jìn)制數(shù)字。這讓人幾乎不可能手動(dòng)輸入或記住,因此以太坊社區(qū)創(chuàng)建了Ethereum Name System (ENS)。它也具有域名系統(tǒng)的優(yōu)勢,該域名系統(tǒng)將網(wǎng)站服務(wù)器編號(hào)(216.58.194.46)替換為易于理解的名稱(google.com)。大多數(shù)ENS名稱都使用.eth域,而不是.com域。
例如,我有一個(gè)Ethererum帳戶(0x4d3dd8471a289E820Aa9E2Dc5f437C1b2E22F598)。但是我用ENS將更易讀的名稱(coogan.eth)映射到該地址。如果您在支持ENS的應(yīng)用或項(xiàng)目中輸入這些內(nèi)容(例如web3.py),它將代替以太坊的十六進(jìn)制地址。不幸的是,由于.eth域名只能在主網(wǎng)上使用,因此我們無法在本教程中使用它,但也許下一教程中會(huì)有!
匯款
在最后一部分中,我們將從剛創(chuàng)建的賬戶向一些以太坊賬戶匯款。它們?nèi)坑胮ython解釋器進(jìn)行!
人們對匯款的合理反應(yīng)是:“難道互聯(lián)網(wǎng)上的錢不是在波動(dòng)中呈現(xiàn)不斷下降的趨勢嗎?” 是的,加密貨幣的美元價(jià)格波動(dòng)很大。這引起了企業(yè)的猶豫——為什么您會(huì)接受價(jià)格不確定的貨幣?
但是,以太坊生態(tài)系統(tǒng)建立了一個(gè)奇特的解決方法。以太坊被稱為“世界計(jì)算機(jī)”,因?yàn)樗且粋€(gè)分布式系統(tǒng),允許開發(fā)人員上傳并執(zhí)行自己的代碼。用這種方式上傳到以太坊的代碼稱為智能合約。它被上傳到網(wǎng)絡(luò)后,將成為一個(gè)獨(dú)立的實(shí)體,具有自己的地址,內(nèi)存和網(wǎng)絡(luò)訪問權(quán)限。智能合約使得以太坊開發(fā)者社區(qū)豐富了起來,該社區(qū)既富有創(chuàng)意又不懈地應(yīng)對挑戰(zhàn),例如區(qū)塊鏈固有的價(jià)格波動(dòng)。
注意:要使帳戶(不同于本教程中的賬戶)獲得Dai,您可以通過這個(gè)合約地址(https://rinkeby.etherscan.io/address/0xc3dbf84abb494ce5199d5d4d815b10ec29529ff8#code),Metamask和您自己的帳戶在測試網(wǎng)上創(chuàng)建自己的帳戶。請按照此處教程(https://tokenmint.io/blog/how-to-mint-new-tokens-using-etherscan.html)中的步驟進(jìn)行操作。
合約實(shí)例化
為了與開發(fā)人員上傳到以太坊的代碼進(jìn)行交互,我們需要知道上傳的代碼提供了哪些方法。Web3.py知道如何與核心的以太坊軟件進(jìn)行對接,但是需要被指導(dǎo)如何與第三方代碼交互。我們通過為Web3.py提供應(yīng)用程序二進(jìn)制接口(ABI)來提供這個(gè)指導(dǎo)。與應(yīng)用程序編程接口(API)相似,ABI讓我們的計(jì)算機(jī)知道哪些功能可用以及實(shí)現(xiàn)這些功能需要的參數(shù)。ABI在區(qū)塊鏈上不可用,由開發(fā)人員在Github或Etherscan網(wǎng)站上提供。
下面是我們將使用的測試網(wǎng)的Dai ABI,請復(fù)制整個(gè)代碼塊:
注意:此代碼真的很長,請仔細(xì)地將其完全復(fù)制!
我們需要使用json解析它:
我們還需要告訴web3.py如何在太坊網(wǎng)絡(luò)找到此代碼。我們使用以下代碼進(jìn)行操作:
我們使用ABI和這個(gè)地址將智能合約對象實(shí)例化。這將使我們能夠訪問代碼提供的功能:
為了測試我們是否已經(jīng)正確地將合約實(shí)例化,我們將調(diào)用一個(gè)函數(shù),該函數(shù)告訴我們該合約持有多少Dai:
(運(yùn)行該帳戶時(shí),余額可能有所不同)
創(chuàng)建交易
為了從我們的西班牙帳戶(my_account)轉(zhuǎn)移Dai ,我們將使用Dai智能合約中的transfer功能,如下所示:
我們可以看到,我們需要將兩個(gè)參數(shù)傳遞給合約:to,這是一個(gè)十六進(jìn)制的以太坊address和 value,為uint256格式。即使是經(jīng)驗(yàn)豐富的開發(fā)人員,處理256位(uint256)的無符整型數(shù)也可能是一個(gè)挑戰(zhàn)。這證明了非常規(guī)編程必須在智能合約的水平上完成,這經(jīng)常讓我很失望。Web3.py有一種方法可以將整數(shù)值轉(zhuǎn)換為智能合約所需的格式,這個(gè)方法是toHex。讓我們發(fā)送10個(gè)Dai,由于我們要發(fā)送的數(shù)量少于16個(gè),因此我們只需將0x放在前面。對于address,請輸入您要發(fā)送Dai給別人的地址。
我們的當(dāng)前交易如下所示:
這些參數(shù)對于Dai合約很有用(我們不會(huì)在這出現(xiàn)錯(cuò)誤),但是我們需要更多的參數(shù),使得交易在以太坊網(wǎng)絡(luò)上進(jìn)行。這些參數(shù)是chainId,gas和nonce。
·ChainId可以讓web3.py知道將交易發(fā)送到哪個(gè)網(wǎng)絡(luò)。不同的網(wǎng)絡(luò)有不同的偏好(就像我們一開始為Rinkeby安裝middleware時(shí)所看到的那樣),這有助于web3.py正確綁定交易。Rinkeby的網(wǎng)絡(luò)ID為 4,這是網(wǎng)絡(luò)ID的完整列表(https://besu.hyperledger.org/en/stable/Concepts/NetworkID-And-ChainID/)。。
·Gas是您向網(wǎng)絡(luò)礦工支付的用于交易費(fèi)用的小筆款項(xiàng)。許多人對此感到驚訝,但是它的金額很小(例如,我們的交易將花費(fèi)0.00007000ETH,名為Gwei的特定面額劃定了它的標(biāo)準(zhǔn)(https://ethereum-homestead.readthedocs.io/en/latest/ether.html))。Gas以分散的方式幫助網(wǎng)絡(luò)安全運(yùn)行。
·Nonce是每個(gè)以太坊賬戶專用的全局變量。它的作用與支票底部的數(shù)字相同:它允許對來自不同帳戶的付款正確排序。發(fā)送每筆交易后,它就加一。Web3.py有一種查找當(dāng)前nonce地址的方法: w3.eth.getTransactionCount(ETHEREUM_ADDRESS)。
我們將使用web3.py的buildTransaction方法將這三個(gè)變量合并到我們的交易中。我還要添加我朋友的以太坊地址,并給他發(fā)送10個(gè)Dai:
簽名和發(fā)送交易
現(xiàn)在我們有了transaction,我們需要使用私鑰對其進(jìn)行簽名。這樣,以太坊的點(diǎn)對點(diǎn)協(xié)議就會(huì)知道是哪個(gè)賬戶想要匯款。為了完成簽名,我們將transaction對象和my_account._private_key對象放入以下函數(shù)中:
注意:您絕對不能在網(wǎng)上發(fā)布真實(shí)的私鑰!我們這樣做僅出于教學(xué)目的。再次注意:在此帳戶耗盡測試的內(nèi)容(或用于測試的Dai)之前,以上命令對Rinkeby網(wǎng)絡(luò)都是有效的。
交易簽名后,我們現(xiàn)在要做的就是通過Infura API端點(diǎn)將其發(fā)送到網(wǎng)絡(luò)。我們使用以下命令對w3對象進(jìn)行操作:
如果成功的話,恭喜!您剛剛用Python匯款了!
要查找您的交易,您可以輸入txn_hash,并將字符串值交給Rinkeby的Etherscan。這是我擁有的哈希(您自己的可能有所不同):
您可以在以太坊測試網(wǎng)上看到它(https://rinkeby.etherscan.io/tx/0xc5f98cbe6f1eaef16916b148e6c4ae926b11ab9dde750e188362745da39d560e)。
如您所見,使用web3.py可以為您的應(yīng)用程序創(chuàng)造各種可能。在下一個(gè)教程中,我希望使用正確的文件和目錄來做更多的事情。現(xiàn)在,我只想向您展示區(qū)塊鏈可以提供的一些令人難以置信的功能。希望您發(fā)現(xiàn)有趣的東西!這個(gè)社區(qū)希望與新朋友互動(dòng),請和他們交流。
英文原文:https://consensys.net/blog/blockchain-development/how-to-send-money-using-python-a-web3-py-tutorial/譯者:桃夭
