日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python 生成pdf收据_python如何与以太坊交互并将区块链信息写入SQLite

發(fā)布時(shí)間:2024/10/14 python 66 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 生成pdf收据_python如何与以太坊交互并将区块链信息写入SQLite 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

關(guān)于區(qū)塊鏈介紹性的研討會(huì)通常以易于理解的點(diǎn)對(duì)點(diǎn)網(wǎng)絡(luò)和銀行分類賬這類故事開頭,然后直接跳到編寫智能合約,這顯得非常突兀。因此,想象自己走進(jìn)叢林,想象以太坊區(qū)塊鏈?zhǔn)且粋€(gè)你即將研究的奇怪生物。今天我們將觀察該生物,并與其進(jìn)行交互然后將有關(guān)它的所有數(shù)據(jù)收集到一個(gè)集中存儲(chǔ)中供自己使用。

進(jìn)行第一次設(shè)置

首先,你需要安裝web3py。Web3py是一個(gè)用于連接以太坊區(qū)塊鏈的Python庫(kù)。你需要事先知道的是,沒有可以從中下載數(shù)據(jù)的中央管理系統(tǒng)。彼此共享資源的內(nèi)連節(jié)點(diǎn)(“對(duì)等體”)存儲(chǔ)經(jīng)驗(yàn)證的數(shù)據(jù)副本(或其一部分)。網(wǎng)絡(luò)執(zhí)行以太坊協(xié)議,該協(xié)議定義節(jié)點(diǎn)彼此之間的交互規(guī)則及網(wǎng)絡(luò)上的智能合約。

如果要訪問有關(guān)交易,余額,區(qū)塊或其他任何被寫入?yún)^(qū)塊鏈的信息,協(xié)議需要你連接到節(jié)點(diǎn)。節(jié)點(diǎn)不斷地相互共享新數(shù)據(jù)并驗(yàn)證數(shù)據(jù),因此這樣你就可以確定那些是未被篡改的數(shù)據(jù),那些是最新的數(shù)據(jù)。

你可以在第一次接觸以太坊的方法中使用兩種基本類型的節(jié)點(diǎn):本地或托管。本地節(jié)點(diǎn)可以在你的計(jì)算機(jī)上運(yùn)行,這意味著你首先需要下載像geth這樣的客戶端,它會(huì)將區(qū)塊鏈同步到你的設(shè)備,要占用存儲(chǔ)空間并花費(fèi)大量時(shí)間來完成。對(duì)于第一次學(xué)習(xí),托管節(jié)點(diǎn)是更好的選擇——它由其他人控制,但你可以輕松連接到它并自己玩區(qū)塊鏈。

去Infura并創(chuàng)建自己的免費(fèi)帳戶以訪問此類托管節(jié)點(diǎn)。當(dāng)你完成后,你可以看到mainnet主網(wǎng)(即以太坊區(qū)塊鏈)和一堆testnets測(cè)試網(wǎng),它們基本上可以測(cè)試你的智能合約,這樣你就可以在將昂貴的代碼部署到mainnet之前犯錯(cuò)誤,并糾正它們。

這第一次我們先導(dǎo)入Web3對(duì)象并建立HTTP連接。

from?web3?import?Web3

web3?=?Web3(Web3.HTTPProvider("https://mainnet.infura.io/your-own-personal-number"))

現(xiàn)在你已經(jīng)完成了!你可以使用web3 API瀏覽查詢數(shù)據(jù)結(jié)構(gòu)了。

查詢特定區(qū)塊信息

#current?block?number>>>?web3.eth.blockNumber5658173#get?the?content?of?the?most?recently?mined?block>>>?web3.eth.getBlock('latest')

此命令返回AttributeDict數(shù)據(jù)結(jié)構(gòu),該結(jié)構(gòu)是key-value鍵值對(duì)的字典,如下所示:

