區塊鏈時代的世界憲章:程式碼即法律

買賣虛擬貨幣
1. 區塊鏈世界的“程式碼悖論”程式碼曾經是自由的,越優秀的程式碼越自由,就如越好的語言擴充套件性越強一樣,然而一旦在程式碼中新增區塊鏈概念,就實現了不可篡改性。既然程式碼不可篡改,就必須保證程式碼沒有漏洞。可誰敢保證自己沒有錯誤呢?這真是一個難題。如果說信任的機器是區塊鏈的軀幹,共識機制是區塊鏈的靈魂。無論是軀幹還是靈魂,在區塊鏈的世界裡最終都是由程式碼構成的,那麼,程式碼就相當於是區塊鏈的DNA了。在現實世界中,法律作為一種配置社會資源的機制,被社會經濟發展的客觀要求所決定,並直接影響著經濟執行的全部過程。隨著社會分工細化和人類活動範圍日益擴張,法律逐漸變成國家制度框架下加以確認的一套格式化規則體系,它能夠簡化社會關係的複雜程度,節約交易成本,幫助社會成員安全、規範、有序地進行交易。不管是基於社會契約論、功利主義論、暴力威懾論還是法律正當論,法律的約束力都從未突破人的自我意志。也就是說,在現實世界中,法律的解釋是多樣的;而在區塊鏈的世界中,程式碼的解釋則是唯一的。

圖5-1所示的是一個交易輸出(Transaction)過程,其解釋是比較確定的,即來自“14c5f88a”賬戶向“bb75a980”賬戶的價值為10的轉賬,該交易的標記(交易雜湊)為30452fdedb3df7959f2ceb8a1。兩個交易賬戶餘額變化顯而易見,“14c5f88a”交易前餘額為“1024 eth”,交易後為“1014 eth”;“bb75a980”原有“5202 eth”,交易後為“5212 eth”。由程式碼完成的交易輸出其解釋唯一,沒有歧義。

2. 法律的本質是“合約”

現行法律的本質是一種合約,它是由(生活於某一社群的)人和他們的領導者所締結的一種關於彼此該如何行動的共識。個體之間也存在著一些合約,這些合約可以理解為一種私法,相應地,這種私法僅對合約的參與者生效。

合同的概念可以追溯至遠古時代,古希臘人和古羅馬人認為,合同是解決信任、透明度和執法問題的正式協議,如市場交易合同、企業組織生產經營活動的各種內部規章及其他一些契約關係。

目前,主要依靠當事人的忠實履約或第三方來保障合約實行。在具體操作過程中,合約會面臨著一系列成本,例如,交易雙方在要約與承諾階段因大量的談判而發生的簽約成本;合同簽訂過程中,雙方還可能根據不同的情況對合同條款進行修改、補充以使合同更加完備而產生的修約成本;合同的維護和執行過程中發生的履約成本等。

例如,你和一個人訂立合約,借給他一筆錢,但他最後毀約了,不打算還這筆錢,此時你多半會將對方告上法庭。可打官司這種事情充滿了不確定性,通常情況下,將對方告上法庭,意味著你需要支付高昂的費用聘請律師,幫你在法庭上展開辯論,這一過程大多曠日持久。即使你最終贏得了官司,也可能會遇到一些問題(如對方拒不執行法庭判決)。而對你比較有利的是,當初你和借款人把條款寫了下來,訂立了合約。

但法律的制定者和合約的起草者們都必須面對一個不容忽視的挑戰:在理想的情況下,法律或合約的內容應該是明確而沒有歧義的,但現行的法律和合約都是由語句構成的,而語句,則是出了名地容易出現歧義。

3. 合約:區塊鏈世界的“法律前置”

一直以來,現行的法律體系都存在著兩個巨大的問題:第一,合約或法律是由充滿歧義的語句定義的;第二,強制執行合約或法律的代價非常大。

而隨著區塊鏈技術的誕生,這些問題將以更友好的方式解決。由程式碼組成的區塊鏈技術基於法律框架,透過預設自動執行的智慧程式碼合約在約束並引導人們的行為時引入技術,依靠技術使資訊更加透明、資料更加可追蹤、交易更加安全,大大降低了執行成本。從某種意義上來說,這是一種“ 法律前置”,有點《少數派報告》電影的味道。

在區塊鏈世界中,由程式碼構成的智慧程式碼合約形成了區塊鏈的“ 自規則”——區塊鏈中的法律。換句話說,程式碼即法律。

程式碼對應語言中的文字,但不同於文字的多釋義,程式碼的含義具有唯一性。程式碼作為一種核心工具,可以用它來構築並保護我們最基本價值理念的網路空間,同樣也可以用程式碼使其消失殆盡。斯坦福的勞倫斯·萊斯格(LawrenceLessig)教授在《程式碼》一書中反覆強調:基於程式碼的軟體或協議能夠像任何法律規則一樣規管我們的生活。

