Libra 的 Move 語言初探,10 行代碼實現你第一個智能合約


Libra 的 Move 語言初探,10 行代碼實現你第一個智能合約

作者 | 馬超

出品 | CSDN(ID:CSDNnews)

Libra是Facebook新推出的虛擬加密貨幣,而Move是為Libra設計的全新編程語言,據稱可以在Libra區塊鏈中實現自定義交易邏輯和‘智能合約”。本文就為各位讀者介紹一下有關使用move語言編寫智能合約的方案。

Libra 的 Move 語言初探,10 行代碼實現你第一個智能合約

Move語言最主要的特性

可編程的Move交易腳本

  • 每一個Libra區塊鏈上交易都包含 Move交易腳本 用來對交易邏輯的編碼,同時驗證器據此驗證客戶端的行為(例如,將Libra幣從Alice的帳戶移動到Bob的帳戶)。
  • 交易腳本通過調用一個或者多個Move模塊的過程和Libra區塊鏈全局存儲中發佈的 Move資源 進行交互。
  • 交易腳本不存儲在區塊鏈的全局狀態中,其他的交易腳本也無法調用它,這是一次性程序。


Libra 的 Move 語言初探,10 行代碼實現你第一個智能合約

可組合智能合約的Move模塊

Move模塊(Modules)定義了更新 Libra 區塊鏈全局狀態的規則。這些模塊與其他區塊鏈系統中與智能合約相同。模塊聲明可以在用戶帳戶下發布的 資源 類型。Libra 區塊鏈中的每個帳戶都是一個容器,可以容納任意數量的資源和模塊。

  • 模塊聲明兩種結構類型(包括資源,這是一種特殊的結構)和過程。
  • Move模塊的過程定義了創建,訪問和銷燬它聲明的類型的規則。
  • 模塊可重複使用。在一個模塊中聲明的結構類型可以使用在另一個模塊中,並且在一個模塊中聲明的過程可以在另一個模塊中聲明的公共過程中調用。模塊可以調用其他Move模塊中聲明的過程。交易腳本可以調用已發佈模塊的任何公共過程。
  • 最終,Libra用戶將能夠在自己的帳戶下發布模塊。


Libra 的 Move 語言初探,10 行代碼實現你第一個智能合約

Move的一等資源

  • Move的關鍵功能是能自定義資源類型。資源類型通過編碼具有豐富可編程性和安全性。
  • 資源是語言中的普通類型值。它們可以存儲為數據結構,作為參數傳遞給過程,從過程返回,等等。
  • Move的系統為資源提供特殊的安全性保證。Move資源永遠不會被複制,重用或丟棄。資源類型只能由定義類型的模塊創建或銷燬。這些保證由Move虛擬機 通過字節碼靜態驗證,Move虛擬機將拒絕運行未通過字節碼驗證的程序代碼。
  • Libra貨幣實現為名為 LibraCoin.T 的資源類型。LibraCoin.T 在語言中沒有特殊的地位; 每個Move資源都享有相同的保護。


Libra 的 Move 語言初探,10 行代碼實現你第一個智能合約

筆者對於Move語言對於move語言的解讀

一、Move是一種靜態類型語言,也就是強類型語言,在這方面Move與Java和C類似,將問題的出現更多放在編譯時暴露,降低了在運行時出現crash的機率。

二、Move虛擬機通過字節碼(我們一會兒可以看到)保證其資源保持first-class的地位,move拒絕執行未通過字節碼驗證的程序。也就是資源只能由定義的模塊創建或者銷燬。其它模塊沒有均無權限,這樣也就避免了類似於以太坊solid多指針指向同一資源可能帶來的安全漏洞和其它問題。

Libra 的 Move 語言初探,10 行代碼實現你第一個智能合約

第一個智能合約

一、搭建Move的編譯環境,通過以下命令

cd ~/libracargo build --bin compiler

並有如下返回,代碼編譯成功

Compiling compiler v0.1.0 (/home/machao/libra/language/compiler) Finished dev [unoptimized + debuginfo] target(s) in 57.23s

