官术网_书友最值得收藏!

3.1 比特幣的交易

讓我們先一起看一下比特幣的交易,比特幣交易的過程其實(shí)就是不停地創(chuàng)造區(qū)塊的過程,為了理解上的方便,我們先看一個簡單模式的賬簿,在這個賬簿里,每一筆交易依次被添加到賬簿里。

那我們?nèi)绾问褂眠@個賬簿來創(chuàng)造一種貨幣呢?首先你可能想到(也是許多人誤認(rèn)作比特幣使用的方式):建立一個以賬戶為核心的系統(tǒng),可以創(chuàng)造新的幣并且放入某人的賬號,然后就可以轉(zhuǎn)給其他人了。一筆交易的信息就像這樣:“把愛麗絲賬戶里17個幣轉(zhuǎn)給鮑勃”,然后由愛麗絲簽名。我們從圖3.1可以看到,愛麗絲在第一筆交易里收到25個幣,然后轉(zhuǎn)了17個幣給鮑勃,她的賬戶里應(yīng)該還有8個幣。

圖3.1 基于賬戶的賬簿

這么做的不便之處在于,任何人如果想要確認(rèn)一筆交易是否真實(shí),就必須跟蹤每一個賬戶的余額。讓我們再看一下圖3.1,當(dāng)愛麗絲想要轉(zhuǎn)給戴維15個幣的時候她是否真的有15個幣呢?為了搞清楚這個問題,我們必須回過頭去看和愛麗絲有關(guān)的所有交易,并加總來確認(rèn)當(dāng)時的余額。當(dāng)然,我們可以有一些更有效的辦法,比如另外增加一個數(shù)據(jù)字段,用來更新每次交易后的賬戶余額,但這也增加了記賬的工作量。

所以,比特幣并沒有用這種記賬方式,而是用了我們在第1章1.5節(jié)里提到的“財奴幣”相類似的方法來記錄交易。

這種方式就像財奴幣里的付幣,每個交易中都有一個輸入值和輸出值。輸入值可以看成是將被消費(fèi)掉的幣(這些幣是前一個交易創(chuàng)造出來的),把輸出看成是在本次交易中創(chuàng)造出來的幣。鑄造新幣時,只會創(chuàng)造新幣,而不會消費(fèi)舊幣(就像財奴幣里的造幣,只有輸出,沒有輸入)。每筆交易都有一個獨(dú)一無二的ID。每筆交易中可能有多個輸出,輸出的索引從0開始,所以我們稱第一個輸出為“輸出0”。

我們現(xiàn)在來看圖3.2。交易1是鑄造新幣的交易,因此沒有輸入,也沒有簽名;交易1的輸出是向愛麗絲轉(zhuǎn)移25個幣。現(xiàn)在,愛麗絲想把一些幣轉(zhuǎn)給鮑勃,她就創(chuàng)造了一條新的交易,這就是圖3.2中的交易2。在交易里,她必須明確指出要轉(zhuǎn)出的幣的來源(引用之前的某筆交易)。愛麗絲指出本次交易的幣來自交易1中的輸出0(也是交易1中的唯一輸出),即向愛麗絲轉(zhuǎn)移25個幣。交易中,愛麗絲還要明確收款人——也就是輸出的地址,在這個例子里,有兩個輸出,一個是轉(zhuǎn)17個幣給鮑勃,另一個是轉(zhuǎn)8個幣給愛麗絲自己。當(dāng)然,整個交易由愛麗絲簽名,這樣,大家就知道這筆交易愛麗絲是確實(shí)授權(quán)了的。

圖3.2 與比特幣類似的基于交易的賬本

地址轉(zhuǎn)換。在這個例子里,為什么愛麗絲要把幣轉(zhuǎn)給自己呢?事實(shí)上比特幣就像財奴幣中描述的幣一樣,一個交易中輸出的幣,要么在另一個交易中被完全消費(fèi)掉,要么就一個都不被消費(fèi),不存在只消費(fèi)部分的情況。愛麗絲只需付給鮑勃17個幣,但愛麗絲在上一交易中實(shí)際獲得了25個幣,為了把這些幣全部消費(fèi)掉,她必須再轉(zhuǎn)給自己8個幣。這8個幣可以轉(zhuǎn)到另外一個地址(不同于交易1中獲得25個幣的地址),但前提是該地址為愛麗絲所有,這就叫地址轉(zhuǎn)換。

