我為什麼要寫這篇文章?在了解區塊鏈相關資訊時(例如維基百科上的內容),我發現這些內容非常零碎和不連貫。要把這些零碎的資訊整合在一起,形成乙個完整的檢視需要花費大量的時間。不過現在,我想我已經知道在引入區塊鏈時要使用哪些東西,以及應該按照怎樣的順序來了解它們,以便讓開發人員能夠在 1 到 1.5 小時內看到完整的檢視。本文內容經過一定程度的簡化,如果有人對更複雜的細節感興趣,可以繼續深入**。
非對稱加密已經存在很長一段時間了,非對稱加密包含了公鑰和私鑰。我們使用公鑰加密並使用私鑰解密,並且無法從這兩者中的乙個中獲得另外乙個。因此,在使用非對稱加密技術時,我可以向某人傳送一條資訊,比如「我轉賬 100 美元」,每個人都知道它是我傳送出去的,而且中間沒有被篡改過。
假設有十個人,他們每個人都擁有一定數量(假設是美元)的新貨幣。他們每個人都確定(並確信)乙個叫「x」的人支出了 30 萬美元,但 x 是否真的擁有 30 萬美元還不得而知。為了弄清楚情況,我們需要知道每個人的餘額。我們只需要將他所有收入交易加起來,並扣除所有支出交易,這樣就能得到餘額。為此,我們需要了解有關收入和支出的資訊,於是公共賬本出現了。有了公共賬本,我們就知道某人是否真的有能力支出 30 萬美元。
位元幣:開端
還有乙個問題——如果我把所有錢同時發給兩個人會怎樣?這個問題被稱為雙重支出(double spending)。當然,這兩個人不應該同時收到我賬戶裡的錢。讓他們自己商量誰將收到我賬戶裡的錢?這樣做不方便。通過檢視時間戳來確定我把錢先轉給了誰?這樣做不保險。不過,還是有乙個解決方案——對交易進行流水化。如果這樣做了,那麼很明顯第一筆付款發給了 john,那麼就無法再將它發給第二個人,因為我沒有更多的錢。但現在還不清楚誰將決定交易的順序。在銀行和其他集中式系統中,銀行本身就是受託人,也就是單一故障點和信任點,負責與第乙個接收人溝通。
在區塊鏈中,不存在這樣的單個受託人,取而代之的是網路中的大部分參與者(當然,這是指將整個網路作為乙個整體,因為你不能相信每個個體參與者,因為其中肯定有一些**)。我們假設網路不受乙個人的控制,並且大多數參與者嚴格按照自己的經濟利益行事。
但流水化交易仍然存在問題,我們還需要在網路參與者中達成「共識」。這個問題需要通過共識演算法來解決,這是區塊鏈領域的乙個關鍵演算法。
在討論特定的共識演算法之前,先讓我們來說說臭名昭著的區塊鏈的「區塊」。區塊是一種技術度量,是批處理的乙個例項,因此我們可以以「批量」的方式計算多個交易的共識,並且網路的開銷成本可以通過多個交易來「分攤」。
區塊內交易的順序由網路參與者(即生成該區塊的人員,也稱為「礦工」)定義,但區塊本身的順序則由共識演算法來確定。共識演算法已經存在了相當長一段時間。例如,多主 nosql 系統中的 paxos 和 raft 等演算法就屬於共識演算法,但它們並不適用於擁有數百萬個參與者的網路。
位元幣的工作證明(proof of work,pow)共識演算法在剛開始時被認為是革命性的。許多網路參與者(礦工)同時生成新區塊,那麼就有必要確定區塊之間的順序。為了讓乙個區塊成為鏈中的下乙個區塊,礦工必須進行非常耗時的雜湊計算。對乙個區塊(隨同乙個隨機串,乙個遞增的數字)進行持續的雜湊計算,直到雜湊值看起來像是乙個符合某些條件的大數,例如包含 10 個前導零。這需要數十億次的雜湊操作,這一過程代表礦工「證明」該區塊的存在。但檢查礦工的工作是否正確卻十分容易——只需要再進行一次雜湊操作。需要注意的是,整個網路(其中包括成千上萬的礦工)平均在 10 分鐘內(位元幣生成區塊的平均間隔)只可以生成乙個區塊 。這大大減少了出現衝突的可能性,即同時有兩個或多個區塊作為下乙個區塊。
但是,衝突的可能性仍然存在。於是就有了如下規則——網路參與者接受形成最長鏈的那個區塊。
事實上,它不是乙個鏈,而是乙個有許多分支和鏈的有向無環圖(dag)。鏈通常被稱為「共同歷史」(它是最長的鏈)。共識不會立即達成,至少需要在生成幾個區塊之後,所以必須等待一段時間。為了防止位元幣的雙重支出,人們通常會等待六個區塊(這需要乙個小時)。
除了交易資料之外,乙個區塊還包含對前乙個區塊的雜湊值。因此,過去的某些內容不可能被修改,因為如果修改了就會使其後的所有雜湊無效。在挖礦過程中,你將獲得獎勵,也就是新的資金收益!否則的話,該如何將資金引入到這個系統呢?如果說資金必須發放給某人,那麼這個人就變得很特別,這與去集中化的想法是相矛盾的。為挖礦者發錢似乎是一種合乎邏輯和可接受的解決方案。
順便說一些關於挖礦的事。礦工的主要工作是對新區塊進行雜湊計算,這裡沒有使用非對稱加密技術,因為只需要在將交易新增到區塊之前檢查交易。位元幣使用 sha-256 雜湊,以太坊則使用 keccak-256。如果你是獨自挖礦,那麼在生成乙個區塊之前,需要很長的時間(每十分鐘產生乙個區塊,而你的競爭者有成千上百萬)。因此,礦工需要聚集在一起形成礦池。在礦池中,獎勵在參與者之間通過各種方式進行分配,這意味著你有可能會更經常地獲得獎勵。在這種情況下,風險和收益都是「分散」的。隨著時間趨於無限,來自礦池開採獎勵的數學期望值(無視礦池佣金)等於獨自挖礦的數學期望值。
到目前為止,我們主要介紹的是網路參與者之間的資料交換,並沒有深入太多細節。要記住,資料通過網路進行點對點交換,讓每個挖礦者都能看到交易。
這就是位元幣區塊鏈技術。
智慧型合約和 ico
讓我們繼續。兩個操作(加法和減法)在位元幣的每個賬戶上執行,任何人(主要是礦工)都可以檢查它們。但如果我們向帳戶新增內部變數並新增比較操作呢?假設當我積累了 1000 萬美元時,我不想再讓我的帳戶繼續接受資金,也就是說除了向賬戶新增資金的操作,還需要一定的條件。於是我們有了確定性圖靈機(每個人仍然可以檢查我的賬戶),然後是智慧型合同。本文所說的智慧型合約指的是以太坊網路中的智慧型合約,因為它是目前最受歡迎的智慧型合約。
確定性意味著在交易引數相同和儲存初始狀態相同的情況下,我們最終會得到相同的結果以及相同的儲存變更。只有在這些條件得到滿足的情況下,網路才能就每筆交易達成共識。我們必須明白,因為對確定性、可驗證性和去中心化的要求,智慧型合約孤立於外部世界。例如,它無法呼叫去中心化的 web api。另外,智慧型合約對外界的控制也非常有限。例如,要通過智慧型合約來租用公寓(交換加密貨幣)仍然是很困難的,因為我仍然需要確信當我來到公寓門口時,電子鎖上面不會再套著一把老式的掛鎖。
要了解智慧型合約的執行結果(新的餘額或儲存變更),網路節點必須執行該合約規定的操作。在多個節點上的計算不是免費的,因此,以太坊引入了瓦斯(gas)的概念,以避免出現硬編碼加密貨幣佣金,並讓使用者可以計算運算數量及設定**。這種結構提供了乙個額外的間接層,讓使用者可以在低成本交易和快速交易之間進行選擇。
當資金被傳送到合約賬戶(通過位址)時,它便觸發了回退功能,即預設的入口。與賬戶不同的是,合約有多個入口——因此可以接受引數。要修改合約(無論入口是什麼),你必須將交易傳送到網路。但是,如果你只想以唯讀模式檢視某些內容,則可以通過使用最新的區塊鏈在本地執行此操作。另外,與賬戶不同的是,智慧型合約沒有私鑰。你不能直接從餘額中提取資金——這可以通過使用定義好的方法來完成,當然這些方法應該有安全限制,例如檢查試圖訪問資金的使用者的位址。
最後,我們在位元幣風格的區塊鏈上獲得智慧型合約技術。
許多加密貨幣或所謂的「代幣」都是基於以太坊智慧型合約。是的,通常這種加密貨幣只是乙個以太坊合約。餘額是 map 形式的智慧型合約儲存條目,貨幣從乙個參與者到另乙個參與者的轉移如下所示:
map[alice] –= payment;map[bob] += payment;
他們不需要自己挖礦和自己的網路,他們可以使用以太坊的基礎設施。在以太坊中,ico/ito 是指加密貨幣(代幣)的乙太網交換(以太坊網路的加密貨幣)。 erc20 標準說明了哪些方法必須在加密貨幣中定義,這要歸功於交易所對加密貨幣的支援以及以太坊錢包提供的支援。
未來的發展
除了智慧型合約之外,還有很多其他建立在區塊鏈基本概念之上的想法,比如「零知識證明(zero-knowledge proof)」和「自律網路(self-regulated network)」。
零知識證明基於同名的密碼協議族,實質上,它最初用於在不解開整個物件的情況下證明該物件的所有權。例如,如果我能夠說出某個檔案隨機十個位元組的位置,那就可以證明我擁有這個 1gb 的檔案。顯然,在這種情況下,我將只公開了 1gb 中的 10 個位元組。由於 rsa 加密涉及求冪,並且
(y ∗ x) ^ a = y^a ∗ x^a
所以最後變成了
encrypted(y ∗ x) = encrypted(y) ∗ encrypted(x)
也就是說,任何人都可以檢查我的帳戶餘額是否正確執行了乘法預算,而且沒有必要透露我的帳戶上有多少錢!基於這個想法,我們可以建立一種可以保護餘額和支付隱私資訊的加密貨幣(實際上,這樣的貨幣已經存在,如 zcash)。
區塊鏈提供的通用設定已經包含在網路客戶端的**中,例如區塊的交易數量。通常,更改它們需要網路參與者社群接受這些更改(以**更新的形式),這會帶來網路分支的風險(當一些參與者決定不接受更改並繼續使用「舊」**)。自我監管嘗試解決這些問題(參見 tezos 或 eos 區塊鏈)。這個想法的本質是,對於每一次變更,都可以使用自己的資金進行投票(當然,不會失去它們)。
結論簡而言之,區塊鏈技術走過了以下的路徑:
交易簽名(非對稱加密技術)+ 交易的開放性 + 交易的流水化 + 到圖靈機的擴充套件 +(零知識證明 | 自我監管 | ……)
我已經提到,許多加密貨幣實際上是以太坊的智慧型合約,也就是說它們使用了以太坊區塊鏈。但除了位元幣和以太坊之外,還有其他專案——它們在細節和主要特徵方面可能會有所不同,有人已經嘗試建立幾乎全新的區塊鏈,如 eos,甚至是不同的區塊拓撲,如 tangle 和 aelf。
英文原文:
乙個普通程式設計師眼中的 技術
技術是程式設計師安身立命的根本,可一味的追求提高技術卻未必能從技術上獲得相應的回報。通常情況下,程式設計師要使自己所學的技術產生相應的價值或者收入必須依託於某個公司,靠自己單幹很難賺到錢,即使能賺到錢價效比也不如替企業打工來的高。所以程式設計師一般都是替別人打工的。程式設計師在企業裡打工,目的就是替...
乙個程式設計師眼中的價值
前天看了timyang的乙個技術從業人員眼中的2014 有些觀點我很是贊同,於是我也有了想寫點什麼的衝動 在2015年的第二天,我終於好像有了一些跳躍的想法,可以說給大家聽聽.也許不夠體系,不夠完整,但或許能得到一些共鳴.我先給我大家講講我的故事,我在2007年的時候去了雅虎實習.當時應聘實習的時候...
乙個程式設計師眼中的北京和上海
面積 北京 16410.54 平方公里 上海 6340.5 平方公里 人口 北京 2151.6 萬人 上海 2500 萬 光看數字可能在北京長住但沒在上海住過的朋友肯定覺得上海的交通情況非常恐怖。想一想也可以知道,2500 萬人口 6340.5 平方公里怎麼算也比北京人口密度大。實際上並非如此。我大...