【翻译】Rust 重要开发者 Brian 的搭建并运行 CKB 的初体验 (Experience report - first time building and running CKB)

写在正文之前:
本文是前 Rust core team 重要成员 Brian ,他的丰功伟业我就不再这里赘述,大家可以去google 或者看他随时都是绿油油的 Github。在这篇文章中,他试着创建和运行 ckb 的测试网和 dev chain 的时候很详细的操作过程和心路历程,当然还包括了很多有实质帮助的建(tu)议(cao),如果是之前没有接触过 CKB,又想要在 NervosCKB 上开发玩耍的盆友,他的思路值得参照,在这篇文章里面页可以看的他踩过那些坑,省去一些时间。
同时他的这篇文章也是很棒的初入 CKB 的开发者体验报告,可以给 CKB 开发团队去看文档、testnet、ckb-cli 等有哪些使用的路径上还不是很友善,值得再提升让用户体验更好,好让更多开发者能够更「无痛」 的加入 CKB 生态,如果看原文可以发现confuse、stuck 等等单词是很常见的 ,文末我也再整理了一些他遇到的坑或者建议,欢迎参考。

以下是内文,原文请参考这里

Hi
最近我花了一些时间学习如何建造以及运行 CKB。在这个过程中,我写下了我的所有步骤和想法,并且写成文章贴在这里。

在创建这个项目的过程中,我建立了ckbckb-cli 以及可以挖矿的 devnet, 并把它连接到测试网,以及用 ckb-cli 创建账户以及在测试网上面转账。

我发现,当我处理一个新项目时,这种记下我所看到的一切的方法可以帮助我更好地理解这个项目,而且几乎总是会出现许多简单的问题,这些问题可以通过修改来改进其他人的经验。

我希望记录这些经验能够向开发团队说明哪些地方可以改进,同时也能够帮助其他人开始在CKB上进行开发。感谢Aimee在提供资源和测试方面的帮助。

写于2020年3月12日至4月5日之间。

初次尝试运行 CKB

我想要写一个可以远行在 CKB 上的软件,但首先我必须先学习如何建立以及运行 CKB 以及使用他的工具。虽然我没有任何的情况了开发经验,但根据我过去的阅读,我还是能了解一点点的 CKB。我之前还在 CKB—VM 创建了一个项目
我开始下载那些在 Github 上的主要仓库,并且循着这个链接到了这个网站。我在里面找了一下有没有可以教我如何在 CKB 上建立以及运行私人测试网的文档。因为一旦我运行了一个测试节点,我将需要关于如何编写、部署和测试脚本的文档。

搭建 CKB

我只需要点击一下就可以进到 Nervos 的开发文档

但从文档标题点进去后,我并没有看到任何和“构建 CKB ”相关的内容。我对此感到很惊讶,但我想这可能是因为这个文档最初是面向在 CKB 上构建的开发者,并假定他们不需要创建他们自己的 CKB 私网。

但就我个人而言,我会想构建并理解我的整个开发堆栈,尤其是像在 CKB 这样还在开发中的平台。

我浏览了一下 Github 上的 README,但并没有看到任何关于如何构建 CKB 的文档。

虽然有两个名为“Get CKB”和“Quick Start”的链接。“Get CKB”的文档还包含了“从源代码构建”的部分。

这些文档说了要用 make prod 来构建 CKB 。因为 CKB 是个 Rust 项目,所以我不想这样做,相反的我想试试看用 cargo build,所以我这么做,而且还成功了。

我总是对于其他的项目添加了什么到他的 Makefiles 来增强 cargo 感到好奇,在这个例子中他只加了 cfg disable_faketime。我不知道这是什么,但我猜 faketime 应该是在开发的过程中可以有的字段。也注记了这是一个通常不鼓励这么做的否定 cargo 特性。

探索开发者文档

我似乎马上就远离了探索文档的“快乐路径”,因为我已经忽略了文档网站,并且深入研究了 Github Repo 的 markdown,所以我退回来了一步开始重新深入调查了文档网站。

