歡迎光臨
每天分享高質量文章

區塊鏈上的 Hello World

文章內容由Crossin的程式設計教室」撰寫並授權使用


談起這幾年最熱的技術,一定少不了區塊鏈。按說新技術的出現本是稀鬆平常的事情,但區塊鏈的出現和發展,卻有那麼一點讓人不淡定:

其一,區塊鏈的代表應用比特幣,其價格在這七八年間翻了上百萬倍。2010年有人花10000個比特幣買了兩塊披薩,在比特幣最高價位時,這兩塊披薩相當於近兩億美元。

其二,因為區塊鏈專案的大熱,相關從業人員的需求激增,崗位薪資也水漲船高,讓一眾程式員們蠢蠢欲動。

正所謂人紅是非多,關於區塊鏈以及數字貨幣的爭論一直不斷。支持者認為區塊鏈將會是有一項改變世界的新技術,而反對者則認為它不過是又一個更高階的龐氏騙局罷了。

我覺得,對於一個新興事物,沒必要過早地下結論。尤其在還不瞭解它的情況下,就憑自己的固有觀念來站隊打標簽,這是很不明智的。

於是,和你們學習Python一樣,我也在不斷學習新的技術,而區塊鏈就是我最近關註較多的一項。在這裡分享下我對區塊鏈的一些認識和理解。

說區塊鏈就不能不說比特幣。它們好像雞和蛋的關係:區塊鏈是比特幣的技術基礎,但區塊鏈的相關研究卻是由比特幣開始

比特幣的特殊之處在於,它透過區塊鏈實現了一種新的記賬方式:除了創世區塊外,每個賬本(區塊)都記錄了上一個賬本的特徵資訊(雜湊值),一個個賬本構成了一整個鏈條。同時這個鏈條存在於整個網路的每個人手上。這樣一來,如果要修改已有的資料,就會導致後續賬本上的資訊都不對了。如果你想對以前的一筆交易動手腳,則必須把後續賬本上的記錄都修改掉,並得到其他人的認可。

而比特幣的另一項設計,就是每個賬本上必須附帶一個特殊的數字,這個數字的特點是難以計算但很容易驗證。計算這個數字的過程就是我們常聽到的“挖礦”。所以挖礦並不是指挖比特幣,而是為了記賬。只不過對於成功算出數字的人,會給予一定比特幣的獎勵。這個精妙的設計,使得前面說的篡改記錄變得不可能—你無法擁有足夠的計算能力去修改這些賬本,這保證了整個鏈條的可信。

上圖是雜湊演演算法的示意圖。假設我們想找到一個數字,使它加上賬本上的資訊,能滿足算出的雜湊值以4個0開頭,是非常耗時的(挖礦);但如果給定了資料,驗證它的雜湊值是否以4個0開頭,則非常容易(驗證)。

比特幣沒有我們通常意義的賬戶,它的賬本上的內容是一條條轉賬記錄,收款人是一個個數字地址。除了持有地址對應口令的人之外,無法知道這些地址的主人是誰。因此比特幣交易從技術上是匿名的。只要你有口令,你就能轉走裡面的比特幣。丟了口令,你的幣就再也找不回來了。

綜上,比特幣提供了一種去中心化的、不可篡改的、匿名的記賬方式(而並非一種以物體存在的“幣”,即便在網路上,也沒有“一個比特幣”)。而逐漸人們又發現,比特幣背後的區塊鏈蘊含著更大的想象空間。

以太坊就是區塊鏈的另一個熱門應用。它最大的優勢是提供了“智慧合約”。如果說,比特幣解決了交易記錄的可靠性問題,那麼智慧合約就更進一步,避免了賴賬的問題。

智慧合約相當於一段程式碼,它可以像交易記錄一樣被新增到區塊鏈上,又可以在條件滿足時被觸發執行。這從技術上解決了交易雙方的信任問題,提供了點對點的合約,沒有中間商賺差價。以太坊也不再是一個單純的賬本,而成為一個去中心化的應用平臺。在這個平臺之上,開發可以構建更加複雜分散式應用,無需自行實現即可擁有區塊鏈的功能。

從程式員的視角來看,以太坊是一個虛擬機器。在這個虛擬機器之上,我們可以用程式碼開發自己程式(智慧合約)。寫好的程式被上傳到區塊鏈上,等待條件觸發執行。前面說過,區塊鏈的產生是需要有人來計算的,因此在以太坊部署和執行程式碼需要支付費用(以太幣),以維持這個系統。

以太坊使用的開發語言叫 Solidity,它與 JavaScript 類似,也借鑒了 C++ 和 Python。它因以太坊而生,因此是面向合約的,並自帶支付功能。咱們作為一個程式設計類的乾貨公眾號,此處必須得來一段程式碼了。

Talk is cheap. Show me the code.

寫一個 Solidity 的 HelloWorld 並不難。我們在官方檔案的例子上稍作修改:

pragma solidity ^0.4.10;contract HelloWorld {  string greeting;

 function set(string s) public {    greeting = s;  }

 function get() public constant returns (string) {
   return greeting;  }}

這是一段很基礎的面向物件程式碼,合約(contract)HelloWorld 有一個變數 greeting,get/set 兩個方法分別獲取和修改這個變數。第一行 pragma 則是指明使用的 solidity 版本。

要執行這段程式碼,可以使用線上開發環境 remix.ethereum.org。將程式碼複製到編輯區,點選“Compile”-“Start to compile”,就得到了編譯好的可執行程式碼。

在“Run”頁面,選擇“JavaScript VM”作為環境。Account 中,已經為我們準備好了幾個餘額(以太幣)充足的賬號。點選“Create”,合約就被部署到了區塊鏈上,而相應的賬號也被扣去部署費用。同時,下方出現我們定義的 set/get 方法。

在“Set”後面的框裡輸入 “HelloWorld”(同py2一樣,別少了英文引號),點選“Set”,賬號再次被扣去執行的費用。從控制檯可以看到合約執行的詳細資訊。

點選“Get”,則會看到我們剛剛寫入的 HelloWorld。因為 Get 定義的是常函式(constant),不會修改區塊鏈中的資料,因此不消耗費用。

這就是用 solidity 實現的一個最簡單的智慧合約。

看到這裡,你是否對區塊鏈有了更多的認識?

但所謂術業有專攻,在區塊鏈領域,我也只是一個學習者。理解上若有偏差,歡迎大家留言指正和討論。

對於想進一步學習區塊鏈程式設計,或有意從事相關工作的朋友,不妨瞭解下小象學院的區塊鏈程式設計課程,有更專業的講師為你答疑解惑。點選文末的“閱讀原文”,瞭解課程的詳細資訊。

贊(0)

分享創造快樂