深度解析共識演算法系列之Algorand平臺開發實踐

買賣虛擬貨幣
 共識演算法(Consensus Algorithm)是保證區塊鏈可信度和安全性的重要技術。目前,有多種主流的共識演算法,如工作量證明(Proof of Work, PoW)、權益證明(Proof of Stake, PoS)等等,各有其優、缺點與適用物件。在區塊鏈技術領域,不可小覷共識演算法的重要地位。我們與Algorand合作,共同為大家帶來的硬核分享“深度解析共識演算法”系列活動目前已進行到第三講。在本期分享中,Algorand基金會Associate Director朱海潮,為諸位Hacker講解Algorand平臺開發實踐。


Algorand 這個名字既代表了一個創新的共識演算法,也代表了一個基於該共識演算法實現的公鏈平臺。在前面的課程中我們已經學習了共識演算法相關的所有內容。如果你確實完全跟著學習了前兩個講座的話,那麼你對於共識演算法的理解應該已經高於99%的小夥伴了。沒來得及的朋友和可以去看看前兩次講座的整理文章。

今天我們會講解在 Algorand 平臺上開發是怎樣一種體驗。一般想要入門一個新的區塊鏈平臺,只需要搞懂四個概念就可以了:區塊,交易,地址(也叫錢包或賬戶),以及該平臺上的自定義資產(即 ASA,Algorand Standard Asset)。

今天的講座我們就按照這個順序來介紹。

區塊

Algorand 區塊鏈使用 Algorand 共識演算法進行區塊和交易資料的共識。

在 Algorand 區塊鏈瀏覽器中檢視的時候可以發現,有時候區塊高度使用輪次(Round)這個詞來表示的。

這是因為在 Algorand 中,每一輪共識演算法的流程結束之後都會產出一個塊,即一個共識輪次對應一個區塊。

這就意味著,Algorand 區塊鏈在共識過程中不會產生分叉,同時每個區塊中的交易都可以在一個區塊內被立即被確認,而並不是像以太坊一樣需要等待十幾個區塊才能確認交易。

目前 Algorand 主網上的區塊確認時間約為4秒,也就是說一筆交易4秒即可實現最終確認(Finality)。

交易

交易的型別有三類:(1)ALGO 交易:用於傳送 ALGO 代幣(2)ASA 交易:用於建立,傳送和配置 ASA 資產(3)參與共識交易:用於註冊地址從而參與到共識當中。

這三類交易都使用了相同的交易體結構,在構造交易時可以選擇不同的交易型別,並填寫對應的交易資訊。

建立交易和交易簽名的過程都可以離線完成,簽名之後的交易可以被髮送到節點處進行驗證和廣播。

交易的 ID 是離線生成的,在構造完交易並簽名後就可以立即獲得交易 ID;而不是像以太坊一樣需要等待節點返回交易 ID。

這裡的好處是可以避免交易 ID 重複的交易被多次執行,同時也不需要使用類似以太坊中的 nonce 的機制,免去了錢包等客戶端管理和記錄 nonce 的工作。

原子交易

除此以外,Algorand 還原生支援原子交易功能。

當你希望幾筆交易能夠同時進行時,就可以使用原子交易的功能。
該功能允許你將幾筆交易組合在一起,變成一筆交易。只有當這筆組合後的交易被其中所包含的所有交易的傳送方都簽名之後,該交易才能被確認。

如下圖所示:

該功能可以使用 SDK 輕鬆實現,下面使用 Python SDK 做一個示例:

這裡的邏輯也非常簡單:當多方進行交易時,為了實現所有交易的原子性(即要麼都成功上鍊,要麼都失敗),只需要把幾筆交易收集起來,計算一個組交易 ID 出來,然後再讓所有人帶著這個 ID 去簽名自己的交易,就算是確認允許自己的交易在這一組交易中合法了;之後只需要把所有簽過名的交易打包傳送上鍊,就可以實現這一組交易的原子交易的功能了。

輕鬆加愉快。

地址

Algorand 上的地址有三種:(1)個人賬戶地址(2)多籤賬戶地址(3)邏輯賬戶地址