为了确保我没有漏掉什么主文档中我正在寻找的东西。我打开了 “开始/介绍”的页面。这是关于运行节点以及使用钱包和交易。没有开发者文档

我发誓我是通过点击“开发者文档”链接来到这里的。我又检查了一遍
-我在nervos.org上点击了“开发者”,然后是“文档”。这个链接最终连到 docs.nervos.org,并将自己描述为

This is the documentation site for Nervos CKB. Here you can learn about the design of Nervos CKB, as well as how to run a node and mine CKByte tokens.
这是 NeevosCKB 的文档网站,在这里你可以学到 NervosCKB 的设计,以及如何运行节点和挖出 CKBytes 代币。

我很困惑谁是这个文档的读者。

在这个网站上还有另外一个叫做“开发者指引(Development Guide)”的文档,因此我打开了他(Development Guide / Introduction)

这个页面没有任何关于如何构建 CKB 的提示。我还注意到他强调使用名为“Aggron” 的测试网,这使我认为我自己运行自己的测试网可能不是不受欢迎的。

阅读测试网文档

基于文档,我的新计划是学习使用 testnet。虽然我打算使用我自己创建的 CKB,不管文档是否要求我下载一个版本。
Testnet Aggron”页面的第一段真把我搞糊涂了:

We are going to deploy a PoA (Proof of Authority) algorithm to create blocks
in the testnet. However, it will take some time to develop. Before that we
will reset the testnet regularily whenver there’s no new blocks in an hour.
The chain spec used to start Aggron has been published here. Please refer to
the Chains document for Aggron Testnet’s info.
我们即将部署一个 POA 算法以在测试网中产生区块。然而,这将会耗费一些时间去开发。在这之前只要每当超过一小时没有出块,我们就会常规性的去重置测试网。用来启动 Aggron 的链上规范已经在此发布,请在参阅此 Aggron 链的文件中的信息。

在这个教程文档中,我在想这个“我们”应该是指 Nervos 这个项目,而不是指“您”。而且这个似乎是很久以前,也就是测试网刚被部署的时候就写了。(注:该页面写于2019年12月9号)。

这个页面告诉我们下载的 CKB 新版本。然后我到 CKB release 的页面去查看,并且发现最新的版本是 v0.29.0
我查看了 v0.29.0 的 tag,并且在调试模式下重建了 CKB。
这时我发现 ckb-cli 并非 ckb repo 的一部分,我很轻易的就能找到ckb-cli 但却遇到一个绊脚石。

创建 ckb—cli

ckb-cli 中并没有 v0.29.0 的tag。我并不知道 ckb-cli 的那个版本和 ckb 是匹配的。这个差异使我怀疑从 ckb repo 中释放的 tarballs 是否包含 ckb-cli。

我下载了 0.29 tarball而且发现他确实包含 ckb-cli。我想去确认他的 ckb-cli 是哪一个版本,而我除了运行最新版之外似乎别无选择。于是我这么做了,然后看到他回报的是:
ckb-cli 0.27.1 (9d0bf90 2020-01-31)
所以 ckb 0.29.0 是适配 ckb-cli 0.27.1我猜这两个版本是松散耦合的,我应该总是使用其中一个的最新版本。

我确认了 ckb-cli 的最新版本号并且建立他。这似乎还涉及建立另一个副本的 ckb 。有点恼人,不过就这样吧。

在新的视窗中,我建立了 PATH 让我有权限进入 ckbckb-cli

~/ckb-testing$ export PATH="$PATH:$HOME/ckb/target/debug/:$HOME/ckb-cli/target/debug"
~/ckb-testing$ ckb --version
ckb 0.29.0 (a6733e6 2020-02-26)
~/ckb-testing$ ckb-cli --version
ckb-cli 0.27.1 (9d0bf90 2020-01-31)

我注意到在 testnet 页面上,ckbckb-cli 的示例版本是从2019年11月开始的,并且这两个版本号是相同的:

ckb 0.25.2 (dda4ed9 2019-11-17)
ckb-cli 0.25.2 (6ca7bbb 2019-11-17)

使用测试网

现在我想要连接测试网并且验证我有工作的工具

