Facebook:使用Libra完成第一笔交易
Facebook:使用Libra完成第一筆交易
http://www.libradocs.com/docs/my-first-transaction/
本文檔將指導你在Libra Blockchain上完成你的第一筆交易。在你按照執行第一筆交易的步驟之前,我們建議你閱讀以下文檔,來熟悉Libra生態系統和Libra協議:
- 介紹
- Libra協議
我們提供了一個命令行界面(CLI)客戶端來與區塊鏈進行交互。
準備
運行文檔中的命令,需要滿足以下條件:
- 你運行的是Linux(基于Red Hat或Debian)或macOS系統。
- 你可以穩定地連接到互聯網。
- 你的系統已經安裝?git。
- 如果使用 Mac,請確定已經安裝好 Homebrew。
- 如果使用 Linux,請確定已經安裝好 yum 或者 apt-get。
提交交易的步驟
在這個例子中,我們將下載必要的Libra組件并在兩個用戶之間執行一個交易:A(Alice)和B(Bob)。
執行以下步驟將交易提交到Libra testnet上的驗證者節點:
克隆并編譯 Libra Core
在終端里找一個合適的目錄下執行:
git clone https://github.com/libra/libra.git啟動 Libra Core
然后進入 libra 目錄,并運行安裝腳本:
cd libra
./scripts/dev_setup.sh
安裝腳本主要執行以下操作:
- 安裝 rustup - rustup是Rust編程語言的安裝程序,Libra Core是在其中實現的。
- 安裝 rust-toolchain。
- 安裝 CMake - 管理構建過程。
- 安裝 protoc - 協議緩沖區的編譯器。
- 安裝 Go - 用于構建協議緩沖區。
如果你安裝失敗,請查看?錯誤處理
編譯客戶端并連接到測試網絡
要連接到Libra testnet上運行的驗證者節點,請執行以下命令:
./scripts/cli/start_cli_testnet.sh這條命令會編譯客戶端,并把客戶端連接到 Libra 測試網絡中的驗證節點上。
連接成功后,會看到以下的輸出信息。連接過程可以使用?quit?結束退出。
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 (default=0)] [max_gas_amount (default 10000)] Suffix 'b' is for blocking.
Transfer coins from account to another.
help | h
Prints this help
quit | q!
Exit this client
Please, input commands:
libra%
如果看到上面的信息,說明你的客戶端運行正常,并且已經成功連接到 Libra 的測試網絡上了,接著開始創建測試賬戶。 如果你在編譯客戶端和連接到testnet時遇到問題,參考錯誤處理
Note: 如果要在本地運行驗證者節點,請參考?運行本地驗證者節點. 創建帳戶,造幣和執行交易的說明與testnet上的節點相同。
創建測試賬戶
將客戶端連接到testnet后,可以運行CLI命令來創建新帳戶。我們將引導你為兩個用戶創建帳戶(讓我們稱他們為A和B)。
Step 1: 檢查CLI客戶端是否在你的系統上運行
libra%命令行提示符指示你的Libra CLI客戶端正在運行。要查看帳戶命令的幫助信息,請輸入“account”,如下所示:
account
usage: account <arg>
Use the following args for this command:
create | c
Create an account. Returns reference ID to use in other operations
list | la
Print all accounts that were created or loaded
recover | r <file path>
Recover Libra wallet from the file path
write | w <file name>
Save Libra wallet mnemonic recovery seed to disk
mint | mintb | m | mb <receiver account> <number of coins>
Mint coins to the account. Suffix 'b' is for blocking
Step 2: 創建測試賬戶A
請注意,使用CLI創建帳戶不會更新區塊鏈,只會創建本地密鑰對。
要創建Alice的帳戶,在 libra%提示符后面輸入命令::
account create
創建成功后,你會看到以下信息:
>> Creating/retrieving next account from wallet
Created/retrieved account #0 address 3ed8e5fafae4147b2a105a0be2f81972883441cfaaadf93fc0868e7a0253c4a8
#0 是A的賬戶索引, 索引是引用A帳戶的一種方式,在區塊鏈上沒有意義,只是帳戶地址的包裝,目的是為了方便用戶引用他們創建的帳戶。 address后面的長字符串是A的帳戶地址,你可以在CLI命令中使用十六進制地址。
當前創建的賬戶只是在本地,只有以下兩種情況發生之后,才會真正在區塊鏈上創建這個賬戶:
- 當通過鑄幣(minting)將任何一筆錢添加到A的賬戶時。
- 其他用戶將錢轉賬(transfer)到A賬戶中時。
Step 3: 創建測試賬戶B
在libra% 后再次輸入創建賬戶的命令:
account create
創建成功后,你會看到以下信息:
>> Creating/retrieving next account from wallet
Created/retrieved account #1 address 8337aac709a41fe6be03cad8878a0d4209740b1608f8a81566c9a7d4b95a2ec7
#1 是B的賬戶索引,address后面的長字符串是B的賬戶地址。 有關索引的更多詳細信息,請參考創建測試賬戶A
Step 4 (可選): 列出本地所有賬戶
使用下邊的命令可以列出目前本地的所有賬戶:
account list
執行成功后,你會看到以下信息:
User account index: 0, address: 3ed8e5fafae4147b2a105a0be2f81972883441cfaaadf93fc0868e7a0253c4a8, sequence number: 0
User account index: 1, address: 8337aac709a41fe6be03cad8878a0d4209740b1608f8a81566c9a7d4b95a2ec7, sequence number: 0
sequence number表示從該帳戶發送的交易數。每次從該帳戶發送的事務被執行并存儲在區塊鏈中時,它會遞增。要了解更多信息,請參考sequence-number。
充Libra幣到測試賬戶中
在testnet上創建和添加硬幣是通過Faucet完成的。Faucet是一種與testnet一起運行的服務。此服務僅用于為testnet創建錢,并且不存在主網。它只是用來測試的,在現實中并沒有任何使用價值。假設你已經創建了A和B的帳戶,分別為索引0和索引1,你可以按照以下步驟將Libra添加到兩個帳戶。
Step 1: 向A賬戶充值110Libra幣
輸入以下命令,來完成充值:
account mint 0 110
- 0 代表A賬戶的索引編號
- 110 代表充值的金額
A successful account mint command will also create Alice’s account on the blockchain.
執行成功后,你會看到以下信息:
>> Minting coins
Mint request submitted
請注意,提交請求時,這意味著它已成功添加到mempool(testnet上的驗證者節點)。它并不一定意味著它將成功完成。稍后,我們將查詢帳戶余額以確認鑄幣是否成功。
如果你的帳戶mint命令未成功提交你的請求,請參考錯誤處理
Step 2: 向B賬戶充值52Libra幣
輸入以下命令,來完成充值:
account mint 1 52
- 1 代表B賬戶的索引編號
- 52 代表充值的金額
- 一個成功的帳戶mint命令也將在區塊鏈上創建B帳戶。在區塊鏈上創建Bob帳戶的另一種方法是將錢從A的帳戶轉移到B的帳戶。
執行成功后,你會看到以下信息:
>> Minting coins
Mint request submitted
如果你的帳戶Minting命令未成功,請參考錯誤處理
Step 3: 檢查余額
輸入以下命令,檢查A的余額
query balance 0
執行成功后,你會看到以下信息:
Balance is: 110
輸入以下命令,檢查A的余額
query balance 1
執行成功后,你會看到以下信息:
Balance is: 52
發起轉賬
在我們發起轉賬之前,我們可以查詢每個賬戶的sequence number ,這將有助于我們了解執行交易是如何改變每個帳戶的。
查詢賬戶的sequence number
query sequence 0
>> Getting current sequence number
Sequence number is: 0
query sequence 1
>> Getting current sequence number
Sequence number is: 0
在?query sequence 0中, 0 是A的賬戶索引. Sequence number等于0,意味著沒有發生任何的交易。
發起轉賬
輸入以下命令可以實現,從A賬戶向B賬戶轉10個Libra幣
transfer 0 1 10
- 0 是A的賬戶索引
- 1 是B的賬戶索引
- 10 是轉賬的金額
執行成功后,你會看到以下信息:
>> Transferring
Transaction submitted to validator
To query for transaction status, run: query txn_acc_seq 0 0 <fetch_events=true|false>
你可以使用命令?query txn_acc_seq 0 0 true?來查詢轉賬狀態。第一個參數0是要查詢的本地賬戶索引, 第二個參數0是當前此筆轉賬的序號,要查看此命令的示例輸出,請參考?輸出.
你剛才交易已經提交到了testnet驗證者節點上,它已經在驗證者節點中的mempool中。但這并不一定意味著你的交易已被執行。理論上,如果系統運行緩慢或過載,則需要一些時間才能看到結果,你可能需要通過查詢帳戶多次檢查。要查詢索引為0的帳戶,可以使用命令?query account_state 0. 輸出結果請參考輸出.
如果出現問題,請參考錯誤處理.
阻止轉移命令(同步轉賬): 你可以使用?transferb?命令替換?transfer?命令. 在使用transferb命令提交后,直到提交到blockchain后,才會返回提示信息。一個例子:
transferb 0 1 10
有關從提交到執行和存儲的交易生命周期的理解,請參閱交易的生命周期。
查詢交易次數
query sequence 0
>> Getting current sequence number
Sequence number is: 1
query sequence 1
>> Getting current sequence number
Sequence number is: 0
A的帳號(索引0)的sequence number為1表示到目前為止已經從A的帳戶發送了一個交易。B的帳戶(索引1)的sequence number為0表示到目前為止尚未從B的帳戶發送任何交易。每次從帳戶發送交易時,序列號都會增加1。
查詢賬戶余額
要檢查兩個帳戶中的最終余額,可以參考下面的命令。如果你的交易(轉賬)成功執行,你應該在A賬戶中看到100個Libra幣,在B賬戶中看到62個Libra幣。
query balance 0
Balance is: 100
query balance 1
Balance is: 62
大功告成
你已成功在Libra testnet上執行了你的交易,并將10個Libra幣從A賬戶轉移到了B賬戶!
錯誤處理
啟動相關
- 使用下邊的命令,更新 Rust:
- rustup update
- 重新運行安裝腳本:
- ./scripts/dev_setup.sh
客戶端編譯與運行相關
如果編譯失敗,請先刪除鎖定文件
- rm Cargo.lock
如果客戶端無法連接到testnet:
- 檢查網絡
- 確保是最新版本的客戶端,從線上pull最新代碼后,重新運行客戶端:
- ./scripts/cli/start_cli_testnet.sh
造幣(Minting)與充值相關
-
如果你在testnet上連接的驗證者節點不可用,你將收到““Server unavailable””消息,如下所示:
-
account mint 0 110
-
>> Minting coins
-
[ERROR] Error minting coins: Server unavailable, please retry and/or check **if** host passed to the client is running
-
如果你在提交交易后未更新余額,請稍等片刻再次查詢余額。如果區塊鏈正在經歷非常大量的交易,則可能會有延遲。如果你的余額仍未更新,請再次嘗試minting。
-
要檢查帳戶是否存在,請查詢帳戶狀態。對于索引為0的帳戶,輸入以下命令:
query account_state 0
轉賬相關
如果testnet驗證者節點(你的客戶端已連接到)不可用或你與testnet的連接已超時,你將看到此錯誤:
transfer 0 1 10
>> Transferring
[ERROR] Failed to perform transaction: Server unavailable, please retry and/or check if host passed to the client is running
解決此錯誤的步驟:
- 檢查與testnet的連接。
- 查詢發起人帳戶是否存在。對索引為0的帳戶可以使用以下命令查詢:
- query account_state 0
- 嘗試使用quit或q!退出客戶端,然后重新運行以下命令以連接到testnet:
- ./scripts/cli/start_cli_testnet.sh
查詢命令的輸出信息示例
根據賬戶索引與Sequence Number查詢交易的輸出信息示例
query txn_acc_seq 0 0 true
>> Getting committed transaction by account and sequence number
Committed transaction: SignedTransaction {
{ raw_txn: RawTransaction {
sender: 3ed8e5fafae4147b2a105a0be2f81972883441cfaaadf93fc0868e7a0253c4a8,
sequence_number: 0,
payload: {,
transaction: peer_to_peer_transaction,
args: [
{ADDRESS: 8337aac709a41fe6be03cad8878a0d4209740b1608f8a81566c9a7d4b95a2ec7},
{U64: 10000000},
]
},
max_gas_amount: 10000,
gas_unit_price: 0,
expiration_time: 1560466424s,
},
public_key: 55af3fe3f28550a2f1e5ebf073ef193feda44344d94c463b48be202aa0b3255d,
signature: Signature( R: CompressedEdwardsY: [210, 23, 214, 62, 228, 179, 64, 147, 81, 159, 180, 138, 100, 211, 111, 139, 178, 148, 81, 1, 240, 135, 148, 145, 104, 234, 227, 239, 198, 153, 13, 199], s: Scalar{
bytes: [203, 76, 105, 49, 64, 130, 162, 81, 22, 237, 159, 26, 80, 181, 111, 94, 84, 6, 152, 126, 181, 192, 62, 103, 130, 94, 246, 174, 139, 214, 3, 15],
} ),
}
}
Events:
ContractEvent { access_path: AccessPath { address: 3ed8e5fafae4147b2a105a0be2f81972883441cfaaadf93fc0868e7a0253c4a8, type: Resource, hash: "217da6c6b3e19f1825cfb2676daecce3bf3de03cf26647c78df00b371b25cc97", suffix: "/sent_events_count/" } , index: 0, event_data: AccountEvent { account: 8337aac709a41fe6be03cad8878a0d4209740b1608f8a81566c9a7d4b95a2ec7, amount: 10000000 } }
ContractEvent { access_path: AccessPath { address: 8337aac709a41fe6be03cad8878a0d4209740b1608f8a81566c9a7d4b95a2ec7, type: Resource, hash: "217da6c6b3e19f1825cfb2676daecce3bf3de03cf26647c78df00b371b25cc97", suffix: "/received_events_count/" } , index: 0, event_data: AccountEvent { account: 3ed8e5fafae4147b2a105a0be2f81972883441cfaaadf93fc0868e7a0253c4a8, amount: 10000000 } }
請注意,交易金額以microlibra顯示。
查詢結果的輸出信息示例
在下面示例中,我們從索引0的帳戶查詢“已發送”結果。注意:因為只發送了一個交易,所以只有一個結果。結果中還有驗證信息,可以用來驗證是否有丟失的內容 - this is done when the query does not return “limit” events。
query event 0 sent 0 true 10
>> Getting events by account and event type.
EventWithProof {
transaction_version: 3,
event_index: 0,
event: ContractEvent { access_path: AccessPath { address: e7460e02058b36d28e8eef03f0834c605d3d6c57455b8ec9c3f0a3c8b89f248b, type: Resource, hash: "217da6c6b3e19f1825cfb2676daecce3bf3de03cf26647c78df00b371b25cc97", suffix: "/sent_events_count/" } , index: 0, event_data: AccountEvent { account: 46efbad798a739c088e0e98dd9d592c27c7eb45ba1f8ccbdfc00bd4d7f2947f3, amount: 10000000 } },
proof: EventProof { ledger_info_to_transaction_info_proof: AccumulatorProof { siblings: [HashValue(62570ae9a994bcb20c03c055667a4966fa50d0f17867dd5819465072fd2c58ba), HashValue(cce2cf325714511e7d04fa5b48babacd5af943198e6c1ac3bdd39c53c87cb84c)] }, transaction_info: TransactionInfo { signed_transaction_hash: HashValue(69bed01473e0a64140d96e46f594bc4b463e88e244b694e962b7e19fde17f30d), state_root_hash: HashValue(5809605d5eed94c73e57f615190c165b11c5e26873012285cc6b131e0817c430), event_root_hash: HashValue(645df3dee8f53a0d018449392b8e9da814d258da7346cf64cd96824f914e68f9), gas_used: 0 }, transaction_info_to_event_proof: AccumulatorProof { siblings: [HashValue(5d0e2ebf0952f0989cb5b38b2a9b52a09e8d804e893cb99bf9fa2c74ab304bb1)] } }
}
Last event state: Some(
AccountStateWithProof {
version: 3,
blob: Some(
AccountStateBlob {
Raw: 0x010000002100000001217da6c6b3e19f1825cfb2676daecce3bf3de03cf26647c78df00b371b25cc974400000020000000e7460e02058b36d28e8eef03f0834c605d3d6c57455b8ec9c3f0a3c8b89f248b00e1f50500000000000000000000000001000000000000000100000000000000
Decoded: Ok(
AccountResource {
balance: 100000000,
sequence_number: 1,
authentication_key: 0xe7460e02058b36d28e8eef03f0834c605d3d6c57455b8ec9c3f0a3c8b89f248b,
sent_events_count: 1,
received_events_count: 0,
},
)
},
),
proof: AccountStateProof {
ledger_info_to_transaction_info_proof: AccumulatorProof {
siblings: [
HashValue(62570ae9a994bcb20c03c055667a4966fa50d0f17867dd5819465072fd2c58ba),
HashValue(cce2cf325714511e7d04fa5b48babacd5af943198e6c1ac3bdd39c53c87cb84c),
],
},
transaction_info: TransactionInfo {
signed_transaction_hash: HashValue(69bed01473e0a64140d96e46f594bc4b463e88e244b694e962b7e19fde17f30d),
state_root_hash: HashValue(5809605d5eed94c73e57f615190c165b11c5e26873012285cc6b131e0817c430),
event_root_hash: HashValue(645df3dee8f53a0d018449392b8e9da814d258da7346cf64cd96824f914e68f9),
gas_used: 0,
},
transaction_info_to_account_proof: SparseMerkleProof {
leaf: Some(
(
HashValue(c0fbd63b0ae4abfe57c8f24f912f164ba0537741e948a65f00d3fae0f9373981),
HashValue(fc45057fd64606c7ca40256b48fbe486660930bfef1a9e941cafcae380c25871),
),
),
siblings: [
HashValue(4136803b3ba779bb2c1daae7360f3f839e6fef16ae742590a6698b350a5fc376),
HashValue(5350415253455f4d45524b4c455f504c414345484f4c4445525f484153480000),
HashValue(a9a6bda22dd6ee78ddd3a42da152b9bd39797b7da738e9d6023f407741810378),
],
},
},
},
)
查詢賬戶狀態的輸出信息示例
在下面示例中,我們可以看到單個帳戶的狀態。
query account_state 0
>> Getting latest account state
Latest account state is:
Account: 3ed8e5fafae4147b2a105a0be2f81972883441cfaaadf93fc0868e7a0253c4a8
State: Some(
AccountStateBlob {
Raw: 0x010000002100000001217da6c6b3e19f1825cfb2676daecce3bf3de03cf26647c78df00b371b25cc9744000000200000003ed8e5fafae4147b2a105a0be2f81972883441cfaaadf93fc0868e7a0253c4a800e1f50500000000000000000000000001000000000000000100000000000000
Decoded: Ok(
AccountResource {
balance: 100000000,
sequence_number: 1,
authentication_key: 0x3ed8e5fafae4147b2a105a0be2f81972883441cfaaadf93fc0868e7a0253c4a8,
sent_events_count: 1,
received_events_count: 0,
},
)
},
)
Blockchain Version: 3
運行本地驗證者節點
要在你的計算機上本地啟動驗證者節點并創建你自己的本地區塊鏈網絡(未連接到Libra testnet),請確保已按照Setup Libra Core中的說明運行編譯腳本,并切換到Libra Core存儲庫的根目錄后運行libra_swarm,如下所示:
$ cd ~/libra
$ cargo run -p libra_swarm -- -s
-p libra_swarm?- causes cargo to run the libra_swarm package, which starts a local blockchain consisting of one node.
-s?option starts a local client to connect to the local blockchain.
要查看所有的參數,可增加-h命令:
$ cargo run -p libra_swarm -- -h
The cargo run command may take some time to run. If the execution of this command completes without errors, an instance of the Libra CLI client and a Libra validator node is running on your system. Upon successful execution, you should see an output containing the CLI client menu and the?libra%?prompt.
交易的生命周期
當執行了第一筆交易,可以參考交易的生命周期:
- 從提交到執行的交易生命周期中的“under the hood”。
- 了解Libra驗證器的每個邏輯組件之間的交互。
總結
以上是生活随笔為你收集整理的Facebook:使用Libra完成第一笔交易的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Facebook Libra不会和主权货
- 下一篇: Facebook最新Libra币开发指南