Facebook幣Libra學習-3.小試牛刀第一筆交易

咱們提供了一個命令行界面(CLI)客戶端來與區塊鏈進行交互。css

假設

本文檔中的全部命令均假定:html

  • 您運行的是Linux(基於Red Hat或Debian)或macOS系統。
  • 您能夠穩定地鏈接到互聯網。
  • git 已安裝在您的系統上。
  • Homebrew安裝在macOS系統上。
  • yum或者apt-get安裝在Linux系統上。

提交交易的步驟

在這個例子中,咱們將下載必要的Libra組件並在兩個用戶之間執行一個事務:Alice和Bob。node

執行如下步驟將事務提交到Libra testnet上的驗證程序節點:git

  1. 克隆並構建Libra Core
  2. 構建Libra CLI客戶端並鏈接到testnet
  3. 建立Alice和Bob的賬戶
  4. 薄荷硬幣並添加到Alice和Bob的賬戶
  5. 提交交易

克隆和構建天秤座核心

克隆Libra核心存儲庫

git clone https://github.com/libra/libra.git 

設置天秤座核心

要設置Libra Core,請切換到libra目錄並運行安裝腳本以安裝依賴項,以下所示:github

cd libra
./scripts/dev_setup.sh

安裝腳本執行如下操做:編程

  • 安裝rustup - rustup是Rust編程語言的安裝程序,實現了Libra Core。
  • 安裝所需版本的rust-toolchain。
  • 安裝CMake - 管理構建過程。
  • 安裝protoc - 協議緩衝區的編譯器。
  • 安裝Go - 用於構建協議緩衝區。

若是設置失敗,請參閱故障排除bash

構建Libra CLI客戶端並鏈接到Testnet

要鏈接到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上的節點相同。

建立Alice和Bob的賬戶

將客戶端鏈接到testnet後,能夠運行CLI命令來建立新賬戶。咱們將引導您爲兩個用戶建立賬戶(讓咱們稱他們爲Alice和Bob)。

步驟1:檢查CLI客戶端是否在您的系統上運行

一個天秤座%的命令行提示符代表您天秤座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

第2步:建立Alice的賬戶

請注意,使用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命令中使用十六進制地址。賬戶索引只是賬戶地址的便利包裝。

第3步:建立Bob的賬戶

要建立Bob的賬戶,請重複賬戶建立命令:

libra% account create

成功輸出示例:

>> Creating/retrieving next account from wallet
Created/retrieved account #1 address 8337aac709a41fe6be03cad8878a0d4209740b1608f8a81566c9a7d4b95a2ec7

#1是Bob賬戶的索引,十六進制字符串是Bob賬戶的地址。有關索引的更多詳細信息,請參閱建立Alice的賬戶。

步驟4(可選):列出賬戶

要列出您建立的賬戶,請輸入如下命令:

libra% account list

成功輸出示例:

User account index: 0, address: 3ed8e5fafae4147b2a105a0be2f81972883441cfaaadf93fc0868e7a0253c4a8, sequence number: 0
User account index: 1, address: 8337aac709a41fe6be03cad8878a0d4209740b1608f8a81566c9a7d4b95a2ec7, sequence number: 0

賬戶的序列號表示從該賬戶發送的交易數。每次從該賬戶發送的事務被執行並存儲在區塊鏈中時,它會遞增。要了解更多信息,請參閱序列號

將Libra Coins添加到Alice和Bob的帳戶

在testnet上建立和添加硬幣是經過Faucet完成的。水龍頭是一種與testnet一塊兒運行的服務。此服務僅用於爲testnet建立硬幣,而且不存在主網它創造了沒有現實世界價值的天秤座。假設您已經建立了Alice和Bob的賬戶,分別爲索引0和索引1,您能夠按照如下步驟將Libra添加到兩個賬戶。

第1步:將110 Libra添加到Alice的賬戶

要使Libra成爲薄荷並添加到Alice的賬戶,請輸入如下命令:

libra% account mint 0 110

  • 0是Alice的賬戶的索引。
  • 110是要添加到Alice賬戶的Libra數量。

一個成功的賬戶mint命令也將在區塊鏈上建立Alice的賬戶。

成功輸出示例:

>> Minting coins
Mint request submitted

請注意,提交請求時,這意味着它已成功添加到mempool(testnet上的驗證程序節點)。它並不必定意味着它將成功完成。稍後,咱們將查詢賬戶餘額以確認鑄幣是否成功。

若是您的賬戶mint命令未成功提交您的請求,請參閱 故障排除

第2步:將52 Libra添加到Bob的賬戶

要使Libra成爲薄荷並添加到Bob的賬戶,請輸入如下命令:

libra% account mint 1 52

  • 1是Bob的賬戶索引。
  • 52是要添加到Bob賬戶的Libra數量。
  • 一個成功的賬戶mint命令也將在區塊鏈上建立Bob的賬戶。在區塊鏈上建立Bob賬戶的另外一種方法是將錢從Alice的賬戶轉移到Bob的賬戶。

成功輸出示例:

>> Minting coins
Mint request submitted

若是您的賬戶mint命令未成功提交您的請求,請參閱 故障排除

第3步:檢查餘額

要檢查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

  • 0是Alice的賬戶的索引。
  • 1是Bob的賬戶索引。
  • 10是從Alice的帳戶轉移到Bob的帳戶的Libra的數量。

成功輸出示例:

>> 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的帳戶!

故障排除

創建

  • 更新Rust:
    • rustup update從您的libra目錄運行
  • 更新protoc:
    • 更新protoc至3.6.0或更高版本。
  • 從libra目錄從新運行安裝腳本:
    • ./scripts/dev_setup.sh

客戶端構建和運行

若是您遇到構建失敗,請嘗試從libra目錄中刪除貨物鎖定文件:

  • rm Cargo.lock

若是您的客戶端沒有鏈接到testnet:

  • 檢查您的互聯網鏈接。
  • 確保您使用的是最新版本的客戶端。拉出最新的Libra Core並從新運行客戶端:
    • ./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

要解決傳輸錯誤:

  • 檢查與testnet的鏈接。
  • 查詢發件人賬戶以確保其存在。對索引爲0的賬戶使用如下命令:
    • 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生態系統中提交和執行事務時,瞭解Libra驗證器的每一個邏輯組件之間的交互。

參考

Libra國內開發者微信交流羣:

不能入羣請加管理微信,拉你進羣=>

相關文章
相關標籤/搜索