以下是最初的说明:

* Create aggron.toml in the directory containing the CKB binary.  
创建 aggron.toml 在包含 CKB 二进制文件的目录中。
* Init CKB node with ckb init --import-spec ./aggron.toml --chain testnet
用 Create aggron.toml in the directory containing the CKB binary.的指令来初始化 CKB 节点

aggron.toml 的链接是指向一个12月的 gist。我希望他还是有效的。

我创建了一个新的目录 ckb-testing 用来装载我们测试网的数据,并将aggron,toml 的事例包含在其中。

我运行 ckb init
~/ckb-testing$ ckb init --import-spec ./aggron.tml --chain testnet
产出了

~/ckb-testing$ ckb init --import-spec ./aggron.toml --chain testnet
WARN: mining feature is disabled because of lacking the block assembler config options
Initialized CKB directory in /home/brian/ckb-testing/devnet
cp ./aggron.toml specs/testnet.toml
create ckb.toml
create ckb-miner.toml

这看起来像是成功了一样,复制了 aggron.tomlspecs/testnet.toml中,并且创建 ckb.tomlckb-miner.toml
我在两个新的toml文件旁边摸索了一下。

ckb.toml 包含了下面几行:

[chain]
# Choose the kind of chains to run, possible values:
# - { file = "specs/dev.toml" }
# - { bundled = "specs/testnet.toml" }
# - { bundled = "specs/mainnet.toml" }
spec = { file = "specs/testnet.toml" }

它表明有一个内置的 testnet 定义,这让我怀疑它是否与我们自己的testnet 定义一致。看看能不能找到内建的定义。

我用fd 在 ckb repo 中搜索配置 :

~/ckb$ fd "testnet.toml"
resource/specs/testnet.toml

果然没错
这个内置的定义和开发者文档推荐的 aggron.toml 是一样的吗?

~/ckb$ diff ../ckb-testing/aggron.toml resource/specs/testnet.toml
10c10
< # run `cargo run cli hashes -b` to get the genesis hash
---
> # run `cargo run list-hashes -b` to get the genesis hash

是的,除了有一条过时的评论之外。

继续跟着测试网的文档看下去吧老铁们。。。

包含 aggron.toml 的 gist 中有另外一个说明

Confirm that the genesis hash is
0x184ac4658ed0c04a126551257990db132366cac22ab6270bbbc1f8c3220f302d in the log output.

但他却没有说如何验证。创世哈希并不是由 ckb init 输出的。

在测试网文档中的下一步是 ckb run。我执行了

Windows 的防火墙和我要求许可,我给他了(我此刻正在运行在 WSL 上)。我看到一大串的 log 输出,ckb 已经开始跑了