個人賬戶地址就是普通的錢包地址,有私鑰作為密碼,地址本身由公鑰生成。當需要從該地址傳送交易出去時,則需要使用對應的私鑰對交易進行簽名,才能在區塊鏈上認證透過。

多籤賬戶地址

多籤賬戶地址是由多個個人賬戶地址組成的地址。使用者可以透過使用 SDK 將多個地址組合成一個多籤地址,並指定至少需要其中 n 個地址的簽名才能解鎖該地址。

比如可以將三個地址組合成一個多籤地址,並指定解鎖地址數為2,即當有其中兩個地址的私鑰對交易簽名後,該交易就可以使用該多籤地址中的資產。

用 Javascript 的 SDK 實現時會是這麼一種體驗:

是不是簡單到爆?這都歸功於 Algorand 在密碼學上的獨特優勢,這才能為開發者們提供真正網際網路時代的開發體驗。

邏輯賬戶地址

邏輯賬戶指的是一個由程式控制的賬戶。這種賬戶和普通賬戶一樣可以儲存 ALGO 和 ASA 資產,但不一樣的是,從邏輯賬戶發出的交易並不是透過簽名來實現的,而是使用該賬戶對應的邏輯程式來判斷的。

這裡的邏輯程式就是 Algorand 上的智慧合約 ASC1 (Algorand Smart Contract) 了。Algorand 團隊設計了一種簡單的指令碼語言 TEAL 來實現這種邏輯程式。

在具體使用時,我們先使用 TEAL 語言編寫指令碼實現邏輯,然後再使用工具對指令碼進行編譯,就可以得到一個邏輯賬戶地址和一個邏輯簽名;我們可以正常從一般賬戶向該邏輯賬戶地址充值;若是想從該賬戶中轉出一些資產,則需要使用該邏輯賬戶地址作為傳送方,再使用其邏輯簽名對交易進行簽名;最後再將交易傳送上鍊,區塊鏈就會依據事先編寫的指令碼邏輯來判斷這筆交易的合法性。

使用這個功能,再加上之前提到的原子交換,我們就可以實現很多的功能了。這裡提供一個賬戶實現自動兌換 ASA 代幣的功能作為示例。

首先編寫一個指令碼,邏輯為:

· 必須是一組有兩筆交易的交易組,其中一筆交易使用該邏輯賬戶的地址作為傳送方,交易數量為 X 個 ASA 代幣
· 交易組中的另一筆交易必須是給該賬戶傳送 Y 個 ALGO 的交易

