我们提供了一个命令行界面(CLI)客户端来与区块链进行交互。

假设

本文档中的所有命令均假定:

  • 您运行的是Linux(基于Red Hat或Debian)或macOS系统。
  • 您可以稳定地连接到互联网。
  • git 已安装在您的系统上。
  • Homebrew安装在macOS系统上。
  • yum或者apt-get安装在Linux系统上。

提交交易的步骤

在这个例子中,我们将下载必要的Libra组件并在两个用户之间执行一个事务:Alice和Bob。

执行以下步骤将事务提交到Libra testnet上的验证程序节点:

  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目录并运行安装脚本以安装依赖项,如下所示:

cd libra
./scripts/dev_setup.sh
复制

安装脚本执行以下操作:

  • 安装rustup - rustup是Rust编程语言的安装程序,实现了Libra Core。
  • 安装所需版本的rust-toolchain。
  • 安装CMake - 管理构建过程。
  • 安装protoc - 协议缓冲区的编译器。
  • 安装Go - 用于构建协议缓冲区。

如果设置失败,请参阅故障排除

构建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国内开发者微信交流群:

不能入群请加管理微信,拉你进群=>

Facebook币Libra学习-3.小试牛刀第一笔交易的更多相关文章

  1. Facebook币Libra学习-6.发行属于自己的代币Token案例(含源码)

    在这个简短的概述中,我们描述了我们在eToro标记化资产背后实施技术的初步经验,即MoveIR语言中的(eToken),用于在Libra网络上进行部署. Libra协议是一个确定性状态机,它将数据存储 ...

  2. Facebook币Libra学习-2.交易生命周期

    交易生命周期 为了更加深入的理解Libra的交易生命周期,我们将跟随一个交易的全过程,从其被提交到Libra validator始,直至其被添加到区块链上止.我们将“放大”来看每个validator逻 ...

  3. Facebook币Libra学习-1.核心概念

    Libra区块链是一个基于Libra协议的加密认证的分布式数据库.本文将简略介绍Libra协议的核心概念.其详细说明请参阅Libra技术白皮书. Libra区块链由分布式的Validator节点网络维 ...

  4. Facebook币Libra学习-5.Move组织目录

    Move是一种新的编程语言,旨在为Libra Blockchain提供安全可编程的基础. 组织 Move语言目录由五部分组成: 的虚拟机(VM),其中包含的字节码格式,字节码解释器,和基础设施执行事务 ...

  5. Facebook币Libra学习-4.新的智能合约语言Move入门

    Move是一种新的编程语言,旨在为Libra Blockchain提供安全可编程的基础.Libra Blockchain中的帐户是任意数量的Move资源和Move模块的容器.提交给Libra Bloc ...

  6. 20145225唐振远 《Java程序设计》第1周学习总结——小试牛刀

    20145225唐振远<Java程序设计>第1周学习总结——小试牛刀 教材学习内容总结 1.java语言概述:一门高级编程语言. 2.java语言的三种技术构架:java SE.java ...

  7. Facebook的Libra “区块链”到底是如何运作的?

    本文深入研究了"关于Facebook Libra coin (以及更多)平台协议"的26页技术文档,并对其内容进行了分解说明.同时,我们对这53位作者表示衷心的钦佩! 以下为具体分 ...

  8. 【转】Linux 中断学习之小试牛刀篇

    原文网址:http://www.linuxidc.com/Linux/2011-02/32129.htm 前言 在前面分析了中断的基本原理后,就可以写一个内核中断程序来体验以下,也可以借此程序继续深入 ...

  9. Facebook 发布深度学习工具包 PyTorch Hub,让论文复现变得更容易

    近日,PyTorch 社区发布了一个深度学习工具包 PyTorchHub, 帮助机器学习工作者更快实现重要论文的复现工作.PyTorchHub 由一个预训练模型仓库组成,专门用于提高研究工作的复现性以 ...

随机推荐

  1. HashMap、HashTable差异详解

    HashMap和HashTable有什么不同?在面试和被面试的过程中,我问过也被问过这个问题,也见过了不少回答,今天决定写一写自己心目中的理想答案. 代码版本 JDK每一版本都在改进.本文讨论的Has ...

  2. 【大数据】SmallFile-Analysis-Script

    1.root账号先在namenode节点上配置一个定时任务,将fsimage定时传到其他客户机上进行操作 whereis hadoop命令确定安装目录,然后去配置文件找到namenode节点(data ...

  3. selenium重定向新窗口

    1.跳转新窗口 # 浏览器跳转新窗口后,selenium绑定新窗口 print('页面跳转后重新绑定selenium.') time.sleep(3) search_window = driver.c ...

  4. 19C imp 导入合并表空间

    因为项目需要从9i 导数据到18C,所以发现如下特性 1.18C imp 导入数据,如果表空间在目标库没有,会将表导入到用户默认表空间 2.18C imp 导入数据,如果表空间在目标库有,但缺少权限. ...

  5. Const *ptr ptr

    1. const int *ptr = NULL; <=> int const *ptr = NULL; 1) 表示指向符号常量的指针变量,指针变量本身并非const所以可以指向其他变量. ...

  6. jade过滤器

    以上语法基本讲完了jade的语法,然后在jade里面并不仅仅局限于使用jade语法,同样可以使用其他的插件语言,这种机制在jade里面称为filter,在jade里面加入过滤器用冒号 markdown ...

  7. Splay树详解

    更好的阅读体验 Splay树 这是一篇宏伟的巨篇 首先介绍BST,也就是所有平衡树的开始,他的China名字是二叉查找树. BST性质简介 给定一棵二叉树,每一个节点有一个权值,命名为 ** 关键码 ...

  8. MySQL进阶5--分组函数 / 分组排序和分组查询 group by(having) /order by

    MySQL进阶--分组排序和分组查询 group by(having) /order by /* 介绍分组函数 功能:用做统计使用,又称为聚合函数或组函数 1.分类: sum, avg 求和 /平均数 ...

  9. Java常用数学类和BigDecimal

    笔记: Math类 * java.lang.Math提供了一系列静态方法用于科学计算:其方法的参数和返回值类型一般为double型. * abs 绝对值 * acos,asin,atan,cos,si ...

  10. Nginx服务器的Websockets配置方法

    这篇文章主要介绍了简介Nginx服务器的Websockets配置方法,是使用Nginx服务器的网管的必备知识XD~需要的朋友可以参考下 Nginx 1.3.13 已经发布了,该版本支持 Connect ...