2020-03-20 15:10:22.445 -06:00 main INFO sentry  **Notice**: The ckb process will send stack trace to sentry on Rust panics. This is enabled by default before mainnet, which can be opted out by setting the option `dsn` to empty in the config file. The DSN is now https://[email protected]/1422795
2020-03-20 15:10:23.354 -06:00 main INFO main  Miner is disabled, edit ckb.toml to enable it
2020-03-20 15:10:23.374 -06:00 main INFO ckb-db  Initialize a new database
2020-03-20 15:10:23.624 -06:00 main INFO ckb-db  Init database version 20191127135521
2020-03-20 15:10:23.636 -06:00 main INFO ckb-chain  Start: loading live cells ...
2020-03-20 15:10:23.636 -06:00 main INFO ckb-chain  Done: total 2 transactions.
2020-03-20 15:10:23.653 -06:00 main INFO main  ckb version: 0.29.0 (a6733e6 2020-02-26)
2020-03-20 15:10:23.654 -06:00 main INFO main  chain genesis hash: 0x184ac4658ed0c04a126551257990db132366cac22ab6270bbbc1f8c3220f302d
2020-03-20 15:10:23.654 -06:00 main INFO ckb-network  Generate random key
2020-03-20 15:10:23.655 -06:00 main INFO ckb-network  write random secret key to "/home/brian/ckb-testing/data/network/secret_key"
2020-03-20 15:10:23.668 -06:00 main INFO ckb-network  Listen on address: /ip4/0.0.0.0/tcp/8115/p2p/Qme9oaLbtaqF6JyZnZhrNPoW3dSPkzJSW1PGag3fKdEuaj
2020-03-20 15:10:23.718 -06:00 NetworkRuntime-1 INFO ckb-network  p2p service event: ListenStarted { address: "/ip4/0.0.0.0/tcp/8115" }
2020-03-20 15:10:24.415 -06:00 NetworkRuntime-1 INFO ckb-relay  RelayProtocol(1).connected peer=SessionId(1)
2020-03-20 15:10:24.415 -06:00 NetworkRuntime-0 INFO ckb-sync  SyncProtocol.connected peer=SessionId(1)
2020-03-20 15:10:24.474 -06:00 NetworkRuntime-2 INFO ckb-sync  Ignoring getheaders from peer=SessionId(1) because node is in initial block download
2020-03-20 15:10:25.319 -06:00 NetworkRuntime-5 INFO ckb-relay  RelayProtocol(1).connected peer=SessionId(2)
2020-03-20 15:10:25.433 -06:00 NetworkRuntime-4 INFO ckb-relay  RelayProtocol(1).connected peer=SessionId(3)
2020-03-20 15:10:25.712 -06:00 NetworkRuntime-3 INFO ckb-relay  RelayProtocol(1).connected peer=SessionId(4)
2020-03-20 15:10:26.346 -06:00 NetworkRuntime-1 INFO ckb-sync  SyncProtocol.connected peer=SessionId(2)
2020-03-20 15:10:26.346 -06:00 NetworkRuntime-1 INFO ckb-sync  Ignoring getheaders from peer=SessionId(2) because node is in initial block download
2020-03-20 15:10:26.347 -06:00 NetworkRuntime-1 INFO ckb-sync  SyncProtocol.connected peer=SessionId(3)
2020-03-20 15:10:26.347 -06:00 NetworkRuntime-1 INFO ckb-sync  Ignoring getheaders from peer=SessionId(3) because node is in initial block download
2020-03-20 15:10:26.347 -06:00 NetworkRuntime-1 INFO ckb-sync  SyncProtocol.connected peer=SessionId(4)
2020-03-20 15:10:26.348 -06:00 NetworkRuntime-1 INFO ckb-sync  Ignoring getheaders from peer=SessionId(4) because node is in initial block download
2020-03-20 15:10:28.039 -06:00 ChainService INFO ckb-chain  block: 1, hash: 0xcfbc1525e97bdb6e3202ff19270bddc1fcd6d8f1aee14c719064a8b989909f5d, epoch: 0(1/1000), total_diff: 0x1800060, txs: 1

这个日志说明测试网有正确的创世哈希,而且我们正在同步区块。
我目前正在 2704 这个区块高度。我想知道测试网上有多少个块,这样我就知道我要等待多久。

这是测试网专用的区块浏览器吗? 我 google 了“ nervos block explorer ”然后找到
https://explorer.nervos.org
在其中还有测试网的浏览器:
https://explorer.nervos.org/aggron/
测试网上有 567493 个区块。我并不会特别兴奋的等它下载完。
我的数据目录大约大小是 7MB,所以我预期我需要大约(600_000/3000 * 7)= ~1.4GB的空间来进行测试网的开发,还是扛得住的。

不过我真的不想等着同步。我们继续下个部分吧
下一个文档是,“dev chain”,希望它能告诉我们如何使用我们自己的链。

设置开发链 (dev chain)

我暂时停止了正在同步测试网的 ckb,将它的所有数据移动到ckb-testing/testnet,然后继续用 ckb 运行来同步测试网。

紧接着我创建了 ckb-testing/devnet 。根据 dev chain 文档我执行了
ckb init --chain dev
然后他输出了:

~/ckb-testing/devnet$ ckb init --chain dev
WARN: mining feature is disabled because of lacking the block assembler config options
Initialized CKB directory in /home/brian/ckb-testing/devnet
create specs/dev.toml
create ckb.toml
create ckb-miner.toml

