Rust 重要开发者 Brian 的搭建并运行 CKB 初体验

2020-04-10 14:45 来源:Nervos Network 阅读:6851
本文是前 Rust Core Team 重要成员 Brian Anderson 搭建并运行 CKB 之初体验。

在这篇文章中,他记录下了自己创建、运行 CKB 的测试网和 dev chain 时详细的操作过程和心路历程,当然还包括了很多有实质帮助的建(tu)议(cao)。同时这篇文章也是很棒的初入 CKB 的开发者体验报告,记录下了 CKB 文档、testnet、ckb-cli 等的使用路径是否友善,还有哪些值得再提升的设计,如何让更多的开发者更「无痛」 的加入 CKB 生态等等。

原文中,我们可以发现 confuse、stuck 等单词会时常地出没在眼前,可以感受到 Brian 的认真与贴心。文末我们也整理了一些他遇到的坑或者建议,欢迎参考。如果您是之前没有接触过 CKB,又想要在 Nervos CKB 上开发玩耍的盆友,那么非常欢迎您来围观 Brian 的实操思路,在这篇文章中,您可以看到他踩过的那些坑,也许这可以帮助你省去一些时间。

原文链接:

https://talk.nervos.org/t/experience-report-first-time-building-and-running-ckb/4518

翻译 & 校对:姆斯哥 & 凯莉姐

Hi,最近我花了一些时间学习如何构建以及运行 CKB。在创建这个项目的过程中,我建立了 ckb 和 ckb-cli 以及可以挖矿的 devnet,把它连接到了测试网,用 ckb-cli 创建账户并在测试网上转账。

我发现当我着手一个新项目时,这种记录下我所看到的一切的方法,有助于我更好地理解这个项目。而且在这个过程中,几乎总是会出现许多简单的问题,如果能修正这些问题,那么其他人的体验也将会得到改善。

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

写于 2020 年 3 月 12 日至 4 月 5 日

初次尝试运行 CKB

我想要写一个可以运行在 CKB 上的软件,但首先我必须先学习如何建立、运行 CKB 以及使用它的工具。虽然我没有任何的区块链开发经验,但根据我过去的学习,我对 CKB 还是有一定了解的。我之前还在 CKB VM 上创建了一个项目:

http://www.ferrisfencing.org/

我开始是在 Nervos 的 GitHub 上下载那些主要的仓库,并且因此也来到了 Nervos 官网。我需要找到那些在 CKB 上构建以及运行私人测试网的文档,因为一旦我运行了一个测试节点,我将需要那些关于如何编写、部署和测试脚本的文档。

搭建 CKB