AttributeDict({'difficulty':?3297284143124448,?'extraData':?HexBytes('0x65746865726d696e652d6177732d61736961312d34'),?'gasLimit':?7999992,?'gasUsed':?7990111,?'hash':?HexBytes('0x8c09ba67123601c08ef5d292acaffd36798ca178b7d6fecd5e1144ce8e3b9e50'),?'logsBloom':?HexBytes('0x348000240b40620836308460180004415000c8ccb260021402420721c22801ca847c625c0a89030482044001523a4d100050100250d100858381260a186312088006c154010000491216446840888200c1812088c12b06000809a808530014160000812c2ac20008a201c83380314d02242338400c0500c2a028005010988c44b0608a020400201032e10e16142b931115469824248066100b082224200222140a41a20aa2006224d608210f1a22811d03969423e8c08058100388c0800402002a000802130c40d289201900c38142a1cc0380a4010f0201040d4022200022018c5801346c168502841906940485ea1d9864044060a00000a00616004d006090'),?'miner':?'0xEA674fdDe714fd979de3EdF0F56AA9716B898ec8',?'mixHash':?HexBytes('0x84320fd71345778b48e437f3403e9021575520ba23aaac48dd7a352c9ce31f75'),?'nonce':?HexBytes('0x98a0b1e00bfabac6'),?'number':?5658173,?'parentHash':?HexBytes('0x01eda8a47a0151533d1afacf9b9108606d4d89a86e269dddaac9698b6fb12930'),?'receiptsRoot':?HexBytes('0xc40f774ad10ad443457c3a5a0db96b539af3007f8d351b198ca7bf2ef196b7e0'),?'sha3Uncles':?HexBytes('0x55725ec296c6c64257ed6a88d7d8c66160abe7b672f5d89bbad5487779b1d5fe'),?'size':?27161,?'stateRoot':?HexBytes('0x5bfc7a9a87fb9991f2760807d56319154f1dab91d3cfc9530a597b6c5d064aba'),?'timestamp':?1527002893,?'totalDifficulty':?4339832462578780814928,?'transactions':?[HexBytes('0x1ce6bca99701c4e8acae986b10e7649d628d70ec62b7a8314bbb13726a312225'),

HexBytes('0x6ba5e657243aea5f95afb40090313d10bb9443db41ed1216fbf7e7e60a16749a'),

loooooots_of_transactions_here],?'transactionsRoot':?HexBytes('0x67e1e1f2f4b1d33791a0fba2d5ebf039bd6c331c665cb8020ff41d0e0eade46e'),?'uncles':?[HexBytes('0x3df1bffa62d73b3847b434e9ea459c10cfdc3e212a2e78ebbf0db58adbef30b5'),

HexBytes('0x74bdcd4b88427854ae18f9c7ada28d46f26411bed09af6b040cbede66fdb1853')]})

并非所有這些變量都會(huì)立即對(duì)你有用,因?yàn)橛行┳兞糠浅<夹g(shù)性,只有當(dāng)你對(duì)區(qū)塊鏈的實(shí)際工作方式有了更深入的了解時(shí),它們的含義才有意義。你可以在所謂的黃皮書中閱讀有關(guān)它們的更多信息,或暫時(shí)跳過它們并使用易于理解的方法。

簡(jiǎn)而言之,一個(gè)包含區(qū)塊頭部信息的區(qū)塊,一個(gè)寫入它的已驗(yàn)證交易列表和一個(gè)未確認(rèn)列表(礦工的塊標(biāo)識(shí)符,他們的區(qū)塊太慢,無法進(jìn)入主區(qū)塊鏈,但仍因其計(jì)算工作量而獲得以太獎(jiǎng)勵(lì))。下面你可以看到每個(gè)變量的含義,我把它分成子類別。

General常規(guī)數(shù)據(jù)

Block variableMeaning翻譯

number

scalar value equal to the number of ancestor blocks (genesis block=0)

標(biāo)量值相對(duì)創(chuàng)始?jí)K的數(shù)量,genesis block=0

size

size of the block in bytes

塊的大小,以字節(jié)為單位

timestamp

Unix's time() at this block's inception

這個(gè)塊開始時(shí)的Unix時(shí)間

miner

160-bit address for fees collected from successful mining

成功采礦收取以太的160位地址

gasLimit

maximum gas expenditure allowed in this block

此區(qū)塊允許的最大氣體消耗量

gasUsed

total gas used by all transactions in this block

此區(qū)塊中所有交易使用的總氣體

transactions

list of transaction hashes included in the block

塊中包含的交易哈希列表

parentHash

Keccak256 hash of the parent block's header

父塊區(qū)塊頭的Keccak 256哈希值

hash

current block's hash

當(dāng)前塊的哈希值

extraData

extra data in byte array

字節(jié)數(shù)組中的額外數(shù)據(jù)

挖礦相關(guān)

Block variableMeaning翻譯

difficulty

scalar value corresponding to the difficulty level of the block

對(duì)應(yīng)于塊的難度級(jí)別的標(biāo)量值

totalDifficulty

integer of the total difficulty of the chain until this block

直到此區(qū)塊的鏈的總難度值

nonce

hash of the generated proof-of-work; null when its a pending block

生成工作量證明的哈希值;當(dāng)區(qū)塊掛起時(shí)為null

mixHash