dev chain 文档想要我来定制 specs/dev.toml,设置genesis_epoch_length到 1000。我看了一下我的 dev.toml还有genesis_epoch_length已经到 1000 了。

他想让我定制ckb-miner.toml 来设置空闲时间间隔(常被称为 just value)到 500。我瞄了一眼 ckb-miner.toml 和 value 已经都到 500 了。

这份文档似乎已经过时了。

译注:应该是设定的值是5000(截图为 2020/03/10 版)

在 dev chain 上挖矿

正如 ckb init 上所说,一个初始化的链尚未为挖矿进行配置。
dev chain 文档的步骤 4 标题称为:“在 ckb.toml 中配置挖矿用的区块汇编程序(block-assembler)”

他说:

use ckb-cli to generate lock_arg. lock_arg is needed for configuring the
mining feature so please backup it.
我们使用 ckb-cli 生成 lock_arg 。需要lock_arg来配置挖矿功能,所以请备份它。

我真希望他能解释到底 lock_arg 是什么,或者链接给我更多资讯。
紧接着我运行 ckb-cli account new

它要求我输入密码。我输入“foo”,然后回车。它让我重复一遍
密码。我输入“foo”,然后回车。但 CLI 端有很长一段时间没有给我任何反馈。我真想知道它是不是坏了。

Aimee 想知道为什么我们需要一个账户。我猜他是连接到我们矿工的公钥,并且该账号会提供权限让矿工存放挖到的 CKB。

这部分文档是有缺陷的。

最后,账户的创建命令已经完成并且输出:

~/ckb-testing/devnet$ time ckb-cli account new
Your new account is locked with a password. Please give a password. Do not forget this password.
Password: Repeat password: address:
  mainnet: ckb1qyq9u782efpvk8m3q88gplxlzadpct5d7ypqythss9
  testnet: ckt1qyq9u782efpvk8m3q88gplxlzadpct5d7ypqewf0ue
lock_arg: 0x5e78eaca42cb1f7101ce80fcdf175a1c2e8df102
lock_hash: 0xe68befeae28e69dc658565be71bc7146fd33a9a4bea3f7edba8de8c8c46865ff

呃,看了一下输出。还需要一些工作。你只能看到标签(地址、主网也是在我的终端机中看不到的深蓝色)。
注:原文:You can’t see but the “labels” (“address”,
“mainnet”, are also a dark shade of blue that is unreadable on my terminal).

我花了 168 秒来运行二进制文件的调试以及在背景同步测试网。

为了实验,我停止了对测试网的同步,在调试版本中再次运行 ckb-cli account new ;然后在 release 模式下重建ckb和ckb-cli。

  • debug :99秒
  • release :15秒
    所以 debug 模式建立是慢了 6.6 倍。我继续将测试网与版 release build 的情况同步。

我想知道lock_arglock_hash是什么。我在网上搜索。除了“需要配置您的挖矿软件以及导出您的私钥”之外,我找不到任何有用的东西。

我将会继续谈论这个。

测试网重置了!

我休息了几天,在这几天里测试网重置了。
我会发现这个是因为我的 ckb 测试网开始看起来像这样:

2020-03-24 21:50:22.644 -06:00 NetworkRuntime-3 INFO ckb-network  Ban peer PeerId(QmT6DFfm18wtbJz3y4aPNn3ac86N4d4p4xtfQRRPf73frC) for 300 seconds, reason: The nodes are not on the same network

仅仅删除测试网数据、重新初始化和重新同步是没用的。我看到包含 Aggron testnet 信息的 gist 现在显示测试网已经有一个不同的创世区块。

我假定我需要一个新的测试网配置,并且假定 Nervos 已经发布了包含更新的测试网定义的新版本。我获取 ckbckb-cli ,看到最新的 tag 分别是 v0.30.1v0.30.0 。我检查了一下并在发布模式下构建他们。

继续 dev chain 的设置

下一个在 Dev Chain 文档的指示是:

开启 ckb.toml 并配置 [block_assembler] 的部分.

  • lock_arg 必须要有 0x 作为前缀,并在后面加上 args 中的文字。
  • massage 中填入 0x