網際網路的基礎架構就是TCP/IP協議a,這個協議規定資料包是在網路中進行傳輸和交換的。

就是這個簡單的協議,保證了網際網路的迅猛發展。因為,它沒有試圖在基礎的網路架構里加入太多的東西,如安全和控制等,從而保證了基礎架構的簡單和靈活性。網際網路的這種架構,讓創新在網路的邊緣節點來進行,從而有很多的創新應用得以被髮明出來。

如果當初按照AT&T(美國電話電報公司)的想法來規劃網際網路,那麼網際網路將不會像今天這樣了。作為一個企業,AT&T必然會在基礎架構里加入很多功能和控制,並會對邊緣節點的接入應用進行限制,那樣的網際網路就不會像今天這樣開放和自由。

一開始是美好的,控制著整個網際網路的核心運作的就是TCP/IP協議,它是嚴格執行這個協議的程式程式碼。在計算機網路世界裡,所有的規則定義是以程式碼來實現的。

然而發展的路徑卻並不是由程式設計師說了算:第一代架構是由非商業組織研究者和駭客建立的,他們關注於如何建立一個網路;第二代架構則是由商業建立的;第三代架構已經是政府的作品。現實社會的法律開始作用於網路空間,程式碼越來越不是法律,反而法律開始影響網路的架構,開始影響虛擬世界的一行行程式碼。為了維護網路空間的穩定,網路實名制被提上議程,新發的帖子需要透過關鍵詞審查;為了網路純潔,圖片需要改變外鏈規則。在網路空間內,程式碼實現了法律所需要的效果,“法律”化身為程式碼。

不過,到了區塊鏈時代,它區別於傳統網際網路,有著自定共識規則和自動實施規則的能力。區塊鏈技術可以透過技術方法落實契約原則,解決信任問題。這是契約的前置,信任的鎖定,法律的嵌入,社羣的共識。每一筆交易都透明公開,透過共識協議和可程式設計的智慧程式碼合約形式,可以建立互信、創造信用,制定和執行交易各方認同的商業條款,引入法律規則和監管控制節點,確保價值交換符合契約原則和法律規範,避免無法預知的交易風險。

誰要改變這樣的程式碼就是與整個社羣為敵,程式碼就是法律。

4. 程式碼實現雜湊值的計算

我們知道,比特幣使用雜湊加密演算法來維護資訊的安全性,那麼程式碼要如何實現這一過程呢?

以Pythona語言為例,首先,開啟終端,輸入“Python”並按【Enter】鍵,然後將進入Python REPLb,在這種環境下,可以直接使用Python命令,而不是在單獨的檔案中編寫程式。最後輸入以下數值,在每行之後按【Enter】鍵,並在標記處輸入“TAB”,如下所示:

import hashlib
def hash(mystring):
[TAB] hash_object = hashlib.md5(mystring.encode())
[TAB] print(hash_object.hexdigest())
[ENTER]

這樣就建立了一個函式——Hash( )。該函式將計算出某一特定的使用MD5雜湊演算法的字串的雜湊值。將字串插入上述的括號中便可執行該函式。例如:

hash(liangzixuepai)

按【Enter】鍵並檢視該字串的雜湊隨機值:

e4b9cb27e1fa5e644dc53e20de8c108f

如果改變這串字元,會發生什麼呢?是雜湊值的微小變化還是什麼?

hash("liangzixuepai") => e4b9cb27e1fa5e644dc53e20de8c108f
hash("lianzixuepai") => 8a76b8bce8a03603003f23cce0e1b034

你將看到,在同一字串上,呼叫該雜湊函式將總是生成相同的雜湊,但新增或改變其中的某一個字元,將會生成一種完全不同的雜湊值。

程式碼實現了雜湊函式的執行,在區塊鏈中,透過程式碼就可以計算雜湊值,基於雜湊演算法的數字加密也才得以更好地進行。

5. 基於程式碼程式設計的區塊鏈

想要區塊鏈自規則能夠完整執行,少不了程式碼的程式設計。下面從程式碼的角度實際講一下如何形成一個完整的區塊鏈。

① 邏輯步驟決定區塊結構。

為了保證事情儘可能簡單,我們只選擇最必要的部分:Index(下標)、Timestamp(時間戳)、Data(資料)、Hash(雜湊值)和Previous Hash(前區塊雜湊)。如圖5-2所示。

② 確保區塊鏈的這個塊中必能找到前一個塊的雜湊值,以此來保證整條鏈的完整性。程式碼如下:

