當前位置:
首頁 > 最新 > 區塊鏈系列:以太坊是比特幣與無限可能

區塊鏈系列:以太坊是比特幣與無限可能

這是區塊鏈系列:從比特幣到以太坊後續,如果你還沒讀過,請先讀這篇文章。理解以太坊所需要的背景都這這篇文章中了。

還記你得剛學編程時,第一次使用「對象」的感覺嗎?還記你第一次嘗試函數式編程的樣子嗎?這些編程範式,你還記得用了多久才把它們從懵懂的概念進化為直覺的?其實,學習面象區塊鏈編程很像面向對象與函數式編程:剛開始很繞,漸漸的就明白了。我們在這個系列的上半篇,通過比特幣的區塊鏈,了解了區塊鏈大致是如何運行的。這下半篇,我們就來探索一下以太坊的區塊鏈,進而學習面向區塊鏈編程。從長遠上講,學會如何結構化區塊鏈內的互交,並把它培養成直覺,對學習者是有極大裨益的。

關於以太坊,我們會在後續將整個以太坊白皮書轉載過來,以讓大家更加深刻的理解以太坊。敬請留意


從現在起,從合同的角度思考問題!

智能合同其實就是存儲在區塊鏈里的代碼。只要再加一個用戶界面,智能合同就可以作去中心化應用(dapps)的後端了。用你已有的對比特幣的理解,可以把一個比特比交易想成一個具有三個輸入和兩個輸出的程序(比特幣對輸入和輸出的定義並不是這樣的,但先不要在乎細節)。輸入指的是要交易的比特幣總和,轉賬人的地址和收款人的地址。輸出就是轉賬後,餘額更新後的這兩個賬戶。被礦工挖出來的交易記錄是公開的,裡面記著一個有某些輸入的程序曾經運行過併產生了某些輸出。在比特幣里,這種轉賬程序就是唯一存在的程序,每個節點因此都能根據輸入正確的驗證輸出。

以太坊把程序的限度,從簡單的轉賬,擴展到了一切能在圖靈機上編寫的程序。要是你計算機課上忙著睡覺了的話,這意思就是任何能被編程的東西,也同樣能在以太坊上被編程。

以太坊能有這樣的複雜性是因為每個網路節點上都運行著一個虛擬機(叫以太坊虛擬機,或EVM)。EVM和其它任何的虛擬機沒什麼不同。舉個例子,你可能已經熟悉Java Virtual Machine (JVM)。JVM代碼在任何裝有它的機器里,同樣的輸入會產生同樣的輸出。相似地,EVM也能讓以太坊區塊鏈代碼,在同樣在輸入下產生公認正確的輸出。

比特幣區塊鏈的完整節點裡存有從零區塊到現在的所有記錄;以太坊的完整節點裡,還多了靜態代碼(若是存在),與之相關的賬戶信息,和代碼此時的狀態。

想像存儲在賬戶內的一個簡單程序,它只接受數字輸入,然後把這輸入的數字加到一個累計的數字上,再用新的總和來代替舊的。有兩個賬戶和這個合同賬戶進行了交易,一個輸入了5,另一個輸入了2。現在在區塊鏈里的信息有:

1. 合同賬戶和它的靜態代碼。

2.這個合同賬戶的目前存儲狀態,即總和為7。

3. 一個這個賬戶過去的賬戶存儲狀態,即總和為5。

4. 一個這個賬戶過去的賬戶存儲狀態,即總和為0。

5. 三個轉賬記錄:一個是代碼最開始的存儲,一個是某賬戶輸入的5,另一個是某賬戶輸入的2。

想像一個類似的程序,(必然地)儲存在另一個賬戶里。這個程序除了有上面的功能,還存有一個線性的數組,裡面存儲著有兩個欄位的結構(結構指的是結構化的排列數據的模板),每個結構里存有寄帳人的地址,和寄帳人輸入的數字。有兩個賬戶和這個合同地址進行了交易,一個輸入了5,一個輸入了2。現在區塊鏈里的信息有:

1. 合同賬戶和它的靜態代碼。

2. 這個賬戶的目前存儲狀態,即總和為7,和一個含有兩個結構的數組。

3. 一個這個賬戶過去的存儲狀態,即總和為5,和一個含有一個結構的數組。

4. 一個這個賬戶過去的存儲狀態,即總和為0,和一個空的數組。

5. 三個轉賬記錄,一個是代碼最開始的存儲,一個是某賬戶輸入的5,另一個是某賬戶輸入的2。

現在我們可以輕鬆地重新構建這個賬戶之前的狀態,並查看都有哪些賬戶和它有過交易,從而創建了現在的狀態。可這種模式應該盡量避免。為什麼呢?用上面的例子來說,所有存儲在數組裡的數據都可以方便的用區塊鏈本身構建出來。讀到這裡,心眼兒不老實的讀者可能已經想到了多種轟炸區塊鏈的方法了。下面我們來學習一下以太坊是如何預防節點的硬碟和CPU被殭屍攻擊(DoS)的,以及這些預防措施對開發者和用戶意味著什麼。從某些角度講,對開發者來說這意味著要寫入數據時要小心謹慎。


油費(gas price)

怎麼防止有人上傳10TB的靜態代碼合同,把所有網路節點的存儲空間都耗盡呢?或者讓CPU無休止的做無用功?和比特幣一樣,在以太坊上交易是有手續費的,以來激勵礦工來處理交易和保護網路,不同的是以太坊是以「油費」的形式來收費的。就像汽車跑單位距離需要特定加侖的汽油,以太坊上的交易每運行單位CPU周期或儲存單位數據也要花費特定的以太。因為以太本身是珍貴稀有的,所以就預防了殭屍攻擊。區塊鏈上的億萬富翁,想要燒錢搞惡作劇是可以讓網路變慢一會兒的,但挖出這些惡意交易的礦工們也會賺上一筆的。

這對開發者和用戶意味著什麼呢?雖然讀取本地區塊鏈是免費的,但寫入和運算是花錢的。儲存更是尤其昂貴,因為任何寫入的信息都會被永久的儲存著。相比之下,CPU運算很便宜。正是因為任何程序所有的歷史狀態都被記錄著,改變一個賬戶的存儲狀態,在一般程序里被認為是對已分配內存的操作,在區塊鏈中卻算作寫入操作。以太坊是圖靈完備的,誰也攔不住你寫一個視頻解碼器然後發布在區塊鏈上;只不過估計你沒錢運行它。假設這樣的程序的代碼至少有幾千行,即使把它上傳到區塊鏈上也不會便宜。一個幫助人們理解以太坊合同實際能力的啟發是:這個功能是否能在一個1999年的智能手機上實現?

作為開發者,這意味著你得認真思考代碼的效率。雖然存儲效率尤其重要,但是CPU的每個周期也是要花用戶的錢的。兩個同樣功能的合同,最有效率的那個才能生存下來。

知道了理論上的無限可能和現實中的各種限制:那麼是什麼讓以太坊如此的炫酷?


現實中的例子

在同我們一起充滿激情的討論智能合同的無限可能,包括無基礎設施的政府,和其它改變世界的想法前,作為開胃菜,我們來一起學習一個生活中簡單的智能合同的例子。

假設我的樂隊剛剛錄製完一個全新的專輯,然後我們打算分享給我們的粉絲。可我們是朋克青年(譯者註:朋克思想即反對體制,提倡個體自由),不管是iTunes還是YouTube,都是體制內的。所以我們打算把專輯印製100份限量版黑膠唱片,然後記錄並只邀請購買者去我們認為最棒的酒吧觀看獨家表演。一般來講我們會用類似PayPal之類的服務來收款,它再在每個交易里收取一些費用。我們收到錢後就發貨,然後再在表格軟體上記錄這個交易,這樣等到第101人要買的時候我們就不會忘了拒絕。這個計劃聽起來就不夠穩妥,所以難怪藝人和粉絲寧可付中介費也要用類似Ticketmaster和Bandcamp的中介公司。幸運的是,樂隊鼓手有編寫以太坊智能合同的經驗,我們就決定編寫一個「購買記錄表」來完成我們的計劃。

這個記錄表合同很簡單,只有三個函數:purchase,provePurchase,和claimAlbum。粉絲在網頁上通過purchase函數往合同賬戶里轉入指定數額的以太。只要轉入的錢大於等於售價,合同中的計數器就會累加。寄款人的以太坊地址和領認次數組成一個結構,保存在一個數組裡。要是轉賬後計數器超過100,交易就會失敗(並退款)。

購買成功後,粉絲會發給我們收唱片的地址。但在寄出前,claimAlbum函數會在數組裡的各個結構中查找付款人的地址並將領認次數加1。只有領認次數為1的時候我們的網頁才會接受這個收貨地址,之後再發貨。為了保證我們只接受完成付款的人們的收貨地址,而且只發一份唱片,我們要求提交地址時用戶與claimAlbum的轉賬(譯者註:與區塊鏈函數的互動都稱為轉賬)必須使用與purchase函數的轉賬同樣的以太賬戶。

那怎麼防止表演當天沒買專輯的人混進來呢?這時候就要用到provePurchase函數了。 只需在門口放個iPad,人們就可以用購買專輯的賬戶和provePurchase驗證之前的交易了。如果這些賬戶存在於合同的數組裡,就知道他們確實購買了專輯,provePurchase也就會返回True。看門的就會放行。

不僅如此,粉絲也能在購買前,驗證我們的專輯是否真的是獨家的。以太坊上的合同的地址是內容決定的,也就是說源碼進了區塊鏈後是可以被它的哈希散列找到的。合同源碼若是開源的話,人們就可以獨立的用源碼的散列來驗證區塊上的合同的功能性。

這裡描述的例子只是一個非常簡化的實現,但你應該可以從中看到智能合同是如何免除中介的。Ujo Music,比方說,用更加穩固和易用的方式,實現了流媒體和轉售的微支付,並讓藝人有更多的掌控權。不僅如此,藝人可以保留100%的收入的。一般人們付蘋果公司30%的利潤得到的安全性,區塊鏈也可以給你,而且幾乎免費。


歡迎來到區塊鏈的世界

現在我們有能力寫任意複雜度的代碼,把它存在區塊鏈上,再通過它的哈希值去找它,並知道調用裡面的函數後,這代碼會在所有的節點上運行。代碼輸出的結果可以通過驗證其過往的狀態來達到所有節點的共識。這些複雜的函數交易就象比特幣的轉賬一樣被礦工挖出。我們上傳到區塊鏈的代碼叫合同,也就是去中心化應用(dapps)的後台。「智能合同」這個比喻其實很好的解釋了以太坊動作的方式,包括優勢(合同無法破壞,任何的輸入都會產生可預測的輸出,並且記錄無法修改)和劣勢(比請律師便宜,但是不完全免費)。

大家一起共建和諧未來吧!

原文:https://medium.com/@ConsenSys/ethereum-bitcoin-plus-everything-a506dc780106

作者:Mike Goldin


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 點點網路信息科技 的精彩文章:

區塊鏈系列:區塊鏈的確定性問題
區塊鏈系列:從比特幣到以太坊

TAG:點點網路信息科技 |