很神秘地
ckb.toml有一堆细节附加在关于 [block_assembler] 注释的部分:
(译注:大概有两千字)

# Set the lock script to protect mined CKB.
#
# CKB uses CS architecture for miner. Miner process (ckb miner) gets block
# template from the Node process (ckb run) via RPC. Thus the lock script is
# configured in ckb.toml instead of ckb-miner.toml, and the config takes effect
# after restarting Node process.
#
# The `code_hash` identifies different cryptography algorithm. Read the manual
# of the lock script provider about how to generate this config.
#
# CKB provides an secp256k1 implementation, it requires a hash on the
# compressed public key. The hash algorithm is blake2b, with personal
# "ckb-default-hash". The first 160 bits (20 bytes) are used as the only arg.
#
# You can use any tool you trust to generate a Bitcoin private key and public
# key pair, which can be used in CKB as well. CKB CLI provides the function for
# you to convert the public key into block assembler configuration parameters.
#
# Here is an example using ckb-cli to generate an account, this command will
# print the block assembler args(lock_arg) to screen:
#
#     ckb-cli account new
#
# If you already have a raw secp256k1 private key, you can get the lock_arg by:
#
#     ckb-cli util key-info --privkey-path <privkey-path>
#
# The command `ckb init` also accepts options to generate the block assembler
# directly. See `ckb init --help` for details.
#
#     ckb init <lock_arg>
#
# secp256k1_blake160_sighash_all example:
# [block_assembler]
# code_hash = "0x9bd7e06f3ecf4be0f2fcd2188b23f1b9fcc88e5d4b65a8637b17723bbda3cce8"
# args = "ckb cli blake160 <compressed-pubkey>"
# hash_type = "type"
# message = "A 0x-prefixed hex string"

喔,这里还是有好多没解释清楚地:

  • “矿工的CS架构”是啥。不懂
  • “请参阅 lock script 提供者的手册(manual)” 。我既不知道 lock script provider 是啥,也不知道这个手册在哪里。
  • “哈希的演算法是带有个人“ckb-dafault-hash” 的blake2b”什么是个人的“ckb-defualt-hash”?

我到了最后一个部分:

# [block_assembler]
# code_hash = "0x9bd7e06f3ecf4be0f2fcd2188b23f1b9fcc88e5d4b65a8637b17723bbda3cce8"
# args = "ckb cli blake160 <compressed-pubkey>"
# hash_type = "type"
# message = "A 0x-prefixed hex string"

我完全懵了。这里一点解释也没有。

在我展开了 ckb-cli account new 的文档示例输出和它的示例[block_assembler]之后,我终于明白了我被要求做什么了,并且我做了一些推论。

文档中默认折叠的这些范例可能会不利于理解。我不加考虑的忽略了他们,但其实在这里我是需要他们的。

我认为我应该做的是:

  • 别管 code_hash 了
  • 将所有的 args 用 lock_arg 的值去替换他
  • 别再碰 hash_type
  • 把 massage 设置为“0x”

我注意到文档说我需要在 lock_arg 前面加上“0x”,但是 ckb-cli 在它自己的输出中增加了一个带有“0x”前缀的 lock_arg

我不知道“massage”是什么,但显然“0x”加在前面可以安抚 ckb

译注:Brian 没展开的范例如下图

缺失

开发文档基本上到此结束,他表明了我们可以使用 ckb—cli 做一些事情,这里也有一些 SDKs 可以与 ckb 后台自动做沟通(Rust SDK 还没有)

我最想做的是写可以在 CKB 上运行的合同。我不知道我是否需要通过 SDK。
我有点被卡住了,但我为自己制定了一个计划:

  • 探索ckb-cli的功能
  • 尝试使用ckb-cli在devnet上进行交易。

在测试网上发送 CKB

(许多天后)

今天 Aimee 和我试着来在测试网上交易 CKB。
我们同事同步了测试网并且运行了 ckb run
首先,我们用测试网的水龙头要来了一点 CKB。