好了,話不多說,我們直接來看我們的第一個合約長什麼樣子。注:以下代碼直接轉自libra的官網https://learnblockchain.cn

// Simple peer-peer payment example.
// 0x0...0 (with 64 zeroes). 0x0 is shorthand that the IR pads out to// 256 bits (64 digits) by adding leading zeroes.import 0x0.LibraAccount;import 0x0.LibraCoin;main(payee: address, amount: u64) { // The bytecode (and consequently, the IR) has typed locals. The scope of // each local is the entire procedure. All local variable declarations must // be at the beginning of the procedure. Declaration and initialization of // variables are separate operations, but the bytecode verifier will prevent // any attempt to use an uninitialized variable. let coin: R#LibraCoin.T; // The R# part of the type above is one of two *kind annotation* R# and V# // (shorthand for "Resource" and "unrestricted Value"). These annotations // must match the kind of the type declaration (e.g., does the LibraCoin // module declare `resource T` or `struct T`?).
// Acquire a LibraCoin.T resource with value `amount` from the sender's // account. This will fail if the sender's balance is less than `amount`. coin = LibraAccount.withdraw_from_sender(move(amount)); // Move the LibraCoin.T resource into the account of `payee`. If there is no // account at the address `payee`, this step will fail LibraAccount.deposit(move(payee), move(coin));
// Every procedure must end in a `return`. The IR compiler is very literal: // it directly translates the source it is given. It will not do fancy // things like inserting missing `return`s. return;}

二、編譯程序

新一個文件將上述代碼拷到你的程序當中。筆者以test目錄下的trans.m為例

mkdir testcd testgedit trans.m #貼粘上述代碼到這個文件

1. 在Libra的client進行編譯

~/libra/scripts/cli/start_cli_testnet.sh#進行到libra的命令行後執行以下命令dev c /opt/libra/test/trans.m /opt/libra/test/trans.ir

2. 也可以使用命令行進行編譯

cd ~/libra/target/debug./compiler /opt/libra/test/trans.m -o /opt/libra/test/trans.ir

3. 查看生成的ir文件,我們看到其編譯後的文件內容如下,這也就是我們剛剛所說的二進制碼,其主要是應用為安全考慮,如果無權模塊是不能改動資源的。

cat /opt/libra/test/trans.ir{"code":[76,73,66,82,65,86,77,10,1,0,8,1,83,0,0,0,6,0,0,0,2,89,0,0,0,4,0,0,0,3,93,0,0,0,9,0,0,0,12,102,0,0,0,22,0,0,0,13,124,0,0,0,9,0,0,0,5,133,0,0,0,66,0,0,0,4,199,0,0,0,32,0,0,0,7,231,0,0,0,21,0,0,0,0,0,0,1,0,2,2,4,1,0,0,3,0,1,5,1,1,6,2,2,0,2,4,2,0,2,1,7,0,0,1,2,0,2,0,2,4,7,0,0,0,3,0,3,3,4,2,7,0,0,6,60,83,69,76,70,62,12,76,105,98,114,97,65,99,99,111,117,110,116,9,76,105,98,114,97,67,111,105,110,4,109,97,105,110,1,84,20,119,105,116,104,100,114,97,119,95,102,114,111,109,95,115,101,110,100,101,114,7,100,101,112,111,115,105,116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,1,7,0,12,1,17,1,0,13,2,12,0,12,2,17,2,0,2],"args":,"modules":}

原文鏈接:

https://blog.csdn.net/BEYONDMA/article/details/98501624

☞克隆一個 AI 替自己開會,爽嗎?

☞為什麼大廠都在用 GO 語言?讀透 GO 語言的切片

☞餓了麼交易系統 5 年演化史

☞北京四環堵車引發的智能交通大構想

☞從Ngin到Pandownload,程序員如何避免面向監獄編程?

☞從Web1.0到Web3.0:詳析這些年互聯網的發展及未來方向


分享到:


相關文章: