Aion虛擬機:介紹和入門

一、引言

2014年以太坊誕生,作爲新一代的區塊鏈網絡,相比於比特幣而言,具有一個明顯的創新之處,那就是以太坊虛擬機。比特幣雖然定義了一套操作碼,用來實現交易鎖定和解鎖,但是這些操作不是圖靈完備的,不具備和現代程序相比擬的表現能力。以太坊虛擬機(以下簡稱evm)就不一樣,它定義了一套圖靈完備的操作碼,同時發明了solidity語言,開發了對應的編譯器和虛擬機,使得區塊鏈的信息表達能力上了一個新的臺階,每個token持有者通過付出一定的費用就能自己把代碼部署到以太坊網絡上,這一創新給以太坊帶了一波開發的熱潮,比如CryptoKitty,一些結合鏈上鍊下的遊戲。雖然大量的合約交易暴露了以太坊網絡效率問題,不可否認的是,虛擬機及其支持的合約已經成爲了區塊鏈開發的熱門領域。
Aion誕生於2017年,團隊目前共有53位成員,他們來自上海,多倫多,倫敦,巴巴多斯。這些來自不同國家的工程師們不懈的努力着向Aion用戶展示技術路線圖。如今Aion網絡已被廣泛應用(介紹應用領域?),爲了保持行業領先地位,Aion將競爭聚焦於工程團隊、差異化市場策略及生態系統貢獻者的建立之上。目前已經吸引了衆多活躍的生態系統工程貢獻者加入Aion項目。一年多前Aion計劃建造自己的虛擬機項目,時隔一年後,2019年6月5日Aion正式上線Aion虛擬機(Aion Virtual Machine,以下簡稱AVM),Aion團隊爲了滿足生態發展的需要,開發出了輕量級架構、圖靈完備的虛擬機,旨在爲全球開發者提供一個高效、簡單、穩定、安全、且容易優化的區塊鏈專用系統。
相比於以太坊編程語言,衆所周知,solidity在發展過程中遇到了不少大大小小的問題,存在很多攻擊向量。譬如max call depth attack、reentrancy sttack、underflow sttack等等,以太坊歷史上著名的TheDAO attack,導致以太坊網絡硬分叉併產生了以太經典(ETC)。同時,solidity語言和傳統的編程語言有着較大的差異,初次進入區塊鏈領域的開發者需要花費更多精力去了解學習,同時還要了解相關容易產生攻擊的寫法,不然很容易寫出帶有漏洞的合約(比如對solidity中call語法和transfer語法的適當使用)。這是廣大區塊鏈開發者面臨的共同問題,也有很多項目團隊和組織推出了自己的標準,最著名的當屬WASM。但是衆所周知,開發者最常用的語言是依然是Java。

圖一: 2019編程語言流行榜[1]
可以看到,Java依舊強勢地佔據着編程語言領域的龍頭位置,除了系統級編程語言C和近年來被人工智能大火燒起來的Python,其他語言沒有能和Java的普及度正面抗衡的。
Aion團隊站在巨人的肩膀上,同時基於當下最迫切的需求,認爲區塊鏈應該吸引越來越多的開發者來共同構建生態,這和Aion的願景:連接區塊鏈世界,也是統一的,因此團隊花費了很多的時間和精力,終於將自主研發的虛擬機運行在了Aion主網上。Java開發者幾乎可以無縫進入區塊鏈應用開發領域。下面我們簡單介紹一下AVM,然後讓我們首先看看Aion區塊鏈合約長什麼樣子,從這個最基本的合約衍生出去介紹Aion區塊鏈上面交易執行的原理和一些細節,最後介紹一些Aion開發的方便使用的插件,用來提高開發效率,進一步降低區塊鏈應用門檻。經過這一講,熟悉java語言的開發者應該就能上手構建Aion區塊鏈應用了。文末有彩蛋,耐心看完的讀者都將是彩蛋的潛在收益者。

二、AVM介紹

AVM(Aion Virtual Machine)顧名思義是運行在Aion Blockchain Network上的虛擬機,它以Java虛擬機爲基石,加入了字節碼轉換和運行時,用來約束jvm行爲,使之符合Aion區塊鏈的基本需求。那麼區塊鏈虛擬機的基本需求究竟是怎麼呢?