class Block {
constructor(index, previousHash, timestamp, data, hash) {
this.index = index;this.previousHash = previousHash.toString();
this.timestamp = timestamp;
this.data = data;this.hash = hash.toString();

③ 雜湊加密。這裡採用的是SHA-256 演算法(上面所用的是雜湊MP5 演算法出來的雜湊值),為了儲存完整的資料,必須用雜湊計算整個區塊。SHA-256會對塊的內容進行加密,記錄這個值應該和“ 挖礦”毫無關係,因為這裡不需要解決工作量證明的問題。其程式碼如下:

varcalculateHash = (index, previousHash, timestamp, data)
=> {
return CryptoJS.SHA256(index + previousHash + timestamp +
data).toString();
};

④ 塊的生成。要生成一個塊,必須知道前一個塊的雜湊值,然後創造其餘所需的內容(= Index, Hash, Data and Timestamp)。塊的Data部分是由終端使用者所提供的。程式碼如下:

vargenerateNextBlock = (blockData) => {
varpreviousBlock = getLatestBlock();
varnextIndex = previousBlock.index + 1;
varnextTimestamp = new Date().getTime() / 1000;
varnextHash = calculateHash(nextIndex, previousBlock.hash,
nextTimestamp, blockData);
return new Block(nextIndex, previousBlock.hash,
nextTimestamp, blockData, nextHash);
};

⑤ 塊的儲存。記憶體中的JavaScripta陣列被用於儲存區塊鏈。區塊鏈的第一個塊通常被稱為“起源塊”,是硬編碼的。

vargetGenesisBlock = () => {
return new Block(0, "0", 1465154705, "my genesis block!!",
"816534932c2b7154836da6afc367695e6337db8a921823784c14378ab
ed4f7d7");
};
var blockchain = [getGenesisBlock()];

⑥ 確認區塊完整性。在任何時候,都必須確保一個區塊或者一整條鏈的區塊的完整效能夠被確認。在從其他節點接收到新的區塊,並需要決定接受或拒絕它們時,這一點尤為重要。

用程式碼表現為:

varisValidNewBlock = (newBlock, previousBlock) => {
if (previousBlock.index + 1 !== newBlock.index) {
console.log('invalid index');
return false;
} else if (previousBlock.hash !== newBlock.previousHash) {
console.log('invalid previoushash');
return false;
} else if (calculateHashForBlock(newBlock) !== newBlock.hash) {
console.log('invalid hash: ' + calculateHashForBlock(newBlock) + ' ' + newBlock.hash);
return false;
}
return true;

⑦ 選擇下一個鏈。任何時候在鏈中都應該只有一組明確的塊。萬一出現衝突(例如,兩個節點都生成72號塊時,如圖5-3所示),前面的主幹區塊鏈會選擇有最大數目認同的鏈。

varreplaceChain = (newBlocks) => {
if (isValidChain(newBlocks) &&newBlocks.
length>blockchain.length) {
console.log('Received blockchain is valid. Replacing
current blockchain with received blockchain');
blockchain = newBlocks;
broadcast(responseLatestMsg());
} else {
console.log('Received blockchain invalid');

⑧ 節點控制。某種程度上,使用者必須能夠控制節點。這一點可以透過搭建一個HTTP伺服器實現。程式碼如下:

varinitHttpServer = () => {
var app = express();
app.use(bodyParser.json());
app.get('/blocks', (req, res) =>res.send(JSON.stringify
(blockchain)));
app.post('/mineBlock', (req, res) => {
varnewBlock = generateNextBlock(req.body.data);
addBlock(newBlock);
broadcast(responseLatestMsg());
console.log('block added: ' + JSON.stringify(newBlock));
res.send();
});
app.get('/peers', (req, res) => {
res.send(sockets.map(s => s._socket.remoteAddress + ':' +
s._socket.remotePort));
});
app.post('/addPeer', (req, res) => {
connectToPeers([req.body.peer]);
res.send();
});
app.listen(http_port, () => console.log('Listening http
on port: ' + http_port));
};

至此,一個區塊鏈世界已經建立完成,在短短兩百多行程式碼中,這個數字世界的法律被建立,“程式碼即法律”得到了完美的詮釋。

但值得注意的是,以上的程式碼只是最簡單的一種程式碼架構,像比特幣和以太坊的程式碼經過這麼長時間的發展,已經發生了一些變化,它們要複雜得多,架構肯定也完整得多。

6. 區塊鏈世界法律架構的確立——以以太坊為例

以太坊(Ethereum)透過數字貨幣和程式語言的結合,為使用者提供了一個智慧合約編寫平臺,使用者能夠以智慧程式碼合約為底層系統確定自己區塊鏈世界的“法律”。

以太坊的智慧合約由一個完整的程式語言構成,有時也被叫作以太指令碼(EtherScript)。程式碼語言是人類用來控制計算機工作的,而反過來,計算機則無法猜透人類的意圖,因此,用任何程式碼語言寫好的指令,對計算機來說都準確無誤、沒有歧義。也就是說,計算機執行一段程式碼不存在歧義,除非是程式碼編寫出了問題。在同樣的條件下,這段程式碼總是會按照既定的步驟執行,這種特性正是人類現行法律與合約中所缺失的。有了以太指令碼之後,就可以建立具備這種特性的合約。

考慮大部分的合約都涉及經濟價值的交換或具有某種經濟後果,因此可以在以太坊上用程式碼實現人類社會中各式各樣的法律與合約。用程式碼實現合約,可以有嚴格明確的定義,並且可以自動被執行。

這樣說有些晦澀難懂,還是一起來看個簡單的例子吧。

假如你有一個青花瓷古董,小明想以8888元的價格購買這個青花瓷,同時小明承諾會在5月付款。按照傳統的交易流程,首先你會與小明簽訂一個合約,合約裡會詳細寫明:小明將在5月向你付款。合同簽訂完畢,你就將青花瓷交到小明手裡,等小明5月給你付款。等到了5月,按照你對合約的理解,小明應該付款了。可當你要求其履行合約時,小明表示他約定的5月指的是明年5月,而不是今年5月。這個時候,你就只能花錢請律師,和小明去法庭上好好討論一下合同裡的“5月”到底是何年何月了。

而如果基於以太坊,你完全可以用以太指令碼定義出如圖5-4所示的“智慧程式碼合約”,這份合約,人和計算機都可以讀懂。

一開始就讀懂上圖所示的程式碼合約可能要花點時間(如果你不是一名程式設計師的話),但一旦學會如何閱讀,這份程式碼合約絕對比現有的律師起草的合約要通俗易懂得多。

在圖5-4中,合約先確定了你和小明的身份(你為賣家,小明為買家),並直接說明這場交易透過價值8888元的以太幣來進行。在區塊鏈世界,代表身份(即賬戶地址)的是一串雜湊字元值,因而交易雙方需要在以太坊區塊上確認彼此身份。合約定義了買家(小明)的以太坊賬戶地址為“6af26739b9ffef8aa2985252e5357fde”,同樣定義賣家(你)的以太坊賬戶為“feab802c014588f08bfee2741086c375”。雙方確認身份無誤後,合約內容就是2018 年4 月1 日,以太坊輸出價值8888 元的以太幣和青花瓷所有權,買家在收到青花瓷後立即支付價值8888 元的以太幣。合約經過平衡函式除錯後最終確立,2018 年5 月1 日自動執行。

以上合約清晰明瞭,如果採用這種方式,一般的使用者就可以起草簡單的程式碼合約,特殊一點的程式碼合約可能需要稍微資深一點的專家(就像複雜的傳統合約也需要專門的律師起草一樣)。作為結果,我們得到的這份合約完全消除了類似“我認為,你認為”的這種誤解,締約雙方是否依法履約的不確定性也一併被消除。

也就是說,程式碼指令碼寫成的這份合約,既定義了合約內容,又保證了合約內容的執行。

本質上而言,由程式碼構成的合約是一個無歧義且無法毀約的合約,只要雙方都認同合約,那麼合約就一定會執行,不管其中是否有人想毀約或者提出歧義,程式碼就是最好的語言,程式碼的自規則將自行運轉,是不以人的主觀意志為轉移的機器法律。

7. 結語:程式碼即法律

法律作為一種社羣共識,是以人性作為起點,以道德作為基礎,以利益作為條件,以暴力作為信用而形成的一個“合約”,但這個“合約”很容易在高收益的誘使下被破壞,然後違約者被發現後才會受到法律制裁,這是一種“過去式”懲罰機制。

而區塊鏈程式碼是一種“內在的”規則,為軟體程式碼定義的對應的演算法運算規則,如果不遵守程式碼的執行機理,程式將返回一個error(錯誤)並停止執行,這是一種“進行時”執行機制。程式碼所組成的“進行時”機制從根本上保證了整個規則體系的運轉,如果程式碼無漏洞,該體系就無法被打破。

因此,程式碼意味著規則,區塊鏈世界的憲章就是程式碼,程式碼即法律。

當然,最後的區塊鏈世界會不會和網際網路世界一樣仍然由法律來主宰程式碼,誰也無法預測。

有時候,我們低估了技術的力量,也高估了人性的底線。

但由於區塊鏈技術的介入,如果想要修改區塊鏈世界憲章,那將是一場更激烈的戰爭。

文末思考題

司法解釋是憲法賦予法官和審判組織的司法權,由於每個法官對法律條文或多或少會摻雜一些個人的理解,因此就會出現一些謬誤。在區塊鏈技術產生之後,有人認為,將現有法律轉換成程式碼就可以實現法律的一致性,就不會出現歧義,法律也能很好地執行,你贊同這樣做嗎?為什麼?

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;