我们需要钱包地址。我们需要一个钱包。文档有提到 Neuron Wallet。身为一个开发者,我比较想用命令行的工具,并了解底层的工具集。因此此刻我去深入的研究了 ckb—cli

ckb-cli 有个钱包的子命令。这里有个描述 ckb-cli 命令的 wiki 页面,但它已经足够让我相信 ckb-cli 能够提供更多的输出。

我现在还不知道有没有其他落掉的文档,所以我想我们必须通过CLI,加上直觉和试错。

当阿敏试图在 Mac 上运行 ckb-cli 时,一些系统级保护机制禁止她运行非 App-store 的应用程序。

在没有参数的情况下运行 ckb-cli 会产生一个交互式环境,其中的命令似乎直接对应于命令行子命令。我想知道这是否由他们的命令行解析器自动完成。

我需要一个帐户来使用这个钱包。我研究帐户子命令。我之前创建了一个 devnet 帐户,但是还没有测试网帐户。

当我在运行account list时我得到了四个账户。当 Aimee 这么做的时后他得到了两个。(咦?)

我输入 account new 。我使用“foo”做为我的密码,Aimee 使用“hotsauce”做为密码

CKB> account new
Your new account is locked with a password. Please give a password. Do not forget this password.
Password: Repeat password: address:
  mainnet: ckb1qyq2p6jgd8pnqlngy4cf4h7c76p383rug9sqw9e2hp
  testnet: ckt1qyq2p6jgd8pnqlngy4cf4h7c76p383rug9sqnq84ma
lock_arg: 0xa0ea4869c3307e6825709adfd8f68313c47c4160
lock_hash: 0xb686ca47423942cd64f4d091829450ad3b968b485d922b773a4672616a084c0c

运行 Account list,account #4 是我的新账户。我在这个列表中也看到了以前生成的 devnet 帐户。我猜钱包账户是一个全局性的资源。我注意到这里有个 ~/.ckb-cli 的目录。

根据钱包的文档,我们可以用 lock script hash,地址,lock arg 或者 pubkey 授权进入我们的账户。从 account new 指令的输出,我目前已经有所有的 pubkey 了。

但我目前还是不知道去哪里找到 pubkey。

我用了 lock arg 来获取我钱包里的 capacity:

CKB> wallet get-capacity --lock-arg 0xa0ea4869c3307e6825709adfd8f68313c47c4160
total: 0.0 (CKB)

我的 capacity 是 0 CKB。
这个 capacity 代表的是我账户中的钱包总额吗?我想应该是在说这个吧,因为我一个 CKB 也没有,我在区块链上也没有任何存储容量。我的 CKB 余额是0.

Aimee 和我同时和水龙头要来一些 CKB。大约 1 分钟后,我们都得到 5000 CKB。

我想要知道给我 CKB 的那个区块长什么样子,于是我运行了

CKB> wallet get-live-cells --address=ckt1qyq2p6jgd8pnqlngy4cf4h7c76p383rug9sqnq84ma
current_capacity: 5000.0 (CKB)
current_count: 1
live_cells:
  - capacity: 5000.0 (CKB)
    data_bytes: 0
    index:
      output_index: 0
      tx_index: 1
    lock_hash: 0xb686ca47423942cd64f4d091829450ad3b968b485d922b773a4672616a084c0c
    mature: true
    number: 55611
    tx_hash: 0x1a8a1650dcf8bc21a210a970073b6d1a47eff13afdd649e5cb3ecc3d56c06083
    tx_index: 0
    type_hashes: ~
total_capacity: 5000.0 (CKB)
total_count: 1

我打开了测试网的浏览器上该交易的页面
Aimee 试着发送一些 CKB:

CKB> wallet transfer --capacity 1000 --from-account 0x2af2ea2efbffce44f51cd4d7731507fdbbd63629 --to-address ckt1qyq2p6jgd8pnqlngy4cf4h7c76p383rug9sqnq84ma --tx-fee 1
PassworD:
0xc0a6973ac921cea95d27fa9e8a30ae6fca18de2404f768e3a077dd1e5f345ec0

输出的那些数字是什么?这是交易哈希。30 秒后这交易出现在浏览器中