我点击进入到 Nervos 的开发文档 (https://docs.nervos.org/introduction/welcome.html) 之后,惊讶的发现这里面没有任何和构建 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 应该是在开发过程中可以使用的字段。我注记了这是一个「negative」cargo 特性,通常并不鼓励。

探索开发者文档

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

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

我发誓我是通过点击「开发者文档」链接来到这里的。我又检查了一遍——我是在 nervos.org 上点击了「开发者」→「文档」,最终访问到的 docs.nervos.org,这个网站将自己描述为:

这是 Nervos CKB 的文档站点。在这里,您可以了解 Nervos CKB 的设计,以及如何运行节点和挖出 CKByte 代币。

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

在这个网站上还有另外一个叫做「开发者指引」的文档,这个页面上也没有任何关于如何构建 CKB 的提示。我还注意到它强调使用名为「Aggron」的测试网,这让我感觉到自己运行自己测试网的方法可能并不受欢迎。

阅读测试网文档

基于文档,我的新计划是学习使用 testnet。虽然我打算使用自己创建的 CKB,不管文档是否要求我下载一个版本。

「Testnet Aggron」页面的第一段真的把我搞糊涂了:

我们即将部署一个 POA 算法以在测试网中产生区块。然而,这将会耗费一些时间去开发。在这之前只要每超过一小时没有出块,我们就会常规性的重置测试网。用于启动 Aggron 的链上规范已经在此发布,请参阅 Aggron 链的文件信息。

我认为这里的「我们」应该指的是 Nervos 这个项目,而不是教程文档中经常用来表示「你」的「royal we」。而且这个似乎是很久以前,也就是测试网刚被部署的时候就写了。(译者注:该页面写于 2019 年 12 月 9 号)。

这个页面让我们下载一个 CKB 新版本,然后我查看了 CKB release 的页面,发现最新的版本是 v0.29.0 。

我查看了 v0.29.0 的 tag,并且在调试模式下重建了 CKB。

这时我发现 ckb-cli 并非 ckb repo 的一部分,我很轻易的就能找到 ckb-cli repo,但却遇到一个绊脚石。

创建 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 来让我有权限进入 ckb 和 ckb-cli。

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

我注意到在 testnet 页面上,ckb 和 ckb-cli 的示例版本是 2019 年 11 月的,并且有相同的版本号:

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

使用测试网

现在我想要连接测试网并且验证我是否有能用的工具。

以下是最初的说明:

  • 在包含 CKB 二进制文件的目录中创建 aggron.toml

  • 用 ckb init --import-spec./aggron.toml --chain testnet 的指令来初始化 CKB 节点。

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

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

运行 ckb init:

~/ckb-testing$ ckb init --import-spec ./aggron.tml --chain testnet

输出了:

  • testing$ ckb init --import-spec ./aggron.toml --chain testnetWARN: mining feature is disabled because of lacking the block assembler config optionsInitialized CKB directory in /home/brian/ckb-testing/devnetcp ./aggron.toml specs/testnet.tomlcreate ckb.tomlcreate ckb-miner.toml

这看起来像是成功了,复制了 aggron.toml 到 specs/testnet.toml 中,并且创建 ckb.toml 和 ckb-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.toml10c10< # 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 中有另外一个说明:

请确认 log 输出中的创世哈希是0x184ac4658ed0c04a126551257990db132366cac22ab6270bbbc1f8c3220f302d

但它却没有说如何验证。创世哈希并不是由 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://48c6a88d92e246478e2d53b5917a887c@sentry.io/14227952020-03-20 15:10:23.354 -06:00 main INFO main  Miner is disabled, edit ckb.toml to enable it2020-03-20 15:10:23.374 -06:00 main INFO ckb-db  Initialize a new database2020-03-20 15:10:23.624 -06:00 main INFO ckb-db  Init database version 201911271355212020-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: 0x184ac4658ed0c04a126551257990db132366cac22ab6270bbbc1f8c3220f302d2020-03-20 15:10:23.654 -06:00 main INFO ckb-network  Generate random key2020-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/Qme9oaLbtaqF6JyZnZhrNPoW3dSPkzJSW1PGag3fKdEuaj2020-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 download2020-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 download2020-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 download2020-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 download2020-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 devWARN: mining feature is disabled because of lacking the block assembler config optionsInitialized CKB directory in /home/brian/ckb-testing/devnetcreate specs/dev.tomlcreate ckb.tomlcreate ckb-miner.toml

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

它想让我定制 ckb-miner.toml 来设置空闲时间间隔(常被称为 value )到 500。我瞄了一眼 ckb-miner.toml 和 value 已经都到 500 了。这份文档似乎已经过时了。

译者注:文档中显示设定的值为 5000(截图为 2020/03/10 版)

在 dev chain 上挖矿

正如 ckb init 上所说,一个初始化的链尚未为挖矿进行配置。dev chain 文档的步骤 4 标题为「在 ckb.toml 中配置挖矿用的 block-assembler」,它提到:

我们使用 ckb-cli 生成 lock_arg 。需要 lock_arg 来配置挖矿功能,所以请将它备份。

我真希望它能解释到底 lock_arg 是什么,或者链接到更多的资讯。

紧接着我运行了 ckb-cli account new。

它要求我设置密码,我便设置成了「foo」,但 CLI 端有很长一段时间没有给我任何反馈。我真想知道它是不是坏了。

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

这部分文档是有缺陷的。

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

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


呃,看了一下输出,还需要做一些工作。你只能看到标签(地址、主网也是在我的终端机中看不到的深蓝色)。

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

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

  • debug:99 秒
  • release:15 秒

所以 debug 构建会慢 6.6 倍。我继续将测试网与 release build 同步。
我想知道 lock_arg 和 lock_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 已经发布了包含更新的测试网定义的新版本。我获取了 ckb 和 ckb-cli ,看到最新的 tag 分别是 v0.30.1 和 v0.30.0 。我检查了一下并在发布模式下构建他们。

继续 dev chain 的设置

下一个在 Dev Chain 文档的指示是:
开启 ckb.toml 并配置 [block_assembler] 的部分。

  • lock_arg 必须要有 0x 作为前缀,并在后面加上 args 中的文字。
  • message 中填入 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## The command `ckb init` also accepts options to generate the block assembler# directly. See `ckb init --help` for details.##     ckb init## secp256k1_blake160_sighash_all example:# [block_assembler]# code_hash = "0x9bd7e06f3ecf4be0f2fcd2188b23f1b9fcc88e5d4b65a8637b17723bbda3cce8"# args = "ckb cli blake160"# 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"# hash_type = "type"# message = "A 0x-prefixed hex string"


这里也是一点解释也没有。
在我展开 ckb-cli account new 的文档示例输出和它的示例 [block_assembler] 之后,我终于明白我需要做什么,并且我做了一些推论。
文档中默认折叠的这些范例可能会不利于理解。我不加考虑的忽略了他们,但其实在这里我是需要他们的。
我认为我应该做的是:

  • 别管 code_hash 了
  • 将所有的 args 用 lock_arg 的值去替换
  • 别再碰 hash_type
  • 把 message 设置为「0x」

我注意到文档指示我需要在 lock_arg 前面加上「0x」,但是 ckb-cli 在它自己的输出中增加了一个带有「0x」前缀的 lock_arg。
我不知道「massage」是什么,但显然「0x」加在前面可以安抚 ckb 啦。
(译者注:Brian 没展开的范例如下图)

缺失

开发文档基本上就到此结束了,它表明我们可以使用 ckb—cli 完成一些工作,这里也有一些 SDK 可以与 ckb 后台自动通信(目前还没有 Rust SDK)。
我最想做的是写一个可以在 CKB 上运行的合约,但不确定是否需要通过 SDK。
我有点被卡住了,但我为自己制定了一个计划:

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

在测试网上发送 CKB

(许多天后)
今天 Aimee 和我试着在测试网上发送 CKB 交易。我们同时同步了测试网并且运行了 ckb run。
首先,我们用测试网的水龙头要来了一点 CKB,这就需要有钱包地址,所以我们首先需要一个钱包。文档有提到 Neuron Wallet。但身为一个开发者,我比较想用命令行的工具,并了解底层的工具集。因此我去深入的研究了一下 ckb—cli。
ckb-cli 有个 wallet 的子命令。这里有个描述 ckb-cli 命令的 wiki 页面,但它已经足够让我相信 ckb-cli 能够提供更多的输出。
我现在还不知道有没有其它遗漏的文档,所以我想我们必须通过 CLI,加上直觉和试错。
当 Aimee 试图在 Mac 上运行 ckb-cli 时,一些系统级保护机制禁止了她运行非 App Store 的应用程序。
在没有参数的情况下运行 ckb-cli 会产生一个交互式环境,其中的命令似乎直接对应于命令行子命令。我想知道这是否由他们的命令行解析器自动完成。
我需要一个帐户来使用这个钱包,我研究了 account 子命令,我之前创建了一个 devnet 帐户,但是还没有测试网帐户。
当我在运行 account list 时我得到了四个账户。当 Aimee 这么做时她得到了两个。
我输入 accunt new ,并使用「foo」作为我的密码,Aimee 使用「hotsauce」作为密码。

CKB> account newYour new account is locked with a password. Please give a password. Do not forget this password.Password: Repeat password: address:  mainnet: ckb1qyq2p6jgd8pnqlngy4cf4h7c76p383rug9sqw9e2hp  testnet: ckt1qyq2p6jgd8pnqlngy4cf4h7c76p383rug9sqnq84malock_arg: 0xa0ea4869c3307e6825709adfd8f68313c47c4160lock_hash: 0xb686ca47423942cd64f4d091829450ad3b968b485d922b773a4672616a084c0c
运行 account list ,账户 #4 是我的新账户。我在这个列表中也看到了以前生成的 devnet 帐户。我猜钱包账户是一个全局性的资源。我注意到这里有个 ~/.ckb-cli 的目录。
根据钱包的文档,我们可以用 lock script hash、地址、lock arg 或者 pubkey 授权进入我们的账户。从 account new 指令的输出,我目前已经有所有的 pubkey 了。
但我目前还是不知道去哪里找到 pubkey。我用了 lock arg 来获取我钱包里的 capacity:

CKB> wallet get-capacity --lock-arg 0xa0ea4869c3307e6825709adfd8f68313c47c4160total: 0.0 (CKB)
我的 capacity 是 0 CKB。
这个 capacity 代表的是我账户中的钱包总额吗?我想应该是在说这个吧,因为我一个 CKB 也没有,我在区块链上也没有任何存储容量。我的 CKB 余额是 0。
Aimee 和我同时向水龙头要来了一些 CKB。大约 1 分钟后,我们都得到 5000 CKB。
我想要知道给我 CKB 的那个区块长什么样子,于是我运行了:

CKB> wallet get-live-cells --address=ckt1qyq2p6jgd8pnqlngy4cf4h7c76p383rug9sqnq84macurrent_capacity: 5000.0 (CKB)current_count: 1live_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 1PassworD:0xc0a6973ac921cea95d27fa9e8a30ae6fca18de2404f768e3a077dd1e5f345ec0
输出的那些数字是什么?这是交易哈希,30 秒后这交易出现在浏览器中。我查看一下我的账户:
CKB> wallet get-capacity --address=ckt1qyq2p6jgd8pnqlngy4cf4h7c76p383rug9sqnq84matotal: 6000.0 (CKB)CKB> wallet get-live-cells --address=ckt1qyq2p6jgd8pnqlngy4cf4h7c76p383rug9sqnq84macurrent_capacity: 6000.0 (CKB)current_count: 2live_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
OK,我现在终于知道怎么设置测试网和 devnet,并且可以在测试网中通过命令行移转 CKB 啦!

附录:CKB 文档

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

  • https://docs.nervos.org

  • https://github.com/nervosnetwork/ckb/blob/develop/docs/get-ckb.md

  • https://github.com/nervosnetwork/ckb/tree/develop/docs

  • RFC: Simple UDT Draft Spec

  • RFC: anyone-can-pay lock

  • https://gist.github.com/WilfredTA/bb1d2a80c420f0910d40ca881c2bd5d4

  • https://github.com/nervosnetwork/ckb-cli/blob/develop/README.md

  • https://github.com/nervosnetwork/ckb/wiki/Chains

  • https://github.com/nervosnetwork/ckb/wiki

  • Introducing Godwoken - A missing piece of the cell model

  • SECBIT Labs - zkp-toolkit-ckb - a Zero-Knowledge Proof toolkit for CKB

  • https://github.com/nervosnetwork/wasm-secp256k1-test

  • Summa - Bitcoin SPV Utils

  • https://github.com/nervosnetwork/ckb-cli/wiki/Sub-Commands

正文结束

以上就是 Rust 重量级开发者 Brian 搭建并运行 CKB 的初体验,让我们来总结一下 Brian 的开发思路:

1.搭建自己的 CKB 链
→ 下载 CKB GitHub repo 
→ 找开发文档,了解如何编写、部署和测试脚本 
→ 从文档最初开始寻找如何创建自己的私有链 
→ 找不到,那就先试试搭建测试网(是Aggron)吧 
→ 同步测试网 
→ 搭建 dev chain 
→ 在 dev chain 上挖矿 
→ 创建账户 
→ dev chain 完成。
2.尝试发交易
→ 从底层的 ckb-cli 的命令行如何使用开始 
→ 找到操作命令行的 wilki 
→ 产生账户 
→ 和水龙头要钱 
→ 发送交易给其他地址 
→ 查看浏览器确认是否完成。

我们再来汇总一下 Brian 的槽点 :P

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


Brian 的这份搭建并运行 CKB 的初体验是一份非常详尽,非常值得参考和借鉴的开发者体验报告。看完之后你是否也想要来 CKB 上探索一番?从文章中可以看出,Nervos CKB 上还有很多需要改进的地方等着被发现和完善。事实上,CKB「Lina」还是一个出生未满五个月的孩子,需要聚集大家的智慧共同协助她成长。
Nervos 一直崇尚开源精神,希望能够和社区一起来完善项目和生态,也非常愿意看到大家的反馈。在此,我们向所有的开发者发出邀请,欢迎你们来 CKB 上体验。不论是找 bug、搭应用,或是单纯的发交易,不论是赞美还是吐槽,我们都非常欢迎,这些都会是 Lina 最好的礼物。
你在 CKB 上踩过哪些坑呢?欢迎在留言区告诉我们,也期待看到你们更多的「体验报告」哦!

声明:此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。本网站所提供的信息,只供参考之用。

点击阅读全文