无码人妻精品一区二区蜜桃在线看,人妻无码中文字幕免费视频蜜桃,无码人妻精品一区二区蜜桃色欲,蜜桃AV色偷偷AV老熟女,久久人妻少妇嫩草AV蜜桃漫画,又爽又黄A片免费观看直播蜜桃,欧美性猛交XXXX乱大交蜜桃,色欲AV永久无码精品无码蜜桃,蜜桃一区二区三区,WWW.17C嫩嫩草色视频蜜桃,亚洲精品久久久蜜桃

一(yī)文(wén)看(kàn)懂(dǒng)怎樣用(yòng) Pyth₩₹≤♥on 創建比特币交易

2018-04-04 15:20

 

比特币價格的(de)上(shàng)上(shàng)下(xià)下(x™↔¶ià),始終撩動著(zhe)每一(yī)個(gè♥₽β)人(rén)無比關切的(de)小(xiǎo)心髒。∏ ε 從(cóng)去(qù)年(nián)初的(de) 800 美(měi)∞ ☆£元左右,飛(fēi)漲到(dào)去(qù)年(niá≠¥n)底到(dào) 19783.21 美(mě♦÷§i)元最高(gāo)點,不(bù)到(dào)1年(φ&↑nián),便有(yǒu)将近(jìn) 25 倍的(deσαγ)升值速度。盡管眼下(xià)又(yòu)掉回 8000 多(du±₩ō)美(měi)元的(de)價格,但(dàn)價格差γ↑•不(bù)多(duō)能(néng)搞出去(qù)年(nián)同©↔期一(yī)個(gè)數(shù)量級,币圈人(rén)士&ldquo§® ;過去(qù)一(yī)年(nián)比以往 10 年(nián)掙的(Ω♥de)都(dōu)多(duō)”,已經是(shì)不(bù)争的(♦§γde)事(shì)實。

而對(duì)區(qū)塊鏈開(kāi)發者₹®φ≠來(lái)說(shuō),據說(shuō)也(☆→yě)已經有(yǒu)拿(ná)到(dào)₽✘ππ年(nián)新 500 萬的(de)天價♥"。所以“跑步進入區(qū)塊鏈”,已經₹​&成為(wèi)不(bù)少(shǎo)程序員(yuán)的(de↕ ✔₽)共識。但(dàn)是(shì)看(kàn)過≥≈≠很(hěn)多(duō)遠(yuǎn)離(lí),​ ≥ 我們如(rú)何才能(néng)迅速上(shàn"π↑g)手呢(ne)?國(guó)外(wài)網友(yǒu) Ken Shirri¶≠ff 在博客中分(fēn)享了(le)他(tā)在手動茶古劍比特币交易↕↓時(shí)的(de)代碼與對(duì)比特币協議(yì)的(d™©e)心得(de),區(qū)塊鏈大(dà)本營∞&"編譯如(rú)下(xià)。

 

近(jìn)期,媒體(tǐ)行(xíng)業(yè)對₩€≤§(duì)比特币表現(xiàn)出極大(dà)的(de)熱(rè)情,這(zh≥¥‍✔è)鼓舞(wǔ)著(zhe)我從(cóng)網絡♦★底層的(de)數(shù)據流開(kāi)始,認真學習(xí₹↓)比特币的(de)工(gōng)作(zu✘φ¶¶ò)原理(lǐ)。通(tōng)常人(rén)們會(huì)使用(yòn←♥g)錢(qián)包軟件(jiàn)來(lái)‌©進行(xíng)比特币交易,錢(qián)包軟件(jià∑φ↑€n)在方便用(yòng)戶的(de)同時(shí),向用(yòng)戶§‌£隐藏了(le)比特币的(de)交易流程,而我想親自(zì)✘ α<動手來(lái)體(tǐ)驗比特币交易,我的(de)目标是(shì)用(yòn∞♣÷&g)Python手動創建一(yī)筆(bǐ)比特币交易,以十六¥‌進制(zhì)數(shù)據的(de)形式将交易廣播到(dào)比特币網絡中∑™,然後觀察這(zhè)筆(bǐ)交易是(sh™ε ì)怎麽被加入到(dào)區(qū)塊鏈中的(de)₩"✔→。事(shì)實證明(míng),這(zhè)個(gè)過程很(hěn≠α )有(yǒu)趣,希望你(nǐ)也(yě)對(duì)它感興趣。

 

在本篇文(wén)章(zhāng)中,首先我會(huì)對(duì)比特币進 ÷δ™行(xíng)一(yī)個(gè)簡單的(de)概述,之後,我會(huì)從&↔‍<(cóng)以下(xià)幾個(gè)方面帶領你(nǐ)們學習(xí)比特∏¶币:創建一(yī)個(gè)比特币地(dì)址(λ®♠£比特币中的(de)賬戶),進行(xíng)一(yī)→↔¥筆(bǐ)比特币交易,簽署交易,将交易廣播到(dào)比特币網絡中'÷©,最後等待交易的(de)确認。

 

比特币簡述:

 

首先,我會(huì)介紹一(yī)下(xià)比特币系統是(shì)怎麽運π♦σ≤轉的(de),然後再深入探討(tǎo)整個(gè)細™<節。比特币是(shì)一(yī)個(gè•₽ )基于點對(duì)點網絡的(de)電(diàn)子(zǐ)貨币,你(nφ☆∞ǐ)可(kě)以用(yòng)現(xiàn)金(jīn)在網上(φ'λshàng)購(gòu)買比特币,用(yòng)比☆ 特币向他(tā)人(rén)轉賬,在有(yǒuσ☆♣​)些(xiē)商家(jiā),你(nǐ)可(kě)以像使用(yλ‌òng)支付寶一(yī)樣使用(yòng)比特币付款,當$×然,你(nǐ)也(yě)可(kě)以賣出所持有(yǒu)的(d♠≤&φe)比特币換回現(xiàn)金(jīn)。

 

簡而言之,在比特币網絡中,分(fēn)布式賬本(區(qū)塊γ&鏈)記錄并随時(shí)更新著(zhe)每個(gβ ∏ è)比特币的(de)所有(yǒu)權。與銀(yín)行(♠£•÷xíng)不(bù)同的(de)是(shì),比↕γ特币并沒有(yǒu)與個(gè)人(rén)或個(gè)人(rén≠≤‌)的(de)賬戶綁定,相(xiàng)反的(de₽φ),比特币隻屬于一(yī)個(gè)個(gè)比特币地(dì)址,比©∞如(rú):1KKKK6N21XKo48zWKuQKXdvSs↕ Cf95ibHFa。這(zhè)裡(lǐ)你(nǐ)可(kě)能(néng)已β¥經繞暈了(le),難道(dào)這(zhè)段字符中藏著(zh →÷≈e)比特币?當然不(bù)是(shì),比特币地÷‌Ω(dì)址是(shì)比特币網絡中的(de)一♠♥↓ (yī)個(gè)身(shēn)份,也(yě)可(kě)以通(tōn∏$g)俗地(dì)說(shuō)是(shì)你(nǐ)在✘$‌₩比特币中開(kāi)的(de)一(yī)個(gè‍​™)“銀(yín)行(xíng)賬戶”,我們用(yòng®φ )這(zhè)個(gè)“賬戶”來(lái)進行(β&★₹xíng)交易。在網站(zhàn):blockchain♠↑←.info中,你(nǐ)可(kě)以查到(dà♥ o)所有(yǒu)的(de)交易信息:

 

比特币賬戶信息

 

但(dàn)是(shì)怎麽證明(míng)這(zhè)個(gè)賬戶是($•®shì)我的(de)呢(ne),不(bù•<)急,先往下(xià)看(kàn),你(nǐ)的(de)疑問(wèn≤φ)我會(huì)為(wèi)你(nǐ)一(y$✘$ī)一(yī)解答(dá)。

 

比特币交易

 

如(rú)何像使用(yòng)現(xiàn)金(jīn)↓λ>一(yī)樣使用(yòng)比特币呢(ne)?答(dá)案<®是(shì)創建一(yī)筆(bǐ)交易。在一(yī)筆(bǐ)交易中,✘♣✘比特币的(de)所有(yǒu)者(上(shàng)文(wén)←♦★提到(dào)過比特币的(de)所有(yǒu)αδ™者是(shì)比特币地(dì)址)将所有(yǒu)權轉移到(dào)一→↓(yī)個(gè)新的(de)比特币地(dì)址。比特∑↑ ≠币的(de)一(yī)個(gè)颠覆性創新就(jiù)是(shì)通(tōn≤€♥∞g)過鼓勵節點記賬(也(yě)叫礦工(gōng)挖礦),将交易記錄放(fà↑₹¶♠ng)在一(yī)個(gè)分(fēn)布式的γ α(de)數(shù)據庫中。交易被集合在區(qū)塊中,大(dλ♣γà)概每十分(fēn)鐘(zhōng)比特币網絡中産生(shēn&&φg)一(yī)個(gè)新的(de)區(qū)塊,成為(wèi)交₩ β↔易記錄的(de)一(yī)部分(fēn),稱為(wèi)區↓™​<(qū)塊鏈。加入到(dào)區(qū)塊鏈中的(d±'e)交易可(kě)以被認為(wèi)是(shì)一(yφφ'☆ī)筆(bǐ)成功的(de)交易。現(xià♦§n)在問(wèn)題來(lái)了(le),誰來(lái•$&)給你(nǐ)記賬呢(ne)?是(shì)礦工(gōβ $ ng),礦工(gōng)的(de)挖礦過程就‍α∞(jiù)是(shì)在往區(qū)塊鏈中±∞記賬,礦工(gōng)要(yào)核實每筆(≥↓ bǐ)交易是(shì)否正确,核實完後,礦工(gōng)們就¶δ(jiù)開(kāi)始算(suàn)一(yī)道(dào)很(hěn₩ ∑)難的(de)數(shù)學題(密碼學中的(deπ€™♠)哈希函數(shù)),最早算(suàn™™φ)出答(dá)案的(de)人(rén)就(jiù)∞™≥能(néng)生(shēng)成一(yī)個(gè)區(qū)塊,也(y∑±ě)叫挖出了(le)一(yī)個(gè)新的(de)區(qū)塊,這(zhè)♦≤'÷個(gè)區(qū)塊将成為(wèi)區(qū♥×δφ)塊鏈的(de)新一(yī)部分(fēn)。

 

也(yě)許你(nǐ)會(huì)問(wγδ♣≈èn)了(le),明(míng)明(míng)是(shì)記¥₩σ賬,幹著(zhe)會(huì)計(jì)的(de)活,為(wèi)什(shén→<)麽要(yào)叫挖礦呢(ne)?和(hé)傳統≤σσ∑的(de)在地(dì)下(xià)挖礦石一(yī)‌​↔λ樣,比特币挖礦也(yě)是(shì)會(huì)↔₹♦有(yǒu)收獲的(de)。挖礦是(shì)一(yī)≤₹λ種新發行(xíng)比特币的(de)過程,"☆當前,每挖到(dào)一(yī)個(gè)礦,礦工(gōn∏α'g)會(huì)得(de)到(dào)系統獎勵的(de)λγ≥12.5個(gè)比特币,按目前一(yī)個(g"‌è)比特币接近(jìn)一(yī)萬美(měi)元的(de)市(shì×≈‌α)價,這(zhè)就(jiù)是(shì)一(yī↔<σ→)筆(bǐ)12.5萬美(měi)元的(de)巨款。此↓±外(wài),礦工(gōng)還(hái)可(kě)以獲得(de)本區(ε✘©qū)塊中所有(yǒu)的(de)交易費(fèi),舉例來(lá←• i)說(shuō),在高(gāo)度為(wèi)5☆§§12587的(de)區(qū)塊中,幸運的(de)礦工(gōng)總共收獲了(¥βle)12.829個(gè)比特币。正因如(rú)此,礦工(gō∏ε£ng)之間(jiān)的(de)競争十分(fēn)激烈,采礦的(d♠∑✔e)難度與礦工(gōng)間(jiān)激烈的(de)競争±™是(shì)比特币安全的(de)重要(yào)保證,ε • 因為(wèi)這(zhè)樣可(kě)以保證Ω$'沒有(yǒu)壞人(rén)能(néng)操縱系統。

 

點對(duì)點網絡

 

比特币并沒有(yǒu)一(yī)個(gè)中央服務器(qì),相(xiàn‌♦₹>g)反,比特币在一(yī)個(gè)點對(↔₩duì)點網絡中運行(xíng)。如(rú)果你ασβ(nǐ)運行(xíng)一(yī)個(gè)比特币節點,那(nà)你σ$(nǐ)就(jiù)成了(le)網絡的(de)一(yī)部分(f£γ¶ēn)。比特币網絡中的(de)節點彼此交換自 ≠​(zì)己存儲的(de)交易,區(qū)塊,以及IP地(dì)址信息σ↕₽↕(用(yòng)于節點間(jiān)建立©>連接互相(xiàng)通(tōng)信)。±®當你(nǐ)第一(yī)次連接到(dào)比特币網絡,你(nǐ)的(deδ×∏™)節點會(huì)從(cóng)随機(jī)挑選的(de)節點中↑≈€©下(xià)載區(qū)塊鏈的(de)信息。反過來(lái)§Ω,你(nǐ)的(de)節點也(yě)會(huì)向後加入者提供信息。當你←♦♥≈(nǐ)要(yào)創建一(yī)筆(bǐ)比特币交易時‌§↕≥(shí),你(nǐ)要(yào)把這( ₹&​zhè)筆(bǐ)交易發送給一(yī)些(xiē)節點,這(zhè)些(x₹™iē)節點會(huì)在比特币網絡中廣播這(zhè)筆(bǐ)交↓δ‍易,直到(dào)全網都(dōu)收到(dào)這($¶☆zhè)筆(bǐ)交易。礦工(gōng)  們會(huì)收集你(nǐ)的(de)交易信息,生(shēng)™¥≥成一(yī)個(gè)含有(yǒu)你(nǐ)這(zhè)筆(bǐ)交易的(d±×e)區(qū)塊,向全網廣播,這(zhè)Ω​♠'時(shí),你(nǐ)的(de)節點也(yě)會☆÷(huì)收到(dào)這(zhè)個(gè)區(qū)塊信息,通​€(tōng)過驗證,這(zhè)筆(bǐ)交易被'₩加入到(dào)了(le)區(qū)塊鏈中,你(nǐ)就(jiù)交易成功了(ε≈λ≥le)。 

 

加密技(jì)術(shù)

 

現(xiàn)在回到(dào)證明(míng)比特币賬戶是(₩♥ ★shì)誰的(de)這(zhè)個(gè)問(wèn)題。比特₽"₽ 币使用(yòng)數(shù)字簽名技(jì)術(shù)以确保隻有(yǒu™ε∑>)比特币賬戶的(de)所有(yǒu)者才能(néng)☆®使用(yòng)賬戶中的(de)比特币。比特币地(dì)址 ×↕的(de)所有(yǒu)者擁有(yǒu)與該地(dì)址相(x€‌iàng)匹配的(de)私鑰,當花(huā)費™↕ (fèi)比特币時(shí),你(nǐ)用<£δ₹(yòng)要(yào)這(zhè)個(gè)私鑰在交易上(shàng)♦β簽名,證明(míng)自(zì)己是(sh₹<ì)這(zhè)個(gè)賬戶的(de)所有(yǒu)者。這(zhè)有(yǒ₽÷ ₽u)點像現(xiàn)實生(shēng)活中的(εγ &de)蓋章(zhāng),蓋章(zhāng)就(jiù)意味著(zhε e)授權。怎麽驗證呢(ne),公鑰與比特币賬戶相(xiàng)關聯,♦✘↕Ω用(yòng)公鑰就(jiù)可(kě)¥≥‌±以驗證簽名是(shì)否正确。這(zhè)樣就(jiù)解決了₹← (le)比特币賬戶是(shì)誰的(de)這¥ε<(zhè)個(gè)問(wèn)題。

 