256-bit hash which is combined with the nonce and used to prove that sufficient amount of computation has been carried out on this block

256位哈希與nonce結(jié)合使用來證明已對(duì)此塊執(zhí)行了足夠的計(jì)算量

uncle相關(guān)

Block variableMeaning翻譯

uncles

list of uncle hashes

uncle哈希值列表

sha3Uncles

SHA3 of the uncles data in the block

塊中uncles數(shù)據(jù)的SHA3值

技術(shù)相關(guān)

Block variableMeaning翻譯

receiptsRoot

Keccak 256-bit hash of the root node of the tree structure populated with receipts of all transactions in this block

Keccak樹結(jié)構(gòu)的根節(jié)點(diǎn)的256位哈希填充了此塊中所有交易的收據(jù)

stateRoot

Keccak256 hash of the root node if the state trie after all transactions are executed and finalisations applied

在執(zhí)行所有交易并應(yīng)用終止后,如狀態(tài)為trie根節(jié)點(diǎn)的keccak256哈希值

transactionsRoot

Keccak256 hash of the root node of the trie structure populated with the receipts of each transaction in the transactions list

trie結(jié)構(gòu)的根節(jié)點(diǎn)的keccak256哈希填充了交易列表中每個(gè)交易的收據(jù)

logsBloom

the Bloom filter from indexable info (logger address and log topics) contained in each log entry from the receipt of each transaction in the transaction list

交易列表中每個(gè)交易的接收日志條目中包含的可索引信息(記錄器地址和日志主題)的Bloom過濾器

交易和收據(jù)

現(xiàn)在,我們還可以通過其唯一標(biāo)識(shí)符(即交易哈希)查找區(qū)塊中的單個(gè)交易。

>>>?web3.eth.getTransaction('0x1ce6bca99701c4e8acae986b10e7649d628d70ec62b7a8314bbb13726a312225')

AttributeDict({'blockHash':?HexBytes('0x8c09ba67123601c08ef5d292acaffd36798ca178b7d6fecd5e1144ce8e3b9e50'),?'blockNumber':?5658173,?'from':?'0x390dE26d772D2e2005C6d1d24afC902bae37a4bB',?'gas':?45000,?'gasPrice':?123400000000,?'hash':?HexBytes('0x1ce6bca99701c4e8acae986b10e7649d628d70ec62b7a8314bbb13726a312225'),?'input':?'0x',?'nonce':?415710,?'r':?HexBytes('0x1bb901ad0a3add517504cc459fdb1545d193020ec5c63a566e440ee39dbfe131'),?'s':?HexBytes('0x4b7ac95eb321b5947948ecb624e1d80b19d9cc876668c69cc2b32670f52b061a'),?'to':?'0xBbA2D99C9B3aF394B0d6417b1D58815eE495029D',?'transactionIndex':?0,?'v':?37,?'value':?1000000000000000000})

和以前一樣,web3py返回一個(gè)屬性字典。下表總結(jié)了每個(gè)鍵的含義。

Transaction variableMeaning翻譯

blockHash

hash of the block the transaction belongs to

交易所屬區(qū)塊的哈希值

blockNumber

number of that block

該塊的編號(hào)

hash

transaction hash (unique identifier)

交易地址哈希(唯一標(biāo)識(shí)符)

from

160-bit address of a sender of a transaction

來自交易發(fā)送方的160位地址哈希

to

address of the recipient or null for a contract creation transaction

收件人的地址或者創(chuàng)建合約交易時(shí)為null

value

number of wei to be transfered to the recipient or newly created account (case of contract creation)

要轉(zhuǎn)移給收件人或新創(chuàng)建帳戶的wei數(shù)量(創(chuàng)建合約的情況)

gas

gas consumed by the transaction

交易消耗的天然氣

gasPrice

number of Wei to be paid per unit of gas for all computatioon costs of this transaction

此交易所有計(jì)算成本的每單位天然氣的支付數(shù)量

nonce

number of transactions/contract creations sent by the sender prior to this one

發(fā)送方在此之前發(fā)送的交易和創(chuàng)建合約的數(shù)量

v/r/s

used to identify the sender; the signature values of the transaction

用于識(shí)別發(fā)件人交易的簽名值

input

the data sent along with the transaction

與交易一起發(fā)送的數(shù)據(jù)

transactionIndex

index of the transaction in the block

區(qū)塊中交易的索引

最后,我們還可以查看交易收據(jù):

>>>?web3.eth.getTransactionReceipt('0x68c70c5ffe54a42ebf7118e7e931aeac018cee4656a816ffe6a01388da50c851')

