近期Facebook剛發佈了區塊鏈libra官網和白皮書,世界譁然,Libra構建的以美元爲支撐掛鉤一攬子貨幣將挑戰各國主權貨幣,更可能在不久的將來,強勢取代落後國家的主權貨幣。
Libra 的使命是建立一套簡單的、無國界的貨幣和爲數十億人服務的金融基礎設施。
從白皮書上看,Libra將創造一個新的去中心化區塊鏈、一種低波動性加密貨幣和一個智能合約平臺的計劃,以期爲負責任的金融服務創新開創新的機遇。
從技術上分析,Libra 區塊鏈採用了基於 LibraBFT 共識協議的 BFT 機制來實現所有驗證者節點就將要執行的交易及其執行順序達成一致。這種方法可以在網絡中建立信任,因爲即使某些驗證者節點(最多三分之一的網絡)被破壞或發生故障,BFT共識協議的設計也能夠確保網絡正常運行。與其他一些區塊鏈中使用的“工作量證明”機制相比,這類共識協議還可實現高交易處理量、低延遲和更高能效的共識方法。
我們今天就從編譯一次libra,並執行一筆交易爲開始。開啓libra的探索之旅。
libra的源代碼委託在github上,我們可以輕鬆獲取他的源代碼
git clone https://github.com/libra/libra.git
編譯Libra
要編譯libra,我們可以先要切換到Libra目錄並運行安裝腳本以安裝依賴項,如下所示:
cd libra
./scripts/dev_setup.sh
安裝腳本執行以下操作:
- 安裝rustup - rustup是Rust編程語言的安裝程序,實現了Libra Core。
- 安裝所需版本的rust-toolchain。
- 安裝CMake - 管理構建過程。
- 安裝protoc - 協議緩衝區的編譯器。
- 安裝Go - 用於構建協議緩衝區。
如果設置失敗,請參閱故障排除。
我的環境是ubuntu16.05,執行完成後,報這樣的錯誤。
error: failed to run custom build command for `openssl-sys v0.9.48`
針對上面的錯誤,請安裝最新版本的openssl
sudo apt install libssl-dev
然後再執行
source /home/cuijb/.cargo/env
cargo build
構建Libra CLI客戶端並連接到Testnet
./scripts/cli/start_cli_testnet.sh
這們會連接到Libra Core的測試網絡。其實我們可以在本地啓動測試網絡,並且直接連接到本地的測試網絡,在libra目錄下運行如下命令:
cargo run -p libra_swarm -- -s
顯示如下:
Finished dev [unoptimized + debuginfo] target(s) in 0.40s
Running `/home/cuijb/libra/target/debug/libra_swarm -s`
Faucet account created in (loaded from) file "/tmp/keypair.o14NS4KREcvA/temp_faucet_keys"
Base directory containing logs and configs: Temporary(TempDir { path: "/tmp/.tmp3hm7Az" })
To run the Libra CLI client in a separate process and connect to the local cluster of nodes you just spawned, use this command:
cargo run --bin client -- -a localhost -p 37637 -s "/tmp/.tmp3hm7Az/trusted_peers.config.toml" -m "/tmp/keypair.o14NS4KREcvA/temp_faucet_keys"
Loading client...
Connected to validator at: localhost:37637
usage: <command> <args>
Use the following commands:
account | a
Account operations
query | q
Query operations
transfer | transferb | t | tb
<sender_account_address>|<sender_account_ref_id> <receiver_account_address>|<receiver_account_ref_id> <number_of_coins> [gas_unit_price_in_micro_libras (default=0)] [max_gas_amount_in_micro_libras (default 100000)] Suffix 'b' is for blocking.
Transfer coins (in libra) from account to another.
dev
Local move development
help | h
Prints this help
quit | q!
Exit this client
Please, input commands:
libra%
如果你看到顯示 libra%,說明客戶端啓動成功了
創建賬戶
libra% account c
>> Creating/retrieving next account from wallet
Created/retrieved account #0 address f2f94bfd087444db386cc69712f256beda6ecb0f4e30134efed772c80bd223ef
我們可以清楚看到,我們創建的第一個賬戶,#0,他的地址是:f2f94bfd087444db386cc69712f256beda6ecb0f4e30134efed772c80bd223ef
顯示賬戶列表
libra% account la
User account index: 0, address: f2f94bfd087444db386cc69712f256beda6ecb0f4e30134efed772c80bd223ef, sequence number: 0, status: Local
Faucet account address: 0000000000000000000000000000000000000000000000000000000000000000, sequence_number: 0, status: Persisted
鑄幣
我們創建了兩個賬戶,暫定爲Alice和Bob,爲兩個賬戶鑄幣,不妨爲Alice的賬戶鑄幣100LBR,爲Bob鑄幣200LBR(LBR爲Libra的原生貨幣符號)
給Alice創建100libra
libra% account mint 0 100
>> Minting coins
Mint request submitted
給Bob創建200個 Libra
libra% account mint 1 200
>> Minting coins
Mint request submitted
查賬戶餘額
查詢Alice的餘額
libra% q b 0
Balance is: 100.000000
查詢Bob的餘額
libra% q b 1
Balance is: 200.000000
查賬戶的序列號
查詢Alice的序列號
libra% q s 0
>> Getting current sequence number
Sequence number is: 0
查詢Bob的序列號
libra% q s 1
>> Getting current sequence number
Sequence number is: 0
注意:Libra中的序列號和以太坊1.0中的nonce意思是一樣的。
轉帳
我們將Alice的50個libra轉移給Bob。
libra% t 0 1 50
>> Transferring
Transaction submitted to validator
To query for transaction status, run: query txn_acc_seq 0 0 <fetch_events=true|false>
按賬戶index和序列號查詢交易
libra% query txn_acc_seq 0 0 true
>> Getting committed transaction by account and sequence number
Committed transaction: SignedTransaction {
raw_txn: RawTransaction {
sender: 265b54817517c9a1efb872998817df7802eac3df3dd19e2e090338337ef74a78,
sequence_number: 0,
payload: {,
transaction: peer_to_peer_transaction,
args: [
{ADDRESS: 52593c9d2408d25b20e7a9693f7af1154c99800647f8b9e9ec8974c99b9efdcf},
{U64: 50000000},
]
},
max_gas_amount: 100000,
gas_unit_price: 0,
expiration_time: 1564650898s,
},
public_key: 54d60a80458c06969481dbf22f689f80bcdad133a045b6b86b9ec4298bb139f1,
signature: Signature( R: CompressedEdwardsY: [190, 42, 181, 13, 77, 96, 141, 83, 142, 224, 55, 11, 0, 3 2, 202, 131, 136, 91, 64, 139, 152, 118, 225, 112, 15, 74, 32, 107, 208, 9, 6, 5], s: Scalar{
bytes: [66, 154, 212, 67, 4, 188, 127, 21, 8, 61, 167, 93, 247, 94, 88, 146, 74, 196, 54, 229, 6 7, 77, 109, 116, 181, 73, 117, 139, 160, 44, 99, 8],
} ),
}
Events:
ContractEvent { access_path: AccessPath { address: 265b54817517c9a1efb872998817df7802eac3df3dd19e2e09033 8337ef74a78, type: Resource, hash: "217da6c6b3e19f1825cfb2676daecce3bf3de03cf26647c78df00b371b25cc97", s uffix: "/sent_events_count/" } , index: 0, event_data: AccountEvent { account: 52593c9d2408d25b20e7a9693 f7af1154c99800647f8b9e9ec8974c99b9efdcf, amount: 50000000 } }
ContractEvent { access_path: AccessPath { address: 52593c9d2408d25b20e7a9693f7af1154c99800647f8b9e9ec897 4c99b9efdcf, type: Resource, hash: "217da6c6b3e19f1825cfb2676daecce3bf3de03cf26647c78df00b371b25cc97", s uffix: "/received_events_count/" } , index: 1, event_data: AccountEvent { account: 265b54817517c9a1efb87 2998817df7802eac3df3dd19e2e090338337ef74a78, amount: 50000000 } }
我們可以清楚的從交易中,分析到這筆交易。
做了一筆交易後,我們查詢一下交易序列.
libra% q s 0
>> Getting current sequence number
Sequence number is: 1
libra% q s 1
>> Getting current sequence number
Sequence number is: 0
查詢餘額
libra% q b 0
Balance is: 50.000000
libra% q b 1
Balance is: 250.000000
從餘額可以清楚看到,從Alice賬戶將50個libra轉移給我Bob。
2019年8月1日,寫於深圳。