怎麽來(lái)區(qū)分(fēn)不(bù)同的(de)交易呢(ne)?交♠‍易和(hé)區(qū)塊都(dōu)使用(y↔γ δòng)密碼學上(shàng)的(de)哈希值進行(xíng)索引,是(shì'≠)不(bù)是(shì)有(yǒu)點耳熟,對(du★₽ì),在比特币協議(yì)中,多(duō)處™π $使用(yòng)到(dào)了(le)哈希函數(shùλ∏β),礦工(gōng)們剛才算(suàn)的(de)數(sαΩγhù)學題就(jiù)是(shì)在算(suàn)哈希函數(shù)。

 

比特币協議(yì)探究

 

在接下(xià)來(lái)的(de)文(wén)章(zhāng)裡(lǐ✔∑ ),我将逐步介紹我是(shì)怎樣手動進行(xíng)一(yī)次比特币'≥γ交易的(de)。首先,我生(shēng)成了(le)一(yī)個(gè×¥)比特币賬戶以及對(duì)應的(de)公鑰,私鑰。接下(xià)來(lái§•)我發起了(le)一(yī)筆(bǐ)比☆≤♣特币交易,我向這(zhè)個(gè)新生(φ‌shēng)成的(de)賬戶轉了(le)一(yī)¥∑☆小(xiǎo)筆(bǐ)比特币。期間(jiān∞≤)手動簽署這(zhè)筆(bǐ)交易很(hěn)困難,它花(huā)費(→₩φfèi)了(le)我很(hěn)多(duō)的(d"πe)時(shí)間(jiān)。最後,我将這(zhè)筆(™λ→∏bǐ)交易發送到(dào)比特币網絡,等待它被加入區(qū)塊鏈。本‌π¥文(wén)的(de)其餘部分(fēn)會(huì)詳細地(dì∞¥≥ )介紹這(zhè)些(xiē)步驟。

 

事(shì)實證明(míng),手動進行(xí"​λ₩ng)比特币交易比我想象中的(de)更加困難。正如(rú∞↓λ)你(nǐ)所看(kàn)到(dào)的(de),比特币的(de)✘‍∞協議(yì)有(yǒu)些(xiē)許混亂:它使用(yòng)了(le)大≠σ(dà)端格式數(shù)字(高(gāo)位編址,将高(gāo)序字節∞★£ 存儲在起始地(dì)址),小(xiǎo)端格式數(shù)字(低(dī)位♦​編址,将低(dī)序字節存儲在起始位置),固定長(cháng)度數(shù→★✘)字,可(kě)變長(cháng)度數(shù)字,自(zì)定義編碼格式,α€₩DER編碼格式以及各種加密算(suàn)法。因 β≈¶此,僅僅是(shì)将數(shù)據轉換為(wèi)正确的(de)格式就(j≈&≠₹iù)浪費(fèi)了(le)很(hěn)多(duō)時(shí)間±¥$§(jiān)。

 

我遇到(dào)的(de)第二個(gè)難題就(jiù)是(←‍πshì)加密,嘗試一(yī)下(xià)手動加≥♦密,你(nǐ)就(jiù)會(huì)發現(xiàn¶φ)密碼學對(duì)人(rén)們多(duε↑σō)不(bù)友(yǒu)好(hǎo),甚至可(kě)以‌™說(shuō)是(shì)無情。即使你(nǐ)隻輸錯(cuòλ÷☆λ)了(le)一(yī)個(gè)字節,交易就(jiù)會(→ πhuì)因出錯(cuò)被拒絕,而且它不(bù)會(huì)告訴你(λ₹★☆nǐ)哪裡(lǐ)出錯(cuò)了(le),你(nǐ₹δ)隻能(néng)重來(lái)。

 

最後,手動簽署交易的(de)過程也(yě)比想象中難↑ ↔得(de)多(duō),簽署交易時(shí)每個(gè)環節都(dōγ↕‍u)必須零失誤,要(yào)麽又(yòu)要(yào)→≈€ 退回重來(lái)。

 

比特币地(dì)址和(hé)密鑰

 

第一(yī)步,我創建了(le)一(yī)個(gè)比特币地(dì)址。通© φ(tōng)常情況下(xià),人(rén)們都(dō★'©☆u)是(shì)使用(yòng)比特币客戶端軟件(ji™×♠àn)來(lái)創建比特币地(dì)址和(hé)σφ™與之相(xiàng)關的(de)密鑰。本著(zhe)學習(x÷≠í)的(de)态度,我寫了(le)一(yī)些(xiē)Python代碼來(₩∏©✔lái)生(shēng)成比特币地(dì)址,從(c×♣óng)而揭示地(dì)址創建的(de)機(jī)理(lǐ)。

 

比特币使用(yòng)了(le)一(yī)系列的(de)‍♥∏密鑰和(hé)地(dì)址,下(xià)圖解釋了(le)它們的(d¥<≈e)關系。首先你(nǐ)要(yào)創建一(yī)個(gè₩♣)随機(jī)的(de)256位的(de)私鑰,這(zhè)個(g←∏è)私鑰用(yòng)于在花(huā)費(fèi)比特→β币時(shí)簽署交易。因此,私鑰必須保密,否則你(nǐ)的(de)比特币可€€♦(kě)能(néng)會(huì)被盜用(yòn"☆•g)。

 

橢圓曲線數(shù)字簽名算(suàn)法(Elliptic Curve ≥ΩDigital Signature Algorithm,EC≈®÷₽DSA,美(měi)國(guó)政府的(de)标準 ™ ,接下(xià)來(lái)我們會(huì)Ω∑βφ討(tǎo)論它)會(huì)從(cóng)私鑰中生(shēng)成↔↓​一(yī)個(gè)512位的(de)公鑰,這(zhè)個(gè)ε♣∏公鑰用(yòng)于驗證交易的(de)簽名。但(dà★©÷n)不(bù)方便的(de)是(shì),比特币協議(yì)中需要>≥γ≈(yào)在這(zhè)個(gè)公鑰上(shà€♥™ng)添加了(le)前綴04,這(zhè)個(gè)公鑰在交易簽署之前不(≠£bù)會(huì)被洩露,不(bù)像其它δ↓¶系統中公鑰就(jiù)是(shì)為(wèi)了(le)公之于衆的(d ‍•®e)。

 

比特币地(dì)址與公鑰的(de)關系

 

下(xià)一(yī)步就(jiù)是(shì)生(shēng)成與他>δ(tā)人(rén)交易時(shí)使用(yòng)的(π<♦€de)比特币地(dì)址了(le)。512位的(de)公鑰¥↔™σ太長(cháng)不(bù)方便使用(yòng),因此∏≤使用(yòng)SHA-256和(hé)RIPEMD哈希算(suàn​☆αφ)法将其縮小(xiǎo)為(wèi)160位。然後使用(yò£→¶γng)比特币定義的(de)Base58Check 編碼将密鑰編碼為 Ωσ(wèi)ASCII(American Stand± ard Code for Information Interc$αφ≤hange,美(měi)國(guó)信息交換标準代碼)格式。¥γ得(de)到(dào)的(de)地(dì)‌​♥&址(例如(rú)上(shàng)文(wén)∑₩中的(de):1KKKK6N21XKo4£¶β8zWKuQKXdvSsCf95ibHFa)就(≠‍&™jiù)是(shì)你(nǐ)接收别人(rén)​®比特币時(shí)要(yào)發布的(d Ω$&e)地(dì)址。需要(yào)注意的(de)是(shì),你(✘®nǐ)無法從(cóng)比特币地(dì)址中複原出公鑰或私鑰。如(rú© φ)果你(nǐ)丢失了(le)你(nǐ)的(de)私鑰(比如(rú)≈<說(shuō)你(nǐ)把私鑰存在你(nǐ)的(₽¶♦←de)硬盤上(shàng),但(dàn)硬盤丢失),你(nǐ✔¥)的(de)比特币将永遠(yuǎn)丢失。

 

最後,錢(qián)包交換格式密鑰(WIF)用(yòng)于将私鑰添加¶☆到(dào)你(nǐ)的(de)錢(qiá  ₩₽n)包軟件(jiàn)中,這(zhè)隻是(shì)将私鑰進行("☆φxíng)Base58Check編碼轉換為(wèi)ASCII格式,這(z±$hè)一(yī)步是(shì)可(kě)逆的(de),而且很(hěn)容易經§"•↑過逆變換恢複出256位的(de)私鑰。(圖中有(yǒu)我的(de)私​λ鑰,我很(hěn)好(hǎo)奇是(shì)否有(yǒu)人(rén)會(h↔‍​<uì)用(yòng)我的(de)私鑰去(qù)偷(通(‌επ<tōng)過私鑰簽署交易,從(cóng)而轉走)λ‌♠我那(nà)價值80美(měi)分(fēnδ↑)的(de)比特币,然而真有(yǒu)人(rén)那(nà)麽做(zuò>↕®)了(le),可(kě)以在

https://blockchain.info/address/1KKKK6N‍​↔☆21XKo48zWKuQKXdvSsCf95ibHFa 看↔♥•(kàn)到(dào),也(yě)算(suàn)是(shì)為(wèi÷♣♣↓)教學做(zuò)貢獻了(le)。)

 

總之,共有(yǒu)三種密鑰:私鑰,公鑰,公鑰的(de)哈​✘α希值,經過使用(yòng)Base58Check編碼,它們對(duì≤§)外(wài)都(dōu)是(shì)以AS→←CII格式表示。私鑰是(shì)其中最重要(y₩♥&ào)的(de)密鑰,因為(wèi)花(huā)費(fèi)©ε比特币時(shí)需要(yào)私鑰簽署交易,$δ而且其他(tā)的(de)密鑰都(dōu)可(kě‍↕)以從(cóng)私鑰中産生(shēng)。公鑰的(de)哈希值就(ji≥ε→™ù)是(shì)你(nǐ)們剛看(kàn)的(de)的(de)比特币∏∑地(dì)址。

 

我使用(yòng)下(xià)面的(de)代碼片段來¥¥(lái)生(shēng)成WIF格式的(de)私鑰和(hé)≤'♦地(dì)址。私鑰隻是(shì)一(yī)個(gè)随機(jī)的(de)2£π56位的(de)數(shù)字,使用(yòng)橢圓曲線數(shù)§∏♠字簽名算(suàn)法從(cóng)私鑰中生(shēng ÷‍∞)成公鑰,公鑰使用(yòng)SHA-25≥​α✘6算(suàn)法,RIPEMD-160算(suàn)法→↕÷φ進行(xíng)哈希計(jì)算(suàn),再經Base58編碼并進•↔↓ 行(xíng)校(xiào)驗後得(de)到(dào)比特币地(dì→¶♥★)址。最後,私鑰用(yòng)Base58Check編碼以生(shēn≈↑¶g)成用(yòng)于将私鑰輸入錢(qián)包軟件(jiàΩ<n)的(de)WIF編碼。注意,這(zhè)段Python随機(jī)函δ©數(shù)代碼在密碼學上(shàng)安全性并©≥ 不(bù)高(gāo),如(rú)果你(nǐ)想要(yào)嘗試這(z ≈hè)一(yī)步驟,建議(yì)使用(yòng)更安εγ€全的(de)錢(qián)包軟件(jià₹☆☆Ωn)來(lái)生(shēng)成比特币地(dì)址和(hé)密™₩ε鑰。

 

def privateKeyToWif(key_hex):σ♣α        ₽φ→return utils.base58CheckEnc₽φ↔ode(0x80, key_hex.decode(✔✔'hex'))    •©;def privateKeyToPublicKey(s): &¥✘≠δnbsp;  sk = ecdsa.Sδ±↓↑igningKey.from_string(s.decode(&₽☆¥•#39;hex'), curve=ecdsa.SECP256k1) §<   vk = sk.verifying&♠ _key    
   return ('\04&¥★$≤#39; + sk.verifying_key¥≥.to_string()).encode(←★→'hex')  
 def pubKeyToAddr(s):   &>∏nbsp;ripemd160 = hashlib.new('r≥​‍&ipemd160')    ripemd160.₩φ✘update(hashlib.sha256(s.decode‌•φ('hex')).dige$®≤¥st())    
   return utils.base58Chec​∑kEncode(0, ripemd160.dig≤γλest())

def keyToAddr(s):    
   return pub£©→KeyToAddr(privateKeyToPubl∞↔≈icKey(s))

# Warning: this random function$γ is not cryptographically strong an&★♠'d is just for example
private_key = ''.jo•<×βin(['%x' % rando©©↑★m.randrange(16) for x ≠♦™in range(0, 64)]) pr♥↕'int keyUtils.privateKey§​≈ToWif(private_key) print keyUtilγ✘♣s.keyToAddr(private_key)

keyUtils.py

 

從(cóng)內(nèi)部分(fēn)析一(yī)筆(bǐ)交←Ω✔$易

 

交易是(shì)比特币系統的(de)基本操作(zuò),也(  §‌yě)許你(nǐ)會(huì)認為(wèi)交易就(jiù)是(shì)簡✘₽©γ單地(dì)把比特币從(cóng)一(yī)個(gè↓✘•)地(dì)址轉移到(dào)另一(yī)個(g £ è)地(dì)址,但(dàn)交易其實并不(bù)簡單。一(yī)¥₩φ筆(bǐ)交易包含一(yī)個(gè)或多¶↓↓(duō)個(gè)輸入和(hé)輸出,交易中的(de)每個(gè)輸入的→∏♠(de)地(dì)址都(dōu)提供比特币$βΩ,每個(gè)輸出的(de)地(dì)址都(dōu)接受比特币。

 

一(yī)筆(bǐ)簡單的(de)比特币交易,交易C花(h✘'uā)費(fèi)了(le)從(cóng)交易A和↕↓β∞(hé)交易B獲得(de)的(de)0.0​φ08個(gè)比特币,其中0.001個(gè)比特币被當作(zuò)交易費÷π¥γ(fèi)付給礦工(gōng)

 

上(shàng)圖顯示了(le)一(yī)筆(bǐ)簡單的(de)比特币交♠"♠易“C”,在這(zh‍≤≤ è)筆(bǐ)交易中,有(yǒu)0.005‌≤δφ個(gè)比特币是(shì)在交易A中獲得(de)的(de),0.003&♠€個(gè)比特币是(shì)在交易B中獲得(de)的(de)。(€©圖中箭頭是(shì)由新交易的(de)輸入指向得Ω☆≈(de)到(dào)這(zhè)些(xiē)比特币&  §的(de)交易的(de)輸出,所以比特币的(d∑λ±>e)流向是(shì)逆著(zhe)箭頭方向的(de)。)對(™♣duì)于輸出,有(yǒu)0.003個(gè)比特币給了(lα♥e)第一(yī)個(gè)比特币地(dì)址,有(yǒu)0δ≤.004個(gè)比特币給了(le)第二個(gè)比特币地(↑γdì)址,剩餘的(de)0.001個(gè)比特币作(zuò)為(wèi ±←&)交易費(fèi)付給礦工(gōng)。請(qǐng)注意,本次交易并沒有(y✘®​ǒu)影(yǐng)響到(dào)在交易A中另一(yī)個(gè"★ )輸出為(wèi)0.015的(de)比特币。 

 

在一(yī)筆(bǐ)交易中,輸入的(de §)比特币地(dì)址必須花(huā)出所有(yǒu)的(de)比特¶♣♥币,假如(rú)你(nǐ)在之前的(de)交易收到(dào)了(le)100個≈↓(gè)比特币,但(dàn)你(nǐ)隻想花(h÷☆↔uā)1個(gè)比特币,創建這(zhè)筆(bǐ)交易你(±≥nǐ)必須花(huā)完所有(yǒu)的(de'±♣©)100個(gè)比特币,那(nà)剩下(xià)的£≥&(de)99個(gè)比特币怎麽辦呢(ne)?解÷≤α 決方案就(jiù)是(shì)在交易中再增加一(yī)個(gè)輸出,将↓<剩餘的(de)99個(gè)比特币轉給自(zì)己。這(zhè)樣你(nǐ)就₹×"(jiù)可(kě)以花(huā)費(fèi™ )任意數(shù)額的(de)比特币。 

 

通(tōng)常交易要(yào)支付交易費(fèi),如(rú)果一(y&×'ī)筆(bǐ)交易中輸入的(de)比特币總和(h"→≤é)大(dà)于輸出的(de)比特币的(de)總和(hé),剩餘≈₽ 的(de)費(fèi)用(yòng)就( ±↕γjiù)是(shì)給礦工(gōng)的(de)交易費(fèi)。這( ₩↕zhè)筆(bǐ)費(fèi)用(yòng)并沒有(yǒu)明(míng)确要♦§¥™(yào)求,但(dàn)是(shì)對(duì)于礦工(gōng)而言,₩××沒有(yǒu)交易費(fèi)的(de)交&₽ 易就(jiù)會(huì)被列為(wèi$✘✘)低(dī)優先級交易,可(kě)能(n" ✘πéng)要(yào)等上(shàng)幾天才會(huì)被處理(lǐ)甚至被礦"&π>工(gōng)直接丢棄。交易費(fèi)通(tōng)≤'常并不(bù)高(gāo),但(dàn)它可(kě)能(n≤→éng)影(yǐng)響著(zhe)你(ε∏nǐ)的(de)交易。

 

手動創建一(yī)筆(bǐ)交易

 

如(rú)下(xià)圖所示,在我的(de)實驗中我發起了(&★≤πle)一(yī)筆(bǐ)隻有(yǒu)一(yī)個(gè)輸入一(yī)個♠★(gè)輸出的(de)交易。我在Coinbase上(sh✔βàng)買了(le)一(yī)些(xiē)比特币,并↓> 将0.00101234個(gè)比特币放(fàng)入地(dì)址:

1MMMMSUb1piy2ufrSguNUdFmAcvqrQF8M5中,這∞¥(zhè)筆(bǐ)交易哈希為(wèi):

81b4c832d70cb56ff95758975&>÷₹2eb4125a4cab78a25a8fc52d6β ‌a09e5bd4404d48,我的(de≥←‌±)目标是(shì)創建一(yī)筆(bǐ)交β δ易,将這(zhè)些(xiē)比特币轉入我的(de€☆π₹)另一(yī)個(gè)地(dì)址:

1KKKK6N21XKo48zWKuQKXdvSsCf ↓®95ibHFa,扣除0.0001個(gè)比特币♠>÷≤的(de)交易費(fèi)後,目标地(dì)址¶≠>±将獲得(de)0.00091234個(gè)比特币。

比特币交易結構實例

 

 Blockchain.info上(shàng♦♦↑)的(de)交易記錄

https://blockchain.info/addres$β∞s/1MMMMSUb1piy2ufrSguNUdFmAcvqrγ€φ'QF8M5?filter=4

 

按照(zhào)協議(yì)标準,創建這(zhè)£₩↕>筆(bǐ)交易很(hěn)簡單。如(rú)下(xià)表所示,←σ這(zhè)筆(bǐ)交易隻有(yǒu)一(yī)個(gè)輸入¶‌γ•,源自(zì)于81b4c832d70cb56ff957589752eb41 <≥25a4cab78a25a8fc52d6a09e5bd4404d4↑€☆8中的(de)輸出0(第一(yī)個(gè)輸出)。輸出為(wèi)0.00 σ091234個(gè)比特币(91234在十六進制(zhì)中用©♥ ♣(yòng)0x016462表示),它以小(‌♠xiǎo)端格式存儲在值區(qū)域中。加♠ε密過程中的(de)scriptSig和(hé)scriptPubK₹‍¶∑ey較為(wèi)複雜(zá),我們稍後再做(zuò)Ω€​討(tǎo)論。

version

01 00 00 00

input count

01

input

previous output hash(reverε•sed)

48 4d 40 d4 5b 9e a0 d6 52 fc a8 25 ©λ8a b7 ca a4 25 41 eb ™‌♠ 52 97 58 57 f9 6f b5 0c d7 32 c8 b4♥≈≥ 81

previous output index± ™

00 00 00 00

script length

 

scriptSig

script containing signature≥φε 

sequence

ff ff ff ff

output count

01

output

value

62 64 01 00 00 00 00 00

script length

 

scriptPubKey

script containing destination a>φεddress

block lock time

00 00 00 00

這(zhè)是(shì)我生(shēng)成交易使用(y×€òng)的(de)代碼,這(zhè)段代碼隻是(shì)把數(shù)據打包>÷≠成二進制(zhì)文(wén)件(jiàn)。★∏×簽署交易較為(wèi)困難,我們等一(yī)會∏♥♦≠(huì)兒(ér)再說(shuō)。

 


 

# Makes a transaction ♣∑₹↔from the inputs# outputs is a list ↑₩$₩of [redemptionSatoshis, outputφ↓±♥Script]
def makeRawTransaction(outputTransφ→actionHash, sourceIndex, scriptSig ', outputs):    ε©✔♣
        &n₽♥♦bsp; def makeOutput(data):  α‌>≈       &nb↑•sp;     redemptionSatosh∑≈is, outputScript = data
          ​‌     return (struct.←≈pack("<Q"$×±&;, redemptionSatoshis).encod↔±$e('hex') +
     π®±>         &#≤× ←39;%02x' % len(outpu''tScript.decode('he≥≈  x')) + outputScript) σ         &nbγ€↓sp; formattedOutputs =αδ ''.join(map(makeOutpu•σ₽t, outputs))
         →↓β ; return (    £‌♠✘    
         γ↑☆←     "0100000¶ π'0" + # 4 bytes version ±∞↑          &nb™☆≈ sp;   "01" + # v≠→£arint for number of inputs   <α        ♣λπ​     outputTra↑≥λσnsactionHash.decode('hex↔π9;)[::-1].encode('hex&#£>δ★39;) + # reverse outputT§®×ransactionHash       &nb πsp;     φ"  struct.pack('<L&#εσ↔39;, sourceIndex).encode('hex‌♥') +      ♠•♠∑;  
        &nbs↔≠÷p;     '%02x' % ↑↕σlen(scriptSig.decode(₹β→β9;hex')) + scriptSig +   ®€     
          &nb¥←←​sp;   "fffff¶​"fff" + # sequence   •≈±¥        &nb'™™Ωsp;   "%02x" %★  len(outputs) + # number of outputs  ☆          &βαnbsp;   formattedOutputs +   ✘Ω     
      &nbs≥∞p;      ÷∞® "00000000" # l↔‍ ockTime
          ✘¥α&    )

txnUtils.py

 

比特币交易怎樣簽署

 

下(xià)圖為(wèi)我們簡單描述了(le)交易是( ≥∏shì)如(rú)何簽署并相(xiàng)互連接的(∏™"de)。針對(duì)中間(jiān)這(zhè)筆(bǐ)從(c∞₩↔♠óng)比特币地(dì)址B轉賬到(dào)比特币地(dì)址Ω♠<€C的(de)交易。交易的(de)內(nèi)容(包括前一(yī)個↓β←(gè)交易的(de)哈希值(索引))被進行(xíng)哈希計(jì)算(★πsuàn)并用(yòng)B的(de)私‌φπσ鑰簽名。另外(wài),B的(de)公鑰也(yě)被包含在了(le)交易中。ε≈← 

 

通(tōng)過執行(xíng)幾個(gè)簡單運算(suàn),任何人(♠'rén)都(dōu)能(néng)驗證B是(shì)否簽署了(le)這(z "<hè)筆(bǐ)交易。首先,B的(de)公鑰與之前收到(dào)這↔"↕(zhè)筆(bǐ)比特币交易的(de)地(dì>∏)址做(zuò)驗證,證明(míng)B的(de)公鑰有(y★•ǒu)效。(正如(rú)前面所說(shuō)的(de),地(dì☆‍γ)址很(hěn)容易從(cóng)公鑰中計(jì)算(suàn)獲得(d↑​e))。接下(xià)來(lái),可(kě)以通(tφσΩōng)過B的(de)公鑰驗證B交易簽名的(de)真僞¥±☆↕。這(zhè)些(xiē)步驟能(néng)确保交易的(de)有(yǒu)α₩效性和(hé)交易得(de)到(dào)B的(de)授權。比特币于♠≤衆不(bù)同的(de)一(yī)點是(shì),B的(de)公鑰在B發起交₽≥±易之前是(shì)不(bù)公開(kāi)的(∏§ ¥de)。 

 

在比特币系統中,比特币通(tōng)過區(qū)塊鏈上(♣δshàng)的(de)一(yī)筆(bǐ)筆(b≠←¶ǐ)交易在不(bù)同的(de)地(dì)址間(jiān)傳遞。區(q✔☆♠←ū)塊鏈上(shàng)的(de)每一(yī)筆(bǐ)交易都(dōu)能(n∏ →éng)被驗證以确保比特币交易的(de)有(yǒu)效性。

 

比特币腳本語言

 

你(nǐ)可(kě)能(néng)會(huì)以為(wè &i)僅僅通(tōng)過在交易內(nèi)容中附上(shàngφ×)簽名就(jiù)可(kě)以簽署比特币交易,其實不(bù)然,≥∏¥這(zhè)個(gè)過程十分(fēn)複雜(zá)。實±↕際上(shàng),每一(yī)筆(bǐ)交易中都(dōu'↑)包含一(yī)個(gè)“小(xiǎo)程序&rdqu♣§πo;,用(yòng)于确認交易是(shì)否有(yǒu)效。這(÷•©zhè)個(gè)“小(xiǎo)程序”用(yòng)↓¥™±腳本語言寫成,通(tōng)過這(zhè)種基于堆棧的(de)比特币腳本語言σ​∏™,我們可(kě)以應對(duì)許多(duō)複雜(zá)的(de)比特币支付​↔場(chǎng)景。例如(rú),托管系統可(kě)以設定隻‍≥&要(yào)經過三分(fēn)之二的(de)α​¥π用(yòng)戶授權,就(jiù)可(kě)執行(xíng×€')交易的(de)規則,也(yě)可(kě)以設置其他σ♣€≠(tā)的(de)合約。 

 

腳本語言十分(fēn)複雜(zá),大(dà)約有(y>®↕≥ǒu)80種操作(zuò)碼,包括算(suàn)數(shù)計(jì)€ ≤ 算(suàn),按位操作(zuò),字符串處理(lσ"ǐ),條件(jiàn)語句和(hé)堆棧操作(zuò)。腳本語言' $也(yě)包含一(yī)些(xiē)必要(yào)δ$€的(de)密碼學操作(zuò)(SHA-256,RIPEMD等等)作(zuò)✘ε為(wèi)原語(原語是(shì)執行(xíng)過程中不(bù≥σ)可(kě)被打斷的(de)基本操作(zuò),你(nǐ)可(kě)以理(÷¥££lǐ)解為(wèi)一(yī)段代碼)。為(wèi)了(le)确保腳本語×<言可(kě)以運行(xíng)完畢自(zì)動退出,‍÷∏該語言不(bù)支持任何循環操作(zuò),因此它不(bù)是(shì)圖"♦靈完備的(de)。然而,實際上(shàn∞§‍εg),它隻支持少(shǎo)數(shù)類型的(de)交易。&nbs↓♦$p;

 

前一(yī)個(gè)交易中的(de)腳本 ​Ω稱為(wèi)scriptPubKey,當前交易中的(de)腳本稱為(wèi₹≤)scriptSig。要(yào)驗證交易時(s>↔±hí),先執行(xíng)scriptSig,然後再執行(xín>↔∑g)scriptPubKey。如(rú)果‌λ ∏兩個(gè)腳本都(dōu)成功執行(xíng),交易就(jiù§®§π)被認定為(wèi)有(yǒu)效,交易中的(de)比特¶£σ币就(jiù)可(kě)以成功花(huā)Ω€出。否則,交易無效。要(yào)注意的(de)是(shì)前一(yī)個(♦§≤gè)交易中的(de)scriptPubKey規定了(le)花(huā)費$¶(fèi)比特币的(de)條件(jiàn),當前交易的(de×λ)scriptSig必須滿足這(zhè)個(gè)條件(jiàn)。 '♥ ₹;

 

在一(yī)個(gè)标準的(de)交易中,scri✔‌‌ ptSig腳本将從(cóng)私鑰中生(shēng)成的(de) λ簽名并壓入堆棧中,再壓入公鑰。接下(xi‌®λ₩à)來(lái)scriptPubKey腳本會(huì♥λ)執行(xíng)運算(suàn)先驗證公鑰≠♥δ的(de)有(yǒu)效性,再驗證簽名的(de)有(yǒu)™♣↑≈效性。

 

正如(rú)腳本中所表示,scriptSig:

 


 

PUSHDATA
signature data and SIGHAS•§§★H_ALL
PUSHDATA
public key data

 

scriptPubKey:

 


 

OP_DUP OP_HASH160 PUSHDATA Bitcoin add♦¶ress (public key hash) OP_EQUALVE™≠≤RIFY OP_CHECKSIG

 

當這(zhè)段代碼執行(xíng)時(shí),PUSHDATA&☆ ©操作(zuò)首先會(huì)把簽名壓入堆棧,接著(zheΩ♠$™)把公鑰壓入堆棧。OPHASH-160操作(zuò)計(jì)算(♥•suàn)公鑰的(de)160位哈希值,PUSHDATA操作(zuò)再←™把交易中的(de)輸入地(dì)址(輸入賬号)壓入堆棧,然後,OP-EQα♥βλUALVERIFY操作(zuò)驗證驗證前兩個(gè)堆棧中的¥∑(de)值是(shì)否相(xiàng)等(驗證這(zhè)筆(bǐ)δ♣↓∞交易中你(nǐ)使用(yòng)的(de)比特币是(shì)否≤←屬于你(nǐ)自(zì)己)-如(rú)果公鑰的(∑≠→de)哈希等于之前交易中的(de)輸出地(dìφ↕)址,這(zhè)就(jiù)證明(míng)公鑰是×★(shì)有(yǒu)效的(de)(證明(☆ míng)這(zhè)個(gè)比特币是×≥(shì)你(nǐ)的(de))。最後,OP_CHE‍•∑CKSIG操作(zuò)将檢查交易的(de)簽名是(s↔±→βhì)否與堆棧裡(lǐ)的(de)公鑰和(hé)簽名匹配,匹✔±• 配就(jiù)證明(míng)簽名是(shì)有(yǒ≠α±u)效的(de)(證明(míng)交易的$φ(de)到(dào)了(le)你(nǐ)的(de)授權)

 

簽署交易

 

我發現(xiàn)簽署這(zhè)筆(bǐ)交易是(shì)'"☆λ手動使用(yòng)比特币時(shí)最難的(de>π)地(dì)方,這(zhè)一(yī)過程出奇地(dì)困難且​α容易出錯(cuò)。簽名的(de)基本思想很(hěn)簡單,使★ ∑δ用(yòng)橢圓曲線簽名算(suàn)↔♣σ★法和(hé)私鑰來(lái)生(shēng)成交易的(de)數Ωγ↔λ(shù)字簽名,但(dàn)細節非常棘手。簽署交易的(de)過程可(kě)©π以通(tōng)過這(zhè)19個(gè)步驟描述。

 

 

簽署交易的(de)19個(gè)步驟

 

對(duì)交易的(de)簽名讓我面臨巨大(dà)的(de)挑戰,這(zhèγ★)涉及到(dào)一(yī)個(gè)如(rú)何在交易內(€γnèi)容中還(hái)沒有(yǒu)加入簽名時(sh≈₹♥‌í)簽署這(zhè)筆(bǐ)交易的(de)問(wèn)題。為(wèi)® 了(le)避免這(zhè)個(gè)問(‌÷wèn)題,在計(jì)算(suàn)生(shēngπ )成簽名之前,我把scriptPubKey這δ≤♥(zhè)個(gè)腳本從(cóng)上(shànΩ®£☆g)一(yī)筆(bǐ)交易複制(zhì)β 到(dào)當前交易中(當前這(zhè)筆(bǐπ•₩)交易正在被簽署),然後将簽名轉換為(wèi)腳本語言的(de)代碼,創建嵌入 ∑$α在當前交易中的(de)scriptSig腳本。對(duì)于具有(yǒu)多←±♦(duō)個(gè)輸入的(de)交易,簽署交易環節更加複雜(​>zá),因為(wèi)每個(gè)輸入都(dōu)需要(yào)單獨Ω♠ ÷的(de)簽名,這(zhè)裡(lǐ)我就(≠$jiù)不(bù)做(zuò)詳細討(tǎ‌♣"♦o)論了(le)。

 

哈希值這(zhè)一(yī)步驟難倒了(le)我。在簽€¥名之前,交易中有(yǒu)一(yī)個(gè)‍$臨時(shí)附加的(de)哈希值常量。對(duì)于常規↔£的(de)交易,這(zhè)個(gè)值是(shì)>↔≤ SIGHASH_ALL(0x00000001)。簽名後,這(zh♠♠σ↑è)個(gè)哈希值将從(cóng)交易內(nèi)容的(de)最後删 ε除,附加到(dào)scriptSig腳本中。

 

在比特币中另一(yī)件(jiàn)令人(rén)討(tǎo≈↑β)厭(yàn)的(de)事(shì)情是(shì)雖然簽名和(hé)公鑰都(d₹π↔↔ōu)是(shì)512位的(de)橢圓曲線值,但(dàn)它們的(de)表✔≤示方式完全不(bù)同:簽名用(yòng)D®✘↑×ER編碼方式編碼,而公鑰用(yòng)純字節表示。另外(wài),兩個(↓<÷gè)值都(dōu)有(yǒu)一(yī)個(gè)額外(∏☆♠≈wài)的(de)字節,但(dàn)位置并不(bù)一(yī)緻:α ✔↕SIGHASH_ALL這(zhè)個(gè)附加♣™的(de)哈希值常量放(fàng)在簽名後面,而04這(•&♠♠zhè)個(gè)值放(fàng)在公鑰前面‍§✘。

 

由于ECDSA算(suàn)法需要(yào)使用(yòng)随機(jΩ←ī)數(shù),所以調試簽名十分(fēn)困難。<π✘每次計(jì)算(suàn)出的(de)簽名都(dōu)會(huì) <有(yǒu)所不(bù)同,因此無法與已知(z ‍hī)正确的(de)簽名進行(xíng)比較。

 

正是(shì)由于上(shàng)述的(de)複雜(zá)性,我花£±(huā)了(le)很(hěn)長(cháng)時(shí≤≥)間(jiān)才得(de)到(dào)了(le)一(yī)個↓π→↕(gè)簽名。不(bù)過,最終我找出了(le)簽名代碼中所有(yǒu)的(§<©♥de)錯(cuò)誤,并成功用(yòng)它簽署了(le)一($∞ &yī)筆(bǐ)交易。這(zhè)是(shì)我使用(yòng)的(dεσ₩♦e)簽名代碼:

 

def makeSignedTransaction(₹↓₹∏privateKey, outputTransactionHash,×✔ ★ sourceIndex, scriptPubKey, out® §puts):    myTx✘ n_forSig = (makeRawTransaction(outpπ × utTransactionHash, sourceIndex, δ≤↓∞scriptPubKey, outputs)   &•∑≈nbsp;     + "0100 ↑≠0000") # hash code &nbs$×p;  s256 = hashlib.∞↔•λsha256(hashlib.sha256(myTxn∑γ∏×_forSig.decode('hex')).digest(®•↕)).digest()    sk£&  = ecdsa.SigningKey.from_string(privat↓∏αeKey.decode('hex'), curv‍∞≈e=ecdsa.SECP256k1)    sig =>σ sk.sign_digest(s256, si¥Ωgencode=ecdsa.util.sigeλ×♦"ncode_der) + '\01' # 01 i™÷s hashtype    pubKey = keβ♣yUtils.privateKeyToPublicKeyΩ✘(privateKey)   ©α  scriptSig = utils.v'∞arstr(sig).encode('hex') + uti‌♠ls.varstr(pubKey.decode('hexβ¶')).encode('hex&#≠↓∏39;)    signed_txn = makeRa≤§≈wTransaction(outputTransactio♠∑<♣nHash, sourceIndex, scriptδεSig, outputs)    ve≤​★rifyTxnSignature(signed_txn) &Ωφ≤•nbsp;  
   return ¶→£ signed2_txn

txnUtils.py

 

最終的(de)scriptSig腳本中包含簽名λβ以及比特币源地(dì)址的(de)公鑰(1MMMMS£‍€Ub1piy2ufrSguNUdFmAcvqrQF8M5)。 這​♠↕(zhè)證明(míng)這(zhè)筆(bǐ)交易有(yǒu)效,我 γ©™可(kě)以花(huā)費(fèi)這(zhè)些(xiē)比特币→$₩ε。

 

PUSHDATA 47

47

signature(DER)

sequence

30

length

44

integer

02

length

20

X

2c b2 65 bf 10 70 7b f4 93 ≤☆↑46 c3 51 5d d3 d1 6f c4 54 61 8c 58 ®₹ec 0a 0f f4 48 a6 76 c5 4f f7 13

integer

02

length

20

Y

6c 66 24 d7 62 a1 fc ef 46 18 ≠$≥28 4e ad 8f 08 67 8a c0 5b 13✔γ≤♠ c8 42 35 f1 65 4e 6a d1₩€¶↕ 68 23 3e 82

SIGHASH_ALL

01

PUSHDATA 41

41

public key

type

04

X

14 e3 01 b2 32 8f 17↕× 44 2c 0b 83 10 d7 87 bf 3d 8a ÷£40 4c fb d0 70 4f 13 5b 6a d4 b2 d3  "₽ ee 75 13

Y

10 f9 81 92 6e 53 a6 e8 c3 9b d7 d3↕∏¥ fe fd 57 6c 54 3c ce 49 3c ba c0 ∑×63 88 f2 65 1d 1a ac bf cd

   
   

 

最終的(de)scriptPubKey腳本包含成功花(huā)費(fèφ±☆•i)比特币時(shí)必須執行(xíng)的(de↔δ¥→)腳本。需要(yào)注意的(de)是(shì),這(÷'λ‌zhè)個(gè)腳本将在未來(lái)花(huā)費‌♦<(fèi)這(zhè)些(xiē)比特币的(de)時(♦®shí)候執行(xíng)。它包含以十六®↑進制(zhì)表示而不(bù)是(shì)以Base58Chec ×≈k表示的(de)目标地(dì)址1KKKK6N2≈≥≈≠1XKo48zWKuQKXdvSsCf9♦©↔↑5ibHFa,腳本的(de)效果是(shì)隻有(yǒu)這(zhè)個(gè£≥)目标地(dì)址的(de)私鑰所有(yǒu)者才能(÷λα÷néng)使用(yòng)比特币,因此目标地"‍↕∑(dì)址實際上(shàng)是(shì)這 §÷♣(zhè)些(xiē)比特币的(de)所有(yǒu)者

 

OP_DUP

76

OP_HASH160

a9

PUSHDATA 14

14

public key hash

c8 e9 09 96 c7 c6 08 0e ≠<e0 62 84 60 0c 68 4e d9 04 d1 4c 5c

OP_EQUALVERIFY

88

OP_CHECKSIG

ac

 

最終的(de)交易

 

經過上(shàng)述的(de)一(yī)系列操作(zuò),我們完成∞÷ λ了(le)最終的(de)交易。但(dàn)是(shì),‍✘≥•别忘了(le),此時(shí)的(de)≥γ≥交易還(hái)沒加入區(qū)塊鏈中,接σ≈©收方還(hái)沒有(yǒu)收到(dào)你(nǐ)的(de)比特币。

 

privateKey = keyUtils.wifToPrivδσateKey("5HusYj2γ₩πb2x4nroApgfvaSfKYZhRbK♣ FH41bVyPooymbC6KfgSXdD"<≥≤;) #1MMMM

signed_txn = txnUtils.make‌♦≠ SignedTransaction(privateKe₹®φ$y,        

"81b4c832d70cb5✔♥>→6ff957589752eb4125a4cab78a25a8fc5¶™₹✘2d6a09e5bd4404d48", # ≠§₽output (prev) transaction hash &♥♦nbsp;      0, #‌​​→ sourceIndex      ¥‍♣σ  
keyUtils.addrHashToScriptPubKey("1≈↕MMMMSUb1piy2ufrSguNUdFmAcvqrQF8M5"Ω$ ↓),        [[91234,®→ #satoshis        ♥≈∞;
keyUtils.addrHashToScriptPubKey(&"∏βquot;1KKKK6N21XKo48zWKuQKXdvSsCf95i♦&bHFa")]]       &₽"♦↑nbsp;)     txβ↑₹nUtils.verifyTxnSignat€ £§ure(signed_txn)
print'SIGNED TXN', signed_txn

makeTransaction.py

 

最終的(de)交易信息如(rú)下(xià)所示:

version

01 00 00 00

input count

01

input

previous output hash(reve♥ ✘Ωrsed)

48 4d 40 d4 5b 9e a0 d6 52 ≤"®♦fc a8 25 8a b7 ca a4 25 41 eb 52 9​✔• 7 58 57 f9 6f b5 0c d7 32 c8 b4 81

previous output index

00 00 00 00

script length

8a

scriptSig

47 30 44 02 20 2c b2π± 65 bf 10 70 7b f4 93∑​ 46 c3 51 5d d3 d1 6f cαδ±≠4 54 61 8c 58 ec 0a 0f f4♠₽Ω 48 a6 76 c5 4f f7 13♦" 02 20 6c 66 24 d7 62 a1 ✘ fc ef 46 18 28 4e ad 8f 0$₽β₩8 67 8a c0 5b 13 c8 42 35 f1 65↓≈♣α 4e 6a d1 68 23 3e 82 01 41 04ΩφΩ 14 e3 01 b2 32 8f 17 44×α♠ 2c 0b 83 10 d7 87 bf 3d 8a 40 4±¥c fb d0 70 4f 13 5b 6a d4 b2 <¶≥d3 ee 75 13 10 f9 81 92 6eλ‍ 53 a6 e8 c3 9b d7 d3 fe fd 57÷♦¥φ 6c 54 3c ce 49 3c ba c0 63 88 f✘♥α2 65 1d 1a ac bf cd

sequence

ff ff ff ff

output count

01

output

value

62 64 01 00 00 00 00 00

script length

19

scriptPubKey

76 a9 14 c8 e9 09 96 £★♦φc7 c6 08 0e e0 62 84 60 0c 68↓≤β  4e d9 04 d1 4c 5c 88 ac

block lock time

00 00 00 00

 

小(xiǎo)插曲:橢圓曲線簽名

 

比特币的(de)簽名算(suàn)法使用(β​yòng)到(dào)了(le)橢圓曲線簽名算(suàn)法,這(z✘₩✔♣hè)麽實用(yòng)的(de)功能(néng),你(nδ​☆±ǐ)可(kě)能(néng)會(huì)好(hǎo)奇它是(shì)怎↑±Ω麽做(zuò)到(dào)的(de)?在當年(nián)英國(guó)☆$數(shù)學家(jiā)安德魯·₹✔¶;懷爾斯攻克費(fèi)馬大(dà)定理(lǐ)時(shí),我第一(y×φ₽>ī)次接觸到(dào)了(le)橢圓曲線的(de)算(​£&←suàn)法。橢圓曲線的(de)數(shù)學思想很(hěn)有(yǒu)意思≠♥ε,所以在這(zhè)裡(lǐ)我給大(dà)家(jiā)✘ 做(zuò)一(yī)個(gè)快(kuài)速的(de)概述。

 

橢圓曲線這(zhè)個(gè)叫法令人(rén)迷惑,因為(wèi)€•π♣橢圓曲線并不(bù)是(shì)橢圓,而且看(kàn)起來(≤≤βlái)也(yě)不(bù)像橢圓,甚至橢圓 ☆φ曲線與橢圓相(xiàng)關性都(dōu)很(hěn)少(shǎo)。通(♠ tōng)俗地(dì)講,橢圓曲線就(jiù)是(​λ∏shì)滿足一(yī)個(gè)簡單方程y ^ 2 = ₽ ©x ^ 3 + ax + b的(de)曲線。比特币中使用(yòng)的(de)★ β'稱為(wèi)secp256k1的(de)∏✔β<橢圓曲線,它滿足的(de)方程為(wèi)y ^ 2 =  ₩x ^ 3 + 7。

 

 

secp256k1橢圓曲線

 

橢圓曲線的(de)一(yī)個(gè)重要(yào)特性就(jiù)是(↕$shì)你(nǐ)可(kě)以用(yòng)一(yī∞∏£)個(gè)簡單的(de)規則來(lái)定義橢圓曲線上(shà§±ng)點的(de)相(xiàng)加:如(rú)果在曲線上( ₽≤φshàng)繪制(zhì)一(yī)條直線,這(zhè)條直線與曲線交÷"與A,B,C三個(gè)點,那(nà)麽這(zhè)個(gè☆•)加法定義為(wèi)A+B+C=0。由這(zhè)個(gè←→)加法的(de)定義,我們可(kě)以定義整數(shù)乘法:α¶↑例如(rú)4A = A + A + A + A₽∏≥​。

 

為(wèi)什(shén)麽橢圓曲線在密碼學上(shàng)很'∑÷•(hěn)有(yǒu)用(yòng)?因為(wèi)橢圓♦φ曲線做(zuò)整數(shù)乘法運算(suàn)速度  "很(hěn)快(kuài),但(dàn)做(zuò)除♦₩法時(shí)需要(yào)蠻力。例如(rú),你(nǐ)可(kě)以≥∞γ£快(kuài)速地(dì)計(jì)算(su≠®àn)一(yī)個(gè)乘法12345678*Aε​ = Q,但(dàn)是(shì)如(rú)果你(nǐ)隻知(zhī)道₹Ω←'(dào)A和(hé)Q,求解n*A=Q₽∏中的(de)n十分(fēn)困難。因此在橢圓曲線算(suàn)法中,這ε₽<(zhè)裡(lǐ)的(de)12345678将是(shì)私鑰,曲線上(​∞shàng)的(de)點Q将是(shì)公鑰。

 

在密碼學中,點的(de)坐(zuò)标并不(bù)€€是(shì)它在曲線上(shàng)的(de)實•♠值點,而是(shì)對(duì)整數(sh→∏™₽ù)的(de)模數(shù)。橢圓曲線的(de)一≤β★₹(yī)個(gè)好(hǎo)用(yòng)的(de)特性就(♣ε₹jiù)是(shì)對(duì)實數(shù)或模數(shù)♥→'&進行(xíng)運算(suàn)的(de)數(shù)學運算(suπ≥Ω>àn)幾乎相(xiàng)同。正因為(wèi)如(rú)此,δφ 比特币的(de)橢圓曲線并不(bù)像上(shàng§δ↓♦)面的(de)圖片,而是(shì)一(yī)團雜(zá)亂無章(zhā≤∞ng)的(de)256位點集(想想在一(yī)個(gè)空(kōΩ↕©ng)間(jiān)中充滿了(le)大(dà)量雜(zá)亂無→← €章(zhāng)的(de)點)。

 

橢圓曲線數(shù)字簽名算(suàn)法(ECDSA)接收交易的(de)哈$✔₽希值,使用(yòng)該交易數(shù)據,私鑰,以及一(yī)$§個(gè)随機(jī)數(shù)從(cóng)橢圓曲線上( ®↑shàng)生(shēng)成一(yī)個(gè)新的(de)點β ×∞,從(cóng)而實現(xiàn)對(duì)交易的(de±♠)簽名。任何擁有(yǒu)公鑰,交易數(shù)據,和(hé)簽名的(d≈∑λ¶e)人(rén)都(dōu)可(kě)以通(tōng)過做(zu$® ©ò)一(yī)個(gè)簡單的(de)橢圓曲線運算(€≤suàn)來(lái)驗證簽名的(de)有(yǒu)效性。讀≠☆(dú)到(dào)這(zhè)裡(lǐ),你(nǐ)應該明♥☆$(míng)白(bái)了(le)為(wèi)什(shén)麽隻有♥✔÷‍(yǒu)擁有(yǒu)私鑰的(de)人(rén)才能(néng)簽署消息£<,但(dàn)擁有(yǒu)公鑰的(de)任何人(rén)都(d±≤ōu)可(kě)以驗證該消息。

 

把交易發送到(dào)比特币網絡

 

回到(dào)交易中來(lái),别忘了≥→→(le)此時(shí)我們的(de)交易還(hái)沒有(yǒu)被加入到" ∞≤(dào)區(qū)塊鏈中,還(hái)不(bù)是(sπ∑ hì)一(yī)筆(bǐ)有(yǒu)效交易↔>。剛剛我創建并簽署了(le)一(yī)筆(bǐ)交易。下(xià)一(yī$✔♣')步就(jiù)是(shì)将這(zhè)筆(bǐ)交易發送到(d'β≈ào)比特币網絡中,網絡中的(de)礦工≥♣(gōng)會(huì)收集交易并把它打包進區(qū)塊中。"​©♠

 

如(rú)何找到(dào)比特币網絡的(dα♠↑e)節點

 

首先我要(yào)在比特币的(de)點對(duα £ì)點網絡中找到(dào)一(yī)個(g©↔è)節點。節點的(de)列表會(huì)随節點的(de)進出動态更 ∞♥新,當一(yī)個(gè)比特币節點連接到(dào)另一(≈$yī)個(gè)節點時(shí),它們就(jiù)會(huì)不(bù)斷"÷"<交換彼此新發現(xiàn)的(de)比特币節點信息,因此,新節×λ點加入的(de)消息會(huì)快(kuài)速地(dì)傳遍整個(gè)網絡&×。

 

然而,新的(de)比特币節點如(rú)何第一(yī)次找到(dào)比特币πλ節點?這(zhè)是(shì)一(yī)個(gè)先有(yǒu)雞還π₽™(hái)是(shì)先有(yǒu)蛋的(de)問(wè✘₹±∑n)題。比特币節點通(tōng)過以下(xià)幾↑λ種方法來(lái)解決這(zhè)個(gγ€↔è)問(wèn)題。有(yǒu)幾個(gè)可(kě)信的(de←₹)比特币節點會(huì)以bitseed.x↑'£f2.org的(de)域名在DNS系統(Domain Name Sys¶ tem,域名系統,萬維網上(shàng)作(zuò)為(wèi)域£>↓名和(hé)IP地(dì)址相(xiàng)互映射的‌αβ(de)一(yī)個(gè)分(fēn)↔♠布式數(shù)據庫)上(shàng)注冊,通(tōnσ‍§g)過執行(xíng)nslookup命令,你(nǐ)就(jiù)可(kě)以¶≠得(de)到(dào)這(zhè)些(xiē)節點的(de)IP地(dì)‍→ε址,隻要(yào)有(yǒu)一(yī)個(gè)在工(gōng→$₩)作(zuò)即可(kě)。如(rú)果'₽♥很(hěn)不(bù)幸它們都(dōu)沒有(yǒu)工(gōng)作(z↕£♠uò)的(de)話(huà),你(nǐ)可(kě)以試著(z•÷∑he)連接那(nà)幾個(gè)已經在你(nǐ)的≥≠♣(de)客戶端中硬編碼記錄下(xià)來(lá∞'i)的(de)地(dì)址。

 

 

Nslookup命令可(kě)以用(yòng)來(lái)尋找比特币↓¶®α節點

 

當用(yòng)戶啓動或停止比特币客戶端時(shí),節 φ點就(jiù)會(huì)加入或離(lí)開(kāi)比$ε ♣特币網絡。所以連接節點有(yǒu)很(hěn)大(dπ"à)的(de)不(bù)确定性,在我實驗時(shí),就(j♦§iù)遇到(dào)了(le)連接的(de)節點已經離☆♥(lí)開(kāi)比特币網絡的(de)情況,如(rú)果你(nǐ)想重複我的¥÷↔λ(de)實驗,最好(hǎo)多(duō)找幾個(gè)節點,可(kě₽Ω¥φ)能(néng)需要(yào)多(duō)次 α" 嘗試才能(néng)找到(dào)一(yī)個(gè)運行(xíng)著(¥™•zhe)的(de)節點。

 

與比特币節點通(tōng)信

 

一(yī)旦獲得(de)了(le)一(yī)個(gè)正♥¥在工(gōng)作(zuò)的(de)比特币節點的(de)IP÷$‌≠地(dì)址,當務之急就(jiù)通(tōng)過這(zhè)個(gè)節點是≤"(shì)把我的(de)交易發送到(dào)比特币的(d×✘♥e)點對(duì)點網絡中。使用(yòng)點對(duì)點的(de)網絡協<‌'議(yì)十分(fēn)簡單,我在端口8333∏↑✔上(shàng)打開(kāi)了(le)一(yī)個(gè)到(dào✘&₩‍)任意對(duì)等端的(de)TCP連接,發送消息,然後接受反≤δ™饋消息。比特币的(de)點對(duì)點協議(yì)對(duì)用✘ ©(yòng)戶很(hěn)友(yǒu)好(h‍☆∏ǎo),即使我的(de)請(qǐng)求數(shù)據出錯(cuò)←γφ時(shí),還(hái)是(shì)繼續與我保持通(t✘• ®ōng)信。 

 

重要(yào)提示:正如(rú)一(yī)些(xiē)人(r"'™én)指出的(de)那(nà)樣,如(rú)果你(nǐ)想重複我的(d©♠§φe)實驗,切記要(yào)使用(yòng)比特币™'♦"的(de)測試網絡,在測試網絡上(shàα‍ng),你(nǐ)可(kě)以使用(yò‌​∑ng)“虛拟”的(de)比特币來(lái)進行(x∞€≈<íng)交易。因為(wèi)在真實網絡上(shàng),萬一(yī)你(¥αnǐ)不(bù)小(xiǎo)心,有(y ≈ǒu)可(kě)能(néng)會(huì)失λ£δ去(qù)所有(yǒu)的(de)比特币。還(hái)記得‍π★™(de)上(shàng)面提到(dào)的(de™¶≤>)那(nà)個(gè)100個(gè)比特币轉賬1個(gè)的(de)∑☆"≥交易麽,如(rú)果你(nǐ)忘了(le)将剩餘的(de)比特σ₩δ币轉給自(zì)己,那(nà)麽剩餘的(de)99個(gè)比特币就(♣<λjiù)會(huì)作(zuò)為(wèi)交易費(fèi)支付給礦工(λ ®gōng)。但(dàn)是(shì)本著(zhe)科(kē)學↓∏♠↓的(de)态度,我并不(bù)在意在真實的(de β)比特币網絡中損失我這(zhè)些(xi↓‍ ↓ē)價值1美(měi)元的(de)比特币。

 

協議(yì)中包含24種不(bù)同的(de)信息種類。每一(yī)條信息都(γ☆dōu)是(shì)一(yī)個(gè)簡≠±單的(de)二進制(zhì)大(dà)對(duì)象(binary larg×&e object ,BLOB,是(shì)一(yī)個(gè‍♠ )可(kě)以存儲二進制(zhì)文(w€®✔₹én)件(jiàn)的(de)容器(qì)),其中包含↔γ♣一(yī)個(gè)ASCII命令和(hé)一(yī)個(gè)适用λ§ ∞(yòng)該命令的(de)二進制(zhì)有(yǒu)效參數(shù)₹↑。該協議(yì)可(kě)以在比特币的(de)維基上(shàng)©≤α查詢。 

 

連接到(dào)比特币網絡的(de)第一(yī↓∞)步就(jiù)是(shì)通(tōng)過交換客戶端版本信息來(l γái)建立連接。首先,我發送了(le)一(yī)條'σ¥‌客戶端版本信息,其中包含我的(de)協議(yì)版本号,≥β​IP地(dì)址和(hé)其他(tā)內(nèi)容λ♥。比特币節點也(yě)向我回複了(le)它的(de)版本信息∑∑。在此之後,我應該回複一(yī)個(gè)verack ∏•信息(version acknowledgemen±÷©t,版本确認)來(lái)确認它的(de)版本信息。正如←←₩♣(rú)我所說(shuō),比特币點對(duì)點網絡協議(yì <¥ )對(duì)用(yòng)戶十分(fēnπ±π)友(yǒu)好(hǎo),即使我跳(tiào)過了(le ®‌)verack信息,之後的(de)操作(zuòσ€<)也(yě)是(shì)一(yī)切正常。 ∞εΩ♣

 

交換版本信息這(zhè)一(yī)步并不(b↔α☆σù)簡單,因為(wèi)信息具有(yǒu)标準的(de>≥ ®)格式,不(bù)過不(bù)用(yòng)害怕,可λγ÷(kě)以用(yòng)幾行(xíng)代 ♥碼來(lái)創建這(zhè)些(xiē)信©λ"☆息。下(xià)面代碼段中的(de)makeMes↓ ≠‌sage函數(shù)可(kě)以由随機(jī)數(shù),命令名以'ε©及命令的(de)參數(shù)來(lái)生(shēng)成一φ¥ (yī)條消息。getVersionMessage函數(shù)α<通(tōng)過将各個(gè)字段打包在一(yī)起來•©↕(lái)為(wèi)版本消息創建參數(shù)。

 

magic = 0xd9b4bef9

def makeMessage(magi∏☆Ω★c, command, payload): ₩‌δπ   checksum =
hashlib.sha256(hashlib.s♥₹≥÷ha256(payload).digest()).dig✔ πest()[0:4]   &nb∞↕sp;
   return struct.pack↓←₩('L12sL4s', magic, c ¶ommand, len(payload), checksum) + β₩Ω€payload
   
def getVersionMsg():   &Ω nbsp;
   version = ‌γ§60002    services = 1 &Ωσ¥±nbsp;  timestamp = iβ© §nt(time.time())    addr_mλ πe = utils.netaddr(socket.inet_aton( &✔‍"127.0.0.1"),₩σ÷ 8333)    addr_you = utils‌‌↔.netaddr(socket.inet_aton₽‌✘("127.0.0.1"), 8§<333)    nonce = randomα€£.getrandbits(64)   &n≤¥∞bsp;sub_version_num = utils.vars™σ≠tr('')    start♠→_height = 0    payload = s$π★÷truct.pack('<LQQ26s26sQ£★sL', version, services, timestamp,₩©♦ addr_me,     &÷ >≈nbsp;  addr_you"γ, nonce, sub_version_num, start_h§↓eight)    
   return makeMessage(₹↔€magic, 'version&↑π#39;, payload)

msgUtils.py

 

發送交易tx

 

我使用(yòng)下(xià)面精簡的(de)Pytho ₽n代碼把我的(de)交易發送到(dào)比特↑ "币網絡中,這(zhè)個(gè)代碼發送一(yī)條客戶端版本信息,接受(ε↔也(yě)可(kě)以忽略)比特币節點的(de) ‌版本信息和(hé)verack信息。最後将我的(de)₽‌‌交易以tx信息發送。代碼中這(zhè)個(δ♣♣ gè)16進制(zhì)的(de)字符串是(shì)我之前創建的(  ♥de)交易。

 

def getTxMsg(payload):  retuδ&©rn makeMessage(magic, '∑≈∞;tx', payload) sock = socke"∑∏t.socket(socket.AF_INET, socket★↓‌.SOCK_STREAM) sock.con÷↓ →nect(("97.88.151.164&quβ↕★ot;, 8333)) sock.send(msgUtils.getVe←₽β∞rsionMsg()) sock.recv(1000)®★ # receive version sock.recv(1000)• ∏ # receive verack sock.send(msgUtils.©λαgetTxMsg("01000000014±≤84d40d45b9ea0d652fca8258ab7caa425©π41eb52975857f96fb50cd732c8b48φΩπ↓1000000008a47304402202cb265bf10707b×§Ωf49346c3515dd3d16fc4←≥54618c58ec0a0ff448a676c54ff₽‌×71302206c6624d762a1fcef4618284eaδ÷☆♥d8f08678ac05b13c84235f1654e6ad16≈'δ8233e8201410414e301b2328f17442c0b8∞σ 310d787bf3d8a404cfbd0λ≥×§704f135b6ad4b2d3ee751310f981 ε∏926e53a6e8c39bd7d3fefd576c543cce4<™ β93cbac06388f2651d1aacbfcdffffffffδ™0162640100000000001976a914cσ>​♠8e90996c7c6080ee06284600c68§∑∑4ed904d14c5c88ac00000000".deco€≈de('hex')))

minimalSendTxn.py

 

以下(xià)Wireshark(一(yī)個(gè)抓取  ,分(fēn)析網絡封包的(de)軟件(jià★α÷n))軟件(jiàn)的(de)截圖顯示出我是(shì)如(rú)何将交易發送&π£到(dào)比特币網絡中的(de)。我用(↕♥yòng)Python編寫了(le)腳本來(lái)分(fēn)析網絡數(sh• "ù)據,為(wèi)了(le)簡單起見(ji &àn),在這(zhè)裡(lǐ)我使用(yòng)Wireshark。從(cα↑→óng)圖中可(kě)以看(kàn)到(dào)我的(de)這(zhè)筆(bβ÷✘ǐ)tx交易。

 

 

 

Wireshark中抓取的(de)這(zhè)筆(bǐ)正在上±✔§(shàng)傳至比特币網絡的(de)交易tx

 

為(wèi)了(le)實時(shí)監控我這(zhè)筆(bǐ)交↑≥易的(de)進度,我在比特币網絡中新運行(xíng)了(le)一(π​yī)個(gè)節點,在把我交易發到(dào)比§♣特币網絡5秒(miǎo)鐘(zhōng)之後,另一(y ε€✘ī)個(gè)節點給我發送了(le)這(↓→zhè)個(gè)tx消息,其中包含我剛剛發送的 ≤¥(de)這(zhè)筆(bǐ)交易的(de)哈希,由此可(kě)↑​♣×見(jiàn),在僅僅這(zhè)幾秒(miǎo)中,我的(de)交易‍"已經傳遍了(le)比特币網絡,至少(shǎ↕φ× o)也(yě)是(shì)比特币網絡的(de)一(yī)部分(fēn)π>§€。

 

交易成功:我的(de)交易被加入區(qū)塊鏈

 

在将我的(de)交易發送比特币網絡之後,我需要(yào)等待它被'♥©礦工(gōng)開(kāi)采出來(lái)加入到(☆•dào)區(qū)塊鏈中,然後才能(néng)宣稱我的(deφ ≤)實驗圓滿成功。10分(fēn)鐘(zhōng)後,我的(de)♠α ♣比特币節點收到(dào)一(yī)條含有(yǒu)新區 ₹(qū)塊信息的(de)inv消息(參見(jiàn)下(₩≠ xià)圖Wireshark抓到(dào)的(de≥‌)網絡封包),檢查這(zhè)個(gè)區(qū)塊後發現(xiàn)我的 ™$♥(de)交易被包含在了(le)區(qū)塊中,證明(míng)我的(dδ↓☆↓e)交易是(shì)有(yǒu)效的(de),我的(de)實驗成功了(le)‌±£₩。通(tōng)過我的(de)比特币錢(qián)包軟件(jiàn)和(hé)&γ$£在線查詢,再一(yī)次确認了(le)我已經交易成功。可(kě)以≥☆↔說(shuō),經過不(bù)斷的(de)努力,我成功手動創建了(l≠>∞€e)一(yī)筆(bǐ)交易,并讓比特币系統接受了(le)它。(當↓→β然了(le),我也(yě)經過了(le)幾次失敗的(de)←↓嘗試,這(zhè)些(xiē)錯(cuò)誤的(d≤δ®"e)交易都(dōu)消失在了(le)網絡之中,永遠(yuǎn)都(dōu>↔‍™)不(bù)會(huì)被檢索到(dào)。

 

Wireshark中抓取的(de)新區(qū)塊産生(s±Ω™<hēng)的(de)封包信息

 

我的(de)交易是(shì)被當時(shí)哈希算(suàn)力÷←"(挖礦速度)最大(dà)的(de)礦池(多(duō)個(gè)礦工(‍₽φ§gōng)一(yī)起挖礦)GHash.IO挖出,區(qū)塊高(♥&gāo)度為(wèi)279068,區(qū)塊哈希為(wèi)000→✘&±0000000000001a27b1d6eb8c405 •410398ece796e742da3b3e35363c2σ‌219ee,在上(shàng)圖Wireshark數(shù)據∑✘包中inv消息的(de)哈希值是(shì)經前後反轉得(de)到(dào™‍)的(de)ee192……。你(™®ε​nǐ)應該會(huì)發現(xiàn)區(qū)塊的(dΩε÷λe)哈希值以大(dà)量的(de)0開(kāi)頭,在一(yī)≈™個(gè)16進制(zhì)的(de)哈希值中發現(xiàn)一(y ™ī)個(gè)以這(zhè)麽多(duō)0開(k∑≈♣āi)頭的(de)數(shù),這(zhè)就(jiù)是(shì)為(wèiπ∑ε‍)什(shén)麽挖礦如(rú)此困難的(de)原因。這(zhè)個(g≤‌→εè)區(qū)塊中由462筆(bǐ)交易,我的(de)交易是(shì)其中之™σ 一(yī)。

高(gāo)度為(wèi)279068的(de)區(qū)塊以及我發>↓∑≥起的(de)這(zhè)筆(bǐ)交易

(https://blockchain.in★♦<'fo/block-index/341440/000000§π÷0000000001a27b1d6eb8c405410398ec©≈→e796e742da3b3e35363c2219ee)

 

挖到(dào)這(zhè)個(gè)區(qū)塊的(de)礦工(gō£φ₹©ng)們收到(dào)了(le)25個(gè)比特币©Ω的(de)獎勵,交易費(fèi)總共是(shì)0.104個(gè)比€ ​™特币,按當時(shí)的(de)市(shì)價分(fēn)别為(♠✔≠wèi)19000美(měi)元和(hé)80美§ε(měi)元。我支付了(le)0.0001個(gè)比特币的(de)交易費•π (fèi),大(dà)約是(shì)我交易額的(™≤de)10%,按當時(shí)的(de)市(shì)價為(wèi)8美('‌₩měi)分(fēn)。

 

結論

 

手動進行(xíng)比特币交易比我想象中困難得(de)多(du ÷ ₹ō),但(dàn)是(shì)在這(zhè)個(g♦↔<è)過程中我學到(dào)了(le)很(hěn)多(duō),希↔ '望你(nǐ)也(yě)是(shì)。我的(de)Python§ Ω代碼僅僅是(shì)為(wèi)了(le)介紹,如(rú)果你(πσ₽nǐ)想跟我一(yī)樣用(yòng)Python手動進行(xí$©ng)比特币交易,也(yě)可(kě)以試試≈ 這(zhè)幾個(gè)項目。

 

https://en.bitcoin.it/wiki/Bit±λ≤coin-python

https://github.com/richa©✔‍rdkiss/pycoin

https://github.com/jgarzik/python-bit✔£coinlib

 

 

寫在最後

2017年(nián)是(shì)區(qū)塊鏈↓πλ的(de)井噴之年(nián),經過一(yī)年★≥(nián)的(de)積攢,2018年(nián)将迎來(lái)區(q‌<ū)塊鏈的(de)落地(dì)之年(nián),區(qū)塊鏈會(huì)逐§♦¥漸颠覆各行(xíng)各業(yè)。對(duì)于個(gè)人(ré₩•n),區(qū)塊鏈的(de)機(jī)會(huì)會(huì)越來§→•©(lái)越多(duō),也(yě)許你(nǐ)↑β™α錯(cuò)過了(le)比特币的(de)γ↑投資,不(bù)妨現(xiàn)在抓住區(qū)塊鏈這(zhè)個(gè)風(↑€fēng)口,投資自(zì)己,多(duō)學習(xí)相(xiàng)關知β♦(zhī)識,區(qū)塊鏈大(dà)有(yǒu)可(kě)為(wèi),投身↕β£ (shēn)區(qū)塊鏈的(de)你(n∞"ǐ)将大(dà)有(yǒu)作(zuò)為(wèi)!

*聲明(míng):推送內(nèi)容及圖片來(lái)源于網絡,部•""↔分(fēn)內(nèi)容會(huì)有(yǒu)所改動,版權歸原作₽•(zuò)者所有(yǒu),如(rú)來(lái)源₽₽££信息有(yǒu)誤或侵犯權益,請(qǐng)聯系我們删除'​×或授權事(shì)宜。

 

 

无码人妻精品一区二区蜜桃在线看,人妻无码中文字幕免费视频蜜桃,无码人妻精品一区二区蜜桃色欲,蜜桃AV色偷偷AV老熟女,久久人妻少妇嫩草AV蜜桃漫画,又爽又黄A片免费观看直播蜜桃,欧美性猛交XXXX乱大交蜜桃,色欲AV永久无码精品无码蜜桃,蜜桃一区二区三区,WWW.17C嫩嫩草色视频蜜桃,亚洲精品久久久蜜桃