用 TEAL 指令碼實現邏輯的程式碼如下(注意:這裡為了方便省略許多其他的安全性判斷,比如對交易手續費的判斷等,在實際操作中需要注意,完整程式碼請參考文件:https://developer.algorand.org/):

之後我們需要使用編譯工具對上面的代幣編譯,可以得到一個 Base64 格式程式字串和邏輯賬戶地址;接著就可以使用 SDK 來構造和傳送交易。

這裡使用 Java 語言的 SDK 作為示例(省去了組合交易的部分,具體可參考文件:https://developer.algorand.org/):

地址最小余額

關於賬戶,有一個在區塊鏈設計中必須注意的問題,那就是防止地址的濫用。

在區塊鏈上每一個地址的都將佔用網路中節點的儲存空間,若是允許使用者無成本的在鏈上創造地址,那麼將會使儲存的佔用大大增加,從而增加節點的負擔,降低網路的去中心化程度。

以太坊上防止類似問題的機制是提供獎勵,當使用者主動傳送交易銷燬一個地址時可以獲得一些 Gas 的獎勵。

但在實際中這種方法顯然並不奏效。2017 年的 ICO 泡沫產生了大量的無用合約和地址,大量的佔用了儲存空間,使得節點負擔劇增。目前若是想要同步一個以太坊存檔節點,已經需要至少 3T 的硬碟空間,並且必須是 IO 速度在 5,000 以上的 SSD 才可以。

Algorand 在這個問題上的解決方案是直接增加建立地址的成本。Algorand 上的地址是有最小余額的。每個普通的 Algorand 地址都需要持有最少 0.1 個 ALGO;當地址持有 ASA 資產時,每持有一種 ASA 資產,該最小余額增加 0.1 ALGO。

若一筆交易試圖將某個賬戶地址上的 ALGO 數量減少到少於最小余額,那麼該交易將不合法。

如果想要提取所有剩餘 ALGO 並登出地址,可以使用交易中的 CloseTo 引數來實現,具體方法可以參考文件:https://developer.algorand.org/。

ASA

Algorand 上的自定義資產 ASA 是由原生功能實現的,而不是像以太坊上的 ERC20 那樣透過部署合約實現。

建立資產,設定資產資訊,凍結資產,傳送資產等這些功能都可以透過傳送原生的交易實現,而不需要去呼叫任何的自定義合約。

SDK 中也有對應的功能,這裡用 GO 語言的 SDK 做一個示例,在鏈上建立一個 ASA 資產:

需要注意的是,每個地址在接收 ASA 資產之前,都必須要進行一次註冊(Opt-In),即透過向自己傳送一筆數量為0的該 ASA 資產的交易,來告訴區塊鏈,自己已經準備好接收這種資產了。

這種設計主要是為了未來合規做打算:Algorand 作為一個金融平臺,上面會發行各種合規的金融資產。而大部分合規資產都會要求發行人和出售方對於購買方實行 KYC 制度。這就意味只有一個賬戶經過一種 ASA 資產的 KYC 之後,它才有資格去接收這種資產。

Algorand 的這種設計,原生保障了鏈上 KYC 的可行性,將無國界金融(Borderless Economy)這個口號用程式碼落實在了實際設計中。

用 SDK 實現 ASA 地址註冊的方法如下:

接下來就是傳送 ASA 資產。過程與傳送原生資產 ALGO 一模一樣,只需要呼叫一個 SDK 函式構造一筆交易,填寫好引數,再簽名傳送即可。

除此以外,Algorand 還提供了 ASA 的凍結和銷燬等功能,具體的細節可以參考參考文件:https://developer.algorand.org/。

寫在最後

也許大家會注意到:Algorand 目前並沒有提供所謂圖靈完備的智慧合約功能給開發者。這一點完全是從產品角度出發考慮後所作出的決定。

圖靈完備的合約擁有著最大程度的靈活性,但獲得這些靈活性來自於對安全性和便利性的妥協。當開發者能夠使用更多的函式和功能時,就意味著他們需要更多的程式碼才能實現一個簡單的功能,這就增大了攻擊面,降低了使用的便利性。

同樣是去中心化交易所中所必須的原子交易功能,Algorand 上原生自帶,使用起來只需幾行程式碼,安全性也更高;但在以太坊上則需要透過部署一個複雜的合約才能實現。

就好比 Windows 和 MacOS 上的應用程式:一個可定製性更高,但不知什麼時候就會中病毒的招,各類彈窗廣告也層出不窮;一個功能少但更簡潔,滿足需求的同時保證了安全性和便利性。

未來 Algorand 還會針對開發者的需要來不斷擴充功能,保證在安全和便利優先的條件下,滿足所有去中心化應用的開發需求。

同時還可以注意到 Algorand 將大部分的功能都放到了鏈下實現,只有需要驗證,並且經過共識的資訊才會發到鏈上。大部分的計算工作都不需要與鏈打交道,這就減輕了鏈的壓力,同時也提升了開發的效率。

除此以外,同樣是為了方便開發者,Algorand 提供了命令列工具 goal 和 Javascript,Java,Python,GO 四種語言的 SDK 來協助各位進行開發。

實際上如果細心觀察的話,就可以發現今天講座裡的程式碼示例我就用了四種開發語言分別展示。更多的工具可以參考開發者文件:https://developer.algorand.org/。

總而言之,Algorand 致力於將開發門檻降到最低的這份心意,希望大家都能透過今天的這個講座確實的接收到。

講座的最後再佈置一個作業,希望大家回去之後都能在 Algorand 上去發行一個屬於自己的 ASA 代幣。前十名發行成功並提供地址給我們的同學,我們將給予 100 ALGO 的獎勵。想了解更多詳情,請訪問下方Github地址

https://gist.github.com/Mine77/23e513462ad55f9da2888996e4deeae5

去吧,Algorand 的大航海時代開始了!世界上的一切都放在那裡,想要的話就去拿吧!

免責聲明:

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

推荐阅读

;