我查看一下我的账户:

CKB> wallet get-capacity --address=ckt1qyq2p6jgd8pnqlngy4cf4h7c76p383rug9sqnq84ma
total: 6000.0 (CKB)
CKB> wallet get-live-cells --address=ckt1qyq2p6jgd8pnqlngy4cf4h7c76p383rug9sqnq84ma
current_capacity: 6000.0 (CKB)
current_count: 2
live_cells:
  - capacity: 5000.0 (CKB)
    data_bytes: 0
    index:
      output_index: 0
      tx_index: 1
    lock_hash: 0xb686ca47423942cd64f4d091829450ad3b968b485d922b773a4672616a084c0c
    mature: true
    number: 55611
    tx_hash: 0x1a8a1650dcf8bc21a210a970073b6d1a47eff13afdd649e5cb3ecc3d56c06083
    tx_index: 0
    type_hashes: ~
  - capacity: 1000.0 (CKB)
    data_bytes: 0
    index:
      output_index: 0
      tx_index: 1
    lock_hash: 0xb686ca47423942cd64f4d091829450ad3b968b485d922b773a4672616a084c0c
    mature: true
    number: 55664
    tx_hash: 0xc0a6973ac921cea95d27fa9e8a30ae6fca18de2404f768e3a077dd1e5f345ec0
    tx_index: 0
    type_hashes: ~
total_capacity: 6000.0 (CKB)
total_count: 2

OK.我现在知道怎么设置了测试网和 devnet,并且可以在测试网中透过命令行移转 CKB 了。

附录:CKB文档

这只是我收集的一些链接的清单:

正文结束

Brian的开发思路

1.搭建自己的 CKB 链
下载 CKB Github repo --》找开发文档,了解如何编写、部署和测试脚本–》从文档最初开始寻找如何创建自己的私有链–》找不到,先试试搭建测试网(是Aggron)吧–》同步测试网–》搭建 dev chain–》在dev chain 上挖矿–》创建账户–》dev chain 完成。

2.尝试发交易
从底层的 ckb-cli 的命令行如何使用开始–》找到操作命令行的 wilki --》产生账户 --》和水龙头要钱 --》发送交易给其他地址–》查看浏览器确认是否完成。

槽点汇总 :P

  1. 在文档上找不到如何搭建自己的 CKB chain 的指示。
  2. 文档 Getting Start 里面也没有怎么搭建 CKB 私网的指示
  3. ckb-cli 和 ckb 的版本号对不起来,可能一个是v 0.29 一个是 v 0.27,但也没有特别说明
  4. Aggron test 的文档还是 12 月的
  5. 没有指引告诉大家测试网的同步要多久或者可以去看区块浏览器等
  6. 对于特殊含义的字段没有充足的解释,例如 lock_hash\ lock_arg\hash_type 干嘛的,都没有在文档中有解释 (p.s.可能像 rfc19 的一些内容会有帮助)
  7. dev chain 这边可以有一点指引让大家知道就是在这里搭建自己的 CKB 链
  8. ckb-cli在输入密码后并没有即时的反馈或者提示
  9. 为什么要设定密码似乎也没说清楚
  10. 测试网重置了没有足够的指引告诉开发者他们应该怎么做
  11. ckb.toml的 [block_assember] 突然出现上千字的注释,但注释本身就有些地方让人看不懂
  12. 文档的 Example 默认是折叠的可能或让人不小心忽略
  13. 似乎很多指令为什么要这么做在文档里没说清楚,像是为什么在 lock_arg 要有0x的前缀,massage为什么又要填 0x 等
  14. 钱包里面 capacity 是什么,好像很多专有名词都觉得开发者已经知道一样。

最后的最后,谢谢大家阅读,小弟的英文水平有限,如果有哪些地方翻的不好恳请指正但求轻喷。

7 Likes

非常有帮助 已经转发给一些在做尝试的开发者 感谢翻译与分享

1 Like

看着也想动手试一试了

Toya 谢谢转发~ <3
我自己看了这篇文章也觉得很好玩

Wow 期待了!