有效驗(yàn)證。當(dāng)一個新的交易被加入總賬,它的有效性是否容易被驗(yàn)證?在這個例子里,我們要核查一下愛麗絲引用的交易輸出,確認(rèn)她確實(shí)有25個幣沒有被花費(fèi)掉。因?yàn)槲覀兪褂昧斯V羔槪院瞬楹芸臁榱舜_認(rèn)這25個幣沒有被花掉,我們只需從愛麗絲所引用的交易開始,一直核查到賬本上最新記錄的交易為止即可——而不需要從賬本建立之初的交易開始核查。而且,這種方法也不需要增加額外的數(shù)據(jù)結(jié)構(gòu)(當(dāng)然,我們將會看到,加入新的數(shù)據(jù)結(jié)構(gòu)將進(jìn)一步提高速度)。

資金合并。和財奴幣一樣,比特幣交易可能有許多輸入與輸出,資金分隔與合并也很容易。假如鮑勃在兩筆不同的交易中分別收到17個幣和2個幣,現(xiàn)在他想把這兩筆錢合并起來花掉,這很容易,他只需發(fā)起一個交易,交易里有兩個輸入和一個輸出,輸出的地址是他自己的地址,這樣,鮑勃就把兩個交易合二為一了。

共同支付。同樣地,共同支付也很容易做到。如果卡羅爾和鮑勃想要共同支付給戴維,他們可以發(fā)起一個交易,交易里也有兩個輸入和一個輸出,唯一不同在于,兩個輸入所引用的“上一筆交易”的輸出地址不同,因此,這筆交易需要兩個簽名:卡羅爾的和鮑勃的。

交易語法。比特幣交易涉及的概念就是上面這些。我們再來看看比特幣交易在底層是如何實(shí)現(xiàn)的。實(shí)際上,比特幣在網(wǎng)絡(luò)上傳輸?shù)臄?shù)據(jù)結(jié)構(gòu)都是一串字符,圖3.3顯示了一個真實(shí)的程序,經(jīng)過編譯就會變成供機(jī)器執(zhí)行的二進(jìn)制代碼了。

圖3.3 一個真實(shí)的比特幣交易程序段

從圖3.3可以看到,一個比特幣交易分成三部分:元數(shù)據(jù)、一系列的輸入和一系列的輸出。

● 元數(shù)據(jù)。這里存放一些內(nèi)部處理的信息:包含這筆交易的規(guī)模、輸入的數(shù)量、輸出的數(shù)量,還有此筆交易的哈希值,也就是這個交易獨(dú)一無二的ID。我們可以用哈希指針指向這個ID。最后還有一個“鎖定時間”(lock_time),我們后面會談到。

● 輸入。所有輸入排成一個序列,每個輸入的格式都是一樣的。輸入需要明確說明之前一筆交易的某個輸出,因此它包括之前那筆交易的哈希值,使其成為指向那個特定交易的哈希指針。這個輸入部分同時包括之前交易輸出的索引和一個簽名:我們必須有簽名來證明我們有資格去支配這筆比特幣。

● 輸出。所有輸出也排成一個序列。每個輸出的內(nèi)容分成兩部分。所有輸出的金額之和必須小于或等于輸入的金額之和。當(dāng)輸出的總金額小于輸入總金額時,輸出的總金額與輸入的總金額的差額部分,就作為交易費(fèi)支付給為這筆交易記賬的礦工。

一長串怪怪的(funny)字符看上去像是接收地址。實(shí)際上,每個輸出都要和一個特定的公鑰(地址)對應(yīng),所以這一長串字符里面確實(shí)有一部分看上去是公鑰的哈希值,但里面還有一部分看上去像指令集合的東西,它其實(shí)是一個比特幣的腳本,下文展開介紹。

主站蜘蛛池模板: 会泽县| 德江县| 荥阳市| 常熟市| 汉寿县| 黔东| 绥芬河市| 莒南县| 屏南县| 虎林市| 南和县| 堆龙德庆县| 红安县| 依兰县| 大荔县| 北京市| 达尔| 二手房| 赫章县| 上饶县| 三门峡市| 崇明县| 化德县| 石泉县| 祁连县| 余庆县| 宁武县| 大新县| 东海县| 黔江区| 增城市| 河西区| 汉川市| 水城县| 溧水县| 博兴县| 西乌珠穆沁旗| 宽甸| 怀仁县| 洛宁县| 桃江县|