咱們提供了一個命令行界面(CLI)客戶端來與區塊鏈進行交互。css
本文檔中的全部命令均假定:html
git
已安裝在您的系統上。yum
或者apt-get
安裝在Linux系統上。在這個例子中,咱們將下載必要的Libra組件並在兩個用戶之間執行一個事務:Alice和Bob。node
執行如下步驟將事務提交到Libra testnet上的驗證程序節點:git
git clone https://github.com/libra/libra.git
要設置Libra Core,請切換到libra
目錄並運行安裝腳本以安裝依賴項,以下所示:github
cd libra ./scripts/dev_setup.sh
安裝腳本執行如下操做:編程
若是設置失敗,請參閱故障排除bash
要鏈接到Libra testnet上運行的驗證器節點,請運行客戶端,以下所示。服務器
./scripts/cli/start_cli_testnet.sh
此命令使用貨物(Rust的包管理器)構建和運行客戶端,並將客戶端鏈接到testnet上的驗證器節點。微信
客戶端鏈接到testnet上的節點後,您將看到如下輸出。要隨時退出客戶端,請使用該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%
若是在構建客戶端和鏈接到testnet時遇到問題,請參閱故障排除。
注意:若是要在系統上本地運行驗證程序節點,請按照運行本地驗證程序節點中的說明進行操做。建立賬戶,鑄幣和執行交易的說明與testnet上的節點相同。
將客戶端鏈接到testnet後,能夠運行CLI命令來建立新賬戶。咱們將引導您爲兩個用戶建立賬戶(讓咱們稱他們爲Alice和Bob)。
一個天秤座%的命令行提示符代表您天秤座CLI客戶端運行。要查看該account
命令的幫助信息,請輸入「account」,以下所示:
libra% 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
請注意,使用CLI建立賬戶不會更新區塊鏈,只會建立本地密鑰對。
要建立Alice的賬戶,請輸入如下命令:
libra% account create
成功輸出示例:
>> Creating/retrieving next account from wallet Created/retrieved account #0 address 3ed8e5fafae4147b2a105a0be2f81972883441cfaaadf93fc0868e7a0253c4a8
#0是Alice賬戶的索引,十六進制字符串是Alice賬戶的地址。索引只是引用Alice賬戶的一種方式。賬戶索引是本地CLI索引,能夠在其餘CLI命令中使用,以便用戶方便地引用他們建立的賬戶。該指數對區塊鏈毫無心義。只有當經過鑄幣將任何一筆錢添加到Alice的帳戶時,纔會在區塊鏈上建立Alice的帳戶,或者經過來自另外一個用戶的轉帳將錢轉移到Alice的帳戶。請注意,您也能夠在CLI命令中使用十六進制地址。賬戶索引只是賬戶地址的便利包裝。
要建立Bob的賬戶,請重複賬戶建立命令:
libra% account create
成功輸出示例:
>> Creating/retrieving next account from wallet Created/retrieved account #1 address 8337aac709a41fe6be03cad8878a0d4209740b1608f8a81566c9a7d4b95a2ec7
#1是Bob賬戶的索引,十六進制字符串是Bob賬戶的地址。有關索引的更多詳細信息,請參閱建立Alice的賬戶。
要列出您建立的賬戶,請輸入如下命令:
libra% account list
成功輸出示例:
User account index: 0, address: 3ed8e5fafae4147b2a105a0be2f81972883441cfaaadf93fc0868e7a0253c4a8, sequence number: 0 User account index: 1, address: 8337aac709a41fe6be03cad8878a0d4209740b1608f8a81566c9a7d4b95a2ec7, sequence number: 0
賬戶的序列號表示從該賬戶發送的交易數。每次從該賬戶發送的事務被執行並存儲在區塊鏈中時,它會遞增。要了解更多信息,請參閱序列號。
在testnet上建立和添加硬幣是經過Faucet完成的。水龍頭是一種與testnet一塊兒運行的服務。此服務僅用於爲testnet建立硬幣,而且不存在主網。它創造了沒有現實世界價值的天秤座。假設您已經建立了Alice和Bob的賬戶,分別爲索引0和索引1,您能夠按照如下步驟將Libra添加到兩個賬戶。
要使Libra成爲薄荷並添加到Alice的賬戶,請輸入如下命令:
libra% account mint 0 110
一個成功的賬戶mint命令也將在區塊鏈上建立Alice的賬戶。
成功輸出示例:
>> Minting coins Mint request submitted
請注意,提交請求時,這意味着它已成功添加到mempool(testnet上的驗證程序節點)。它並不必定意味着它將成功完成。稍後,咱們將查詢賬戶餘額以確認鑄幣是否成功。
若是您的賬戶mint命令未成功提交您的請求,請參閱 故障排除
要使Libra成爲薄荷並添加到Bob的賬戶,請輸入如下命令:
libra% account mint 1 52
成功輸出示例:
>> Minting coins Mint request submitted
若是您的賬戶mint命令未成功提交您的請求,請參閱 故障排除
要檢查Alice賬戶中的餘額,請輸入如下命令:
libra% query balance 0
成功輸出示例:
Balance is: 110
要檢查Bob賬戶中的餘額,請輸入如下命令:
libra% query balance 1
成功輸出示例:
Balance is: 52
在咱們提交交易以將Libra從Alice的帳戶轉移到Bob的帳戶以前,咱們將查詢每一個帳戶的序列號。這將有助於咱們瞭解執行事務如何更改每一個賬戶的序列號。
libra% query sequence 0 >> Getting current sequence number Sequence number is: 0 libra% query sequence 1 >> Getting current sequence number Sequence number is: 0
在query sequence 0
,0是Alice的賬戶的索引。Alice和Bob的賬戶的序列號爲0表示到目前爲止還沒有執行Alice或Bob的賬戶中的任何交易。
要提交交易以將10個天秤座從Alice的賬戶轉移到Bob的賬戶,請輸入如下命令:
libra% transfer 0 1 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
(按賬戶和序列號進行交易)來檢索有關您剛剛提交的交易的信息。第一個參數是發件人賬戶的本地索引,第二個參數是賬戶的序列號。要查看此命令的示例輸出,請參閱示例輸出。
您剛剛將您的事務提交到testnet上的驗證器節點,它已包含在驗證器的mempool中。這並不必定意味着您的交易已被執行。理論上,若是系統運行緩慢或過載,則須要一些時間才能看到結果,您可能須要經過查詢賬戶屢次檢查。要查詢索引爲0的賬戶,可使用命令 query account_state 0.
「預期輸出」顯示在「 樣本輸出」部分中
阻止傳輸命令:您可使用transferb
命令(以下所示)而不是transfer
命令。transferb
只有在將事務提交到區塊鏈後,纔會提交事務並返回到客戶端提示。一個例子以下所示:
libra% transferb 0 1 10
有關從提交到執行和存儲的事務生命週期的理解,請參閱事務的生命週期。
libra% query sequence 0 >> Getting current sequence number Sequence number is: 1 libra% query sequence 1 >> Getting current sequence number Sequence number is: 0
Alice的賬號(索引0)的序號爲1表示到目前爲止已經從Alice的賬戶發送了一個交易。Bob的賬戶(索引1)的序列號爲0表示到目前爲止還沒有從Bob的賬戶發送任何交易。每次從賬戶發送交易時,序列號都會增長1。
要檢查兩個賬戶中的最終餘額,請像在此步驟中同樣,再次查詢每一個賬戶的餘額。若是您的交易(轉帳)成功執行,您應該在Alice的帳戶中看到100個Libra,在Bob的帳戶中看到62個Libra。
libra% query balance 0 Balance is: 100 libra% query balance 1 Balance is: 62
您已成功在Libra testnet上執行了您的交易,並將10個Libra從Alice的帳戶轉移到了Bob的帳戶!
rustup update
從您的libra目錄運行。protoc
至3.6.0或更高版本。./scripts/dev_setup.sh
若是您遇到構建失敗,請嘗試從libra目錄中刪除貨物鎖定文件:
rm Cargo.lock
若是您的客戶端沒有鏈接到testnet:
./scripts/cli/start_cli_testnet.sh
若是您在testnet上鍊接的驗證程序節點不可用,您將收到「服務器不可用」消息,以下所示:
libra% 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
若是您在提交交易後未更新餘額,請稍等片刻再次查詢餘額。若是區塊鏈正在經歷很是大量的交易,則可能會有延遲。若是您的餘額仍未更新,請再次嘗試鑄造。
要檢查賬戶是否存在,請查詢賬戶狀態。對於索引爲0的賬戶,請輸入如下內容:
libra% query account_state 0
若是testnet驗證器節點(您的客戶端已鏈接到)不可用或您與testnet的鏈接已超時,您將看到此錯誤:
libra% 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
要解決傳輸錯誤:
query account_state 0
quit
或退出客戶端q!
,而後從新運行如下命令以鏈接到testnet:
./scripts/cli/start_cli_testnet.sh
從libra目錄此示例將使用賬戶和序列號查詢單個事務的詳細信息。
libra% 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 } }
請注意,交易金額以微數字顯示。
在如下示例中,咱們將從參考索引0處的賬戶查詢「已發送」事件。您將注意到,由於咱們今後賬戶發送了一個事務,因此只有一個事件。還返回當前狀態的證實,以即可以執行不會丟失任何事件的驗證 - 這在查詢未返回「限制」事件時完成。
libra% 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), ], }, }, }, )
在此示例中,咱們將查詢單個賬戶的狀態。
libra% 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
- 使貨物運行libra_swarm包,該包啓動由一個節點組成的本地區塊鏈。
-s
option啓動本地客戶端以鏈接到本地區塊鏈。
要查看啓動節點和鏈接Libra Blockchain的其餘選項,請運行:
$ cargo run -p libra_swarm -- -h
貨運命令可能須要一些時間才能運行。若是此命令的執行完成且沒有錯誤,則系統上正在運行Libra CLI客戶端實例和Libra驗證器節點。成功執行後,您應該看到包含CLI客戶端菜單和libra%
提示的輸出。
一旦你執行你的第一個交易,你能夠參考文檔事務的壽命爲:
Libra國內開發者微信交流羣:
不能入羣請加管理微信,拉你進羣=>