AttributeDict({'blockHash':?HexBytes('0x44338e1f80302037c7213e8f56dd35d8a473b000319bc200f76e910e62d12f98'),?'blockNumber':?5617795,?'contractAddress':?None,?'cumulativeGasUsed':?21004,?'from':?'0xea6e3e41ebaa09d550d3c3f0d72971b3c5ccc261',?'gasUsed':?21004,?'logs':?[],?'logsBloom':?HexBytes('0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'),?'status':?1,?'to':?'0xd96a6e75d099ce529bbd257cbcb403224cceaebf',?'transactionHash':?HexBytes('0x68c70c5ffe54a42ebf7118e7e931aeac018cee4656a816ffe6a01388da50c851'),?'transactionIndex':?0})

交易收據(jù)包含一些重復(fù)和新條目,新的條目解釋如下。

Receipt variableMeaning翻譯

status

boolean whether the transaction was successfull; false if the EVM (Ethereum Virtual Machine) reverted the transaction

交易是否成功,如果EVM(以太坊虛擬機(jī))還原了交易則返回false

contractAddress

the contract address created if the transaction was a contract creation; otherwise null

如果交易是合約創(chuàng)建,則創(chuàng)建的合同地址;否則為null

gasUsed

the total amount of gas used when this transaction was executed in the block

在區(qū)塊中執(zhí)行此交易時(shí)使用的總氣體量

cumulativeGasUsed

the sum of gasUsed by this transaction and all preceding transactions in the same block

此交易使用的gasUse和同一塊中所有先前交易的總和

logs

array of log objects which the transaction has generated

交易生成的日志對(duì)象數(shù)組

作為參考,除了黃皮書之外,我還包括各種額外資源來編制這些表格2,3,4,5。

如你所見,只需幾個(gè)簡(jiǎn)單的命令,就可以連接到網(wǎng)絡(luò)并獲得有關(guān)原始格式的交易,區(qū)塊或狀態(tài)的基本信息。這將為這些數(shù)據(jù)打開一個(gè)新窗口!

數(shù)據(jù)庫(kù)管理系統(tǒng)

當(dāng)計(jì)劃將數(shù)據(jù)寫入適當(dāng)?shù)臄?shù)據(jù)庫(kù)時(shí),你可能會(huì)意識(shí)到有許多針對(duì)Python愛好者的管理系統(tǒng)解決方案,例如無服務(wù)器SQLite,或基于服務(wù)器的MySQL,PostgreSQL或Hadoop。根據(jù)你的意圖,必須確定哪個(gè)選項(xiàng)最適合你的項(xiàng)目。總的來說,我發(fā)現(xiàn)這些要點(diǎn)很有幫助:

數(shù)據(jù)庫(kù)的預(yù)期大小是什么(即可以在單個(gè)機(jī)器系統(tǒng)上處理)?

這些條目是經(jīng)常編輯還是會(huì)保持不變?

數(shù)據(jù)庫(kù)是否應(yīng)該由多方/應(yīng)用程序同時(shí)訪問和編輯?

隨著時(shí)間的推移,以太坊區(qū)塊鏈正在穩(wěn)步增長(zhǎng),截止到2018年6月接近1TB,這個(gè)很小,因此對(duì)于像Hadoop這樣的分布式處理系統(tǒng)來說并不是最佳選擇。區(qū)塊鏈數(shù)據(jù)庫(kù)將被寫入一次,然后僅使用新條目進(jìn)行擴(kuò)展,保留舊條目不變。此數(shù)據(jù)庫(kù)的預(yù)期用例由一個(gè)通道編寫,并由其他通道以只讀方式訪問,因此我們實(shí)際上不需要在服務(wù)器上運(yùn)行它。在你的機(jī)器上本地保存數(shù)據(jù)庫(kù)將導(dǎo)致快速讀取,這對(duì)于像SQLite這樣的無服務(wù)器管理系統(tǒng)是可取的和可實(shí)現(xiàn)的。Python有一個(gè)內(nèi)置的庫(kù)sqlite3,因此我們甚至不需要安裝新的包。

數(shù)據(jù)庫(kù)設(shè)計(jì)

下一步是設(shè)計(jì)數(shù)據(jù)庫(kù)。請(qǐng)記住哪些數(shù)據(jù)字段與你的分析最相關(guān),并且旨在優(yōu)化搜索和存儲(chǔ)。例如,如果你不打算使用stateRoot,則可能需要完全跳過它或?qū)⑵浔4嬖趩为?dú)的表中。可以更快地搜索具有較少列的表,如果稍后意識(shí)到你實(shí)際上具有stateRoot的用例,你仍然可以訪問它。你可能還希望將塊信息與交易信息分開;如果不這樣做,那么區(qū)塊屬性如timestamp將對(duì)區(qū)塊中的所有交易重復(fù)N次,浪費(fèi)大量空間。稍后使用JOIN操作可以輕松地將交易與其塊屬性進(jìn)行匹配。

我設(shè)計(jì)的數(shù)據(jù)庫(kù)包含3個(gè)表:

Quick:最相關(guān)的交易信息,用于快速訪問和分析。

TX:所有剩余的交易信息,

Block:指定區(qū)塊的信息。

變量的命名約定相對(duì)于原始的web3py略有改變,以消除歧義,例如將塊哈希和交易哈希都稱為“哈希”,或使用“from”/“to”作為列名,這在SQL有不同的含義,會(huì)使程序崩潰。

交易值,余額和其他大數(shù)字需要作為字符串存儲(chǔ)在數(shù)據(jù)庫(kù)中。原因是SQLite只能處理最多8字節(jié)存儲(chǔ)的有符號(hào)整數(shù),最大值為2的63次方-1大約是9223372036854775807.這通常遠(yuǎn)低于wei中的交易值(例如,1ETH = 10*18 wei)。

構(gòu)建你的迷你數(shù)據(jù)庫(kù)

完整的代碼可以在GitHub上找到。它將根據(jù)上層架構(gòu)組織區(qū)塊鏈信息,并輸出包含預(yù)先指定數(shù)量的塊數(shù)據(jù)的blockchain.db文件。要測(cè)試它,請(qǐng)轉(zhuǎn)到database.py文件并為要寫入的塊數(shù)選擇合理的數(shù)字,例如:

Nblocks?=?10000

默認(rèn)情況下,你應(yīng)該將web3對(duì)象指向Infura端點(diǎn)。 如果你有IPC提供商(即你的本地節(jié)點(diǎn)),也可以切換到IPC提供商,只需取消注釋該行:

#?or?connection?via?node?on?the?VM?#web3?=?Web3(Web3.IPCProvider('/path-to-geth.ipc/'))

修改路徑,然后只需在命令行python database.py中運(yùn)行。代碼會(huì)將最后寫入的塊的編號(hào)轉(zhuǎn)儲(chǔ)到lastblock.txt文件中,以防你需要重新啟動(dòng)。

如何使用數(shù)據(jù)庫(kù)

一旦將第一個(gè)條目寫入數(shù)據(jù)庫(kù),就可以通過ipython shell開始與它進(jìn)行通信。例如,要打印表“Quick”的前5行,你可以運(yùn)行下面的代碼。

import?sqlite3?as?sq3

conn?=?sq3.connect("blockchain.db")

cur?=?conn.cursor()#?some?SQL?code,?e.g.?select?first?five?entries?of?the?table?Quickcur.execute("SELECT?*?FROM?Quick?LIMIT?5")

a?=?cur.fetchall()?#list?of?tuples?containing?all?elements?of?the?rowprint(a)

conn.close()

本地節(jié)點(diǎn)與Infura

如果要構(gòu)建大型數(shù)據(jù)庫(kù),則應(yīng)下載geth并同步節(jié)點(diǎn)。同步可以在3種基本模式下完成:

如果你不需要過去的帳戶狀態(tài),則可以在快速模式下同步節(jié)點(diǎn)6。

下面的圖表顯示了此代碼寫入數(shù)據(jù)庫(kù)的速度,與本地完全同步的節(jié)點(diǎn)(IPC)與Infura(Infura)上的地址進(jìn)行通信。正如你所看到的,在本地節(jié)點(diǎn)上運(yùn)行此代碼是值得的,因?yàn)槟憧梢詫⑺俣忍嵘?個(gè)數(shù)量級(jí)(即100x)!

總結(jié)

現(xiàn)在你已擁有自己的本地?cái)?shù)據(jù)庫(kù),了解區(qū)塊鏈上發(fā)生的事情,可以開始探索它。例如,你可以計(jì)算自其起源以來的交易數(shù)量,查看作為時(shí)間函數(shù)生成的地址數(shù)量——天空是你可以了解的有關(guān)區(qū)塊鏈的限制。我們?yōu)槟愕臄?shù)據(jù)科學(xué)游樂場(chǎng)奠定了基礎(chǔ)。因此,請(qǐng)繼續(xù)探討,或查看下一篇文章,了解潛在的應(yīng)用。

總結(jié)

以上是生活随笔為你收集整理的python 生成pdf收据_python如何与以太坊交互并将区块链信息写入SQLite的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。