區塊鏈虛擬機首要原則:
1、確定性
衆所周知,運行同一區塊鏈網絡的節點需要相互達成共識,這個共識內容在不同的網絡中也許是不一樣的,但是共識是當前區塊鏈網絡的基石,譬如Aion當前使用的基於工作量證明的共識以及未來使用的混合權益證明和工作量證明共識。如果同樣的代碼在不同節點上執行結果不同,這些節點就無法達成共識。所以確定性是區塊鏈虛擬機最基礎的原則。
2、安全性
區塊鏈虛擬機相比於傳統虛擬機的一個重大不同之處是:它是依賴於token的,有直接產生、轉移、消耗token的能力,如果虛擬機或者合約存在漏洞,可能會讓黑客有機會隨意操縱token,從而獲取巨大利益。這其實不僅僅是虛擬機的事情,也是整個區塊鏈網絡的事情。

Aion虛擬機在保證以上兩個原則的前提下,充分保留了java開發的特性,在如何讓合約開發變得更加方便和容易上產生了很多成果。

1、完全兼容的語法。
2、一樣的編譯、打包過程。
3、自動化部署、調用、調試插件。

下面我們就來體驗一下。

三、AVM合約樣例

按照慣例,先展示一個Hello, World程序。

package example; 
// 導入avm內置模塊:提供了一些內置方法供使用。例:println import avm.Blockchain; 
import org.aion.avm.tooling.abi.Callable;  

public class HelloAvm
{     
	private static String myStr = "Hello AVM"; 
	// Callable表示此方法可從合約外部調用 
	// 緊跟着定義一個public static方法,這是作爲Callable屬性必須的。
	@Callable     
	public static void sayHello() {         
		// 在標準輸出打印"Hello Avm"         
		Blockchain.println("Hello Avm");     
	}      
	@Callable     
	public static String greet(String name) {         
		return "Hello " + name;     
	}      
	@Callable     
	public static String getString() {         
		Blockchain.println("Current string is " + myStr);         
		return myStr;     
	}      
	@Callable     
	public static void 	setString(String newStr) {         
		myStr = newStr;         
		Blockchain.println("New string is " + myStr);     
	}
}

這是avm合約的Hello, World樣例程序,具體方法含義已經註釋在代碼中。現在我們回答以下幾個問題:編譯、部署及調用、一些常用庫的介紹。

3.1、合約編譯

建立maven項目,pom文件中需要指定幾個字段,這裏先不介紹了,在第二節我們將提供Intellij IDEA插件方便快捷的構建項目,其中會自動生成avm需要的pom文件。建立完成後,執行:mvn clean install 即可,在target目錄下看到的HelloWorld-1.0-SNAPSHOT.jar既爲最終的jar包。注意:還有一個帶前綴’original-'的jar包是原始jar包,會包含一些冗餘的模塊,實際中不使用。

3.2、合約部署和調用

合約部署有幾種方法,但是原理都是一樣的。都是通過發送交易給某一個全節點,交易裏面包含了合約信息,然後通過共識最終進入區塊鏈網絡,目前Aion還是基於PoW,即將迎來PoW/PoS混合共識。就目前來講,有這麼幾種方法部署合約:

  1. 通過Intellij IDEA插件輔助部署,對這種方法感興趣的朋友可以直接進入下一節。
  2. 通過rpc,或者http請求,將構建好的交易發送給節點,適合有相關經驗的開發人員或對區塊鏈原理感興趣的朋友。

第二種方法的具體過程如下:
3. 找到一個運行Aion區塊鏈網絡的全節點,或者自己運行一個全節點,個人電腦推薦Aion Rust:https://github.com/aionnetwork/aionr。目前由於PoW算力的問題,一般都是連接mining pool。注意:如果是自己首次運行全節點,需要等待較長(一般幾天)的網絡同步時間,直到節點最高block和主鏈的最高block一致,這個時間主要取決於網絡、存儲設備等IO性能。
4. 構建自己的交易,可參考https://github.com/aionnetwork/aion_web3,交易中的data字段既爲avm合約代碼,其形式爲4字節長度 + 合約字節碼(上一節編譯出來的jar包),譬如前面的HelloWorld合約對應的data字段爲:
0x00001c13504b0304140008080800d44d292b000000000000000000000000140004004d4554412d494e462f4d414e49464553542e4d46feca0000f34dcccb4c4b2d2ed10d4b2d2acecccfb35230d433e0e5f24dccccd375ce492c2eb65248ad48cc2dc849d5f348cdc9c9772ccbe5e5e2e50200504b0708651573233900000037000000504b0304140008080800d4…
交易的type字段設置成2,表示這是一筆創建avm合約的交易。
3. 發送交易,等待確認,可以通過 https://mainnet.aion.network/#/dashboard 查看交易是否被確認。

值得注意的是:部署合約到主網上是要消耗真實的Aion Coin的,Aion官方提供了測試網絡mastery供使用和測試,感興趣的可以聯繫aion申請,在測試網上進行上述操作,相關的交易信息可以通過 https://mastery.aion.network/#/dashboard 查看。

3.3、有哪些庫供開發者使用

3.3.1 Aion區塊鏈內置方法和變量

主要位於avm package。
一些常用的內置類型:
 avm.Address:Aion定義的賬號地址,32字節數組。
 avm.Blockchain:Aion區塊鏈相關的方法定在在這個class中。
 avm.Result:Aion交易執行結果,包含狀態和返回值,常用於合約調用其他合約過程。
如上所述,Aion區塊鏈相關方法主要位於avm.Blockchain類中,以靜態方式提供。
一些常用方法如下:

  • Blockchain.getAddress():獲取當前交易的目標地址,等價於當前合約地址。
  • Blockchain.getCaller():獲取發送當前交易的賬號地址。
  • Blockchain.getRemainingEnergy():獲取當前交易剩餘gas。
  • Blockchain.call(Address target, BigInteger value, byte[] data, long energyLimit):調用合約。

3.3.2 通用類型

Java原生
boolean/char/short/int/long/float/double/string/bytearray
修改的java類型
位於org.aion.avm.userlib;
AionList/AionSet/AionMap/AionMap[2]

以上只是列舉了一些我們可能最常用的類型和接口,avm提供的方法遠不止這些,等待開發者去在真實場景中使用,如果有需要,我們也可以結合具體的案例進行詳細的講解。

四、構建應用的快捷工具

Aion官方強烈推薦Intellij IDEA插件,方便快捷的構建maven項目。以上述HelloWorld項目構建爲例。
版本要求:

  • IntelliJ 2018.30 and above
  • Java 10 and above
    第一步:工具安裝
    以筆者的Intellij IDEA 2019.2社區版爲例。進入File/Settings/Plugins,在Marketplace下搜索aion即可看到avm插件,如圖3.1所示。
    在這裏插入圖片描述
    圖3.1 aion intellij plugin安裝界面

點擊Install安裝,等待安裝完成。
在這裏插入圖片描述
圖3.2 avm插件安裝完成界面

點擊Restart IDE,重啓。

第二步:構建項目
新建項目,選擇Maven,選中Create from_archetype選項,點擊列表中的org.aion4j:avm-archetype,如圖3.3所示。
在這裏插入圖片描述
圖3.3 創建avm合約項目
點擊Next,填寫GroupID和ArtifactId
在這裏插入圖片描述
圖3.4 GroupID和ArtifactId
一路Next後,完成,會彈出如下界面,點擊Enable Auto-Import。
在這裏插入圖片描述
圖3.5 項目啓動彈窗
等待maven更新項目,更新完成後會彈窗提示項目初始化,點擊確認,或者打開任意項目文件,右鍵菜單選擇Aion Virtual Machine/Run Initialize。
第三步:構建jar包,然後部署到本地
打開pom.xml文件,編輯窗口鼠標右鍵點擊Aion Virtual Machine/Embedded/Deploy(或者右鍵項目名字),avm plugin將幫助您生成jar包,同時部署到本地。
在console log中可以看到如下界面:
在這裏插入圖片描述
圖3.6 本地部署avm合約
注意其中的Contract Address和Deployer Address,合約地址後面會用到。

現在,讓我們來打出AVM的Hello, World吧!

打開HelloAvm.java,右鍵點擊sayHello方法,在彈出菜單中選擇Aion Virtual Machine/Embedded/Call,彈出如下界面:
在這裏插入圖片描述
圖3.7 執行合約窗口
在Contract Address中填入我們剛剛記錄的合約地址,簡化操作,也可以點擊Use Last Deployed Contract Address選擇框,會自動選擇上次部署的合約地址,然後點擊OK,這時候我們看到了我們想要的結果。
在這裏插入圖片描述
圖3.8 avm HelloWorld運行結果
似乎有點不太一樣,模板中寫的是Hello Avm,沒有關係,Avm的Hello同樣證明了我們已經能夠順利的編譯並且運行一個avm合約了。

一個小遊戲
經過本文介紹,相信讀者朋友們已經能夠自己部署avm合約了,下面我們來通過一個小遊戲檢驗一下學習成果。

遊戲規則:
5. 每個參與者自己編寫一個AVM合約,要求合約提供一個方法:whoiam,輸入爲空,返回字符串表示名字。
6. 等到遊戲開始時,我們會公佈一個測試節點,來讓參與者將合約部署到上面,部署成功後,發送交易hash給Aion小姐姐。
7. Aion小姐姐會檢查每位玩家的結果,公佈,發放獎勵。

參考資料:
[1] https://www.tiobe.com/tiobe-index/
[2] https://docs.aion.network/docs/aion-list

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章