Experience report - first time building and running CKB

Hi.

Recently I spent a while learning to build and run CKB. In the process I wrote
down all the steps I made, and the thoughts I had, and am posting them here.

During the course of this project I built ckb and ckb-cli, set up a devnet
with mining, connected to the testnet, created accounts with ckb-cli and
transferred CKB on the testnet.

I find that this approach of writing down everything I see when I approach a new
project helps me understand the project better, and almost always surfaces many
simple issues that can be fixed to improve others’ experience. I hope that
documenting this experience illustrates to the dev team areas that can be
improved and also that it might help others who are also trying to get started
developing on CKB.

Thanks to Aimee for helping me with resources and testing.

Written between March 12 and April 5, 2020.

My first attempt to run CKB

I would like to write a piece of software that run on CKB, but first I need to
learn how to build and run CKB and use its tooling. I don’t have any prior
blockchain experience, but I know a bit about CKB from past reading. I have
previously created a project that runs on CKB-VM.

I start by loading the main repo on GitHub and following the link
to the website. I’m looking for documentation that will teach me how
to build and run a private testnet. Once I have a test node running I will
need documentation about how to write, deploy and test scripts.

Building CKB

It takes me one click to reach the Nervos developer docs.

Clicking through the doc headers I don’t see anything related to building CKB. I
am surprised by this, but I imagine it is because the documentation is oriented
towards developers building on CKB, and assuming they don’t need to build CKB
themselves.

Personally though, I want to build and understand my entire development stack,
particularly for an in-development platform like CKB.

I look through the README on GitHub and also don’t see any documentation on
how to build CKB.

There are though two links named “Get CKB”, and “Quick Start”. The Get CKB
document includes a “Build from Source” section.

The docs say to run make prod to build CKB. CKB being a Rust project I do
not want to do that — instead I want to run cargo build, so I do. It
builds successfully.

I’m always curious about what extras projects add to their Makefiles to augment
cargo, and in this case it is just adding --cfg disable_faketime. I
don’t know what that is offhand, but I’m guessing “faketime” is something it’s
ok to have during dev. I note that this is a “negative” cargo feature, which are
generally discouraged.

Following the developer docs

It seems like I’m off the documentation happy-path immediately, since I’ve
ignored the documentation website and dug into the markdown in the GitHub repo,
so I back up and re-investigate the documentation website.

To make sure I’m not missing what I’m looking for in the main docs, I open the
“Getting Started / Introduction” page. It’s about running nodes, and
using wallets and exchanges. Not developer docs.

I swear I got here by clicking on a “developer docs” link. I recheck, and I did
— from nervos.org I clicked “Developers”, then “Documentation”. The site I
end up on is docs.nervos.org and describes itself as

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.

I’m confused about who the audience for this documentation is.

There’s another section of the docs called “Development Guide”, so I open
“Development Guide / Introduction”.

This page doesn’t hint about how to build CKB. I notice that it emphasizes
use of the testnet (called “Aggron”), which makes me think my approach of
running my own testnet might not be prefered.

Reading the testnet docs

Based on the docs my new plan is to learn to use the testnet. I intend
to use my own build of CKB though, regardless of if the docs tell me
to download a build.

The “Testnet Aggron” page confuses me with the first paragraph:

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.

I think “we” here refers to the Nervos project, and not the “royal we” often
used to mean “you” in tutorial documentation. Seems like this was written a long
time ago when the testnet was just being deployed.

The page tells me to download a CKB release. Instead I look at the CKB release
page
and see that the most recent release is 0.29.0.

I checkout the v0.29.0 tag and rebuild CKB in debug mode.

I discover that ckb-cli is not part of the ckb repo. I easily find
the ckb-cli repo, but hit a stumbling block.

Building ckb-cli

There’s no v0.29.0 tag for ckb-cli. I don’t know which revision of
ckb-cli to pair with ckb. This discrepancy makes me wonder if the
release tarballs from the ckb repo even contain ckb-cli.

I download the 0.29
tarball

and it does contain ckb-cli. I want to know which version of ckb-cli this is,
and I don’t see any other way but to run the release version. I do so and it reports

ckb-cli 0.27.1 (9d0bf90 2020-01-31)

So ckb 0.29.0 is paired with ckb-cli 0.27.1. My guess is that the two are
loosely coupled and that I should just always use the most recent release of
either.

I checkout the correct version of ckb-cli and build it. This appears to involve
building another copy of ckb. Kind of annoying, but oh well.

In a new window I set up PATH to give me access to ckb and ckb-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)

I note that on the testnet page, the example ckb and ckb-cli versions
are from November 2019, and that the two have the same version:

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

Using the testnet

Now I want to connect to the testnet and verify I have working tools.

Here are the initial instructions:

  • Create aggron.toml in the directory containing the CKB binary.
  • Init CKB node with ckb init --import-spec ./aggron.toml --chain testnet

The aggron.toml link is to a gist from December. I hope it is stil valid.

I create a new directory, ckb-testing, to hold our testnet data, and curl the
example aggron.toml into it.

I run ckb init:

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

which outputs

~/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

It looks like it succeeds, copies aggron.toml to specs/testnet.toml, and
creates ckb.toml and ckb-miner.toml.

I poke around itside the two new toml files.

ckb.toml contains these lines:

[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" }

It indicates that there’s a built-in testnet definition, which makes me wonder
whether it agrees with our own testnet definition. Let’s see if we can find the
built-in definition.

I search for the configuration inside the ckb repo using fd:

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

It’s a bingo.

Is the built-in definition the same as aggron.toml recommended by the developer docs?

~/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

Yes, except for a single out-dated comment.

Continuing to follow the testnet docs…

The gist containing aggron.toml has an additional instruction:

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

Though doesn’t say how to confirm that. The genesis hash isn’t output by ckb init.

The next step in the testnet docs is ckb run. I do that.

Windows firewall asks for permissions, and I give them (I’m running on WSL). I
see a bunch of log output, that begins with

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

The log indicates the testnet has the correct genesis hash. And we’re syncing blocks.

I’m up to block 2704. I want to know how many blocks there are on the testnet, so I have
an idea of how long I’ll be waiting.

Is there a block explorer for the testnet? Googling “nervos block explorer” finds

https://explorer.nervos.org

which does have a testnet explorer:

CKB Explorer

There are 567,493 blocks on the testnet. I’m not super excited to wait for that
to download. My data directory is around 7MB, so I think I should expect to need
about (600_000/3000 * 7) = ~1.4GB of space to to testnet development, which is
fine.

I really don’t want to wait to sync the testnet though. Let’s proceed to the
next documentation section, “Dev Chain”, and hope that tells us how to use our
own chain.

Setting up the dev chain

I temporarily stop the ckb that is syncing the testnet, move all of its data
to ckb-testing/testnet, then continue syncing the testnet with ckb run.

I create ckb-testing/devnet. Per the dev chain docs I run:

ckb init --chain dev

which outputs

~/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

The dev chain docs want me to customize specs/dev.toml, setting genesis_epoch_length to
1000. I look at my dev.toml and genesis_epoch_length is already 1000.

It wants me to customize ckb-miner.toml to set the idle interval, misleadingly
called just value, to 500. I look at ckb-miner.toml and value is already 500.

This piece of documentation is seemingly out-dated.

Mining on the dev chain

As indicated by ckb init, an initialized chain is not configured for mining. Step 4
of the dev chain docs is called “configure block-assembler in ckb.toml for mining”.

It says

use ckb-cli to generate lock_arg. lock_arg is needed for configuring the
mining feature so please backup it.

I wish it explained what lock_arg actually is, or linked to more information.

I run ckb-cli account new.

It asks me for a password. I type “foo”, and press enter. It asks me to repeat
the password. I type “foo”, and press enter. The CLI gives me no feedback for
a long time. I wonder if it is broken.

Aimee wonders why we need an account. I am guessing it is connected to the
public key for our miner, and the account will provide access to whatever CKB
the miner accrues.

The documentation here is insufficient.

Eventually, the account-creation command finishes and outputs

~/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

Ugh look at that output. Needs work. You can’t see but the “labels” (“address”,
“mainnet”, are also a dark shade of blue that is unreadable on my terminal).

It took 168 seconds. I am running a debug binary though, and syncing the
testnet in the background.

For the sake of experiment I stop syncing the testnet, run ckb-cli account new
again with the debug build; then I rebuild both ckb and ckb-cli in release mode,

  • debug: 99s
  • release: 15s

So the debug build is 6.6x slower. I resume syncing the testnet with the release build.

I wonder what lock_arg and lock_hash are. I search for both of them on the
web. I don’t find anything useful beyond “needed for configuring your miner
software as well as exporting your private key”.

I will continue this later.

The testnet is reset

I took a break for a few days, and in the meantime the testnet was reset.
I discovered this when my ckb testnet logs started looking like

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

Simply deleting the testnet data, reinitializing, and resyncing doesn’t work. I
see that the gist containing the aggron testnet info now indicates the
testnet has a different genesis block.

I assume that I need a new testnet configuration, and also assume that Nervos
has released new builds that contain the updated testnet definition. I fetch
ckb and ckb-cli and see the latest tags are v0.30.1 and v0.30.0
respectively. I check them out and build them in release mode.

Continuing dev chain setup

The next instructions in the “Dev Chain” guide are

open ckb.toml and configure [block_assembler] part.

  • lock_arg need to attach 0x to the prefix, then fill in args
  • fill in message with 0x

Pretty cryptic.

ckb.toml has a lot more detail attached to comments about the [block_assembler] section:

# 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"

Oh, there’s so much here that isn’t explained well:

  • “CS architecture for miner”. No idea.
  • “Read the manual of the lock script provider”. Don’t know what a lock script provider is, nor where its manual is.
  • “The hash algorithm is blake2b, with personal ‘ckb-default-hash’”. What’s a personal ckb-default-hash?

I reach the final section,

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

and I’m absolutely confused. There’s so little explanation here.

I finally think I’ve figured out what I’m being asked to do, after I expand
the documentation’s example output from ckb-cli account new, and its
example [block_assembler], and make some inferences.

The collapsed-by-default examples in the documentation may be detrimental to
comprehension. I just skipped over them without consideration, but I needed them
here.

What I think I need to do is:

  • Leave code_hash alone
  • Replace all of args with the lock_arg value
  • Don’t touch hash_type
  • Set message to just “0x”

I note that the documentation indicates I need to prefix lock_arg with “0x”,
but ckb-cli account new on its own output a lock_arg with the “0x” prefix.

I have no idea what message is but apparently “0x” should be enough to appease
ckb.

Lost

The developer documentation essentially stops here. It indicates that things
can be done with the ckb-cli, and that there are SDKs with which to communicate
to the ckb daemon automatically (no Rust SDK yet).

What I ultimately want to do is write contracts that run on CKB. I don’t know if
I need to go through the SDK for that or not.

I’m kind of stuck, but I make a plan for myself:

  • explore the capabilities of ckb-cli
  • try to make transactions on devnet using ckb-cli

Sending CKB on the testnet

(Many days later)

Today Aimee and I are going to try to exchange CKB on the testnet.

We’ve both got the testnet synced and are running ckb run.

First, let’s use the testnet faucet to acquire CKB.

We need a wallet address. We need a wallet. The documentation mentions Neuron
Wallet
. As a developer I would rather use command line tools, and to have
an understanding of the underlying toolset. I’m going to investigate ckb-cli.

ckb-cli has a wallet subcommand. There’s a wiki page describing ckb-cli
commands
, but it’s bare enough that I would trust the ckb-cli help
output more.

I don’t know of any other docs offhand, so I think we’re going to have to
work through the CLI with intuition plus trial-and-error.

When Aimee tries to run ckb-cli on her Mac she is forbidden by some system-level
protections against running non-app-store apps.

Running ckb-cli with no arguments produces an interactive environment with
commands that seem to correspond directly to the command line subcommands. I wonder
if this is done automatically by their command-line parser.

I need an account to use the wallet. I investigate the account subcommand. I
previously created a devnet account, but don’t yet have a testnet account.

When I run account list though I get a list of 4 accounts. When Aimee does
it she gets two.

I type accunt new. I use “foo” as my password. Aimee uses “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

Running account list, account #4 is my new account. I see my previously-generated devnet
account in this list as well. I guess wallet accounts are a global resource. I notice there
is a ~/.ckb-cli directory.

According to the wallet docs, we can access our account with lock script hash, address,
lock arg, or pubkey. From my account new output I thin I have all but the pubkey.

For now I don’t know how to get the pubkey.

I use the lock arg to get my wallet capacity:

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

My capacity is 0 CKB.

Does “capacity” mean “amount of CKB in my account”? I think this is saying that,
since I have no CKB, I have no storage capacity on the blockchain. My CKB
balance is 0.

Aimee and I both ask the faucet for some CKB. In about a minute we’ve both
got 5000 CKB.

I want to know more about the block that gave me my CKB. I run

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

I open the transaction page on the testnet explorer.

Aimee tries to send me some CKB:

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

What’s the number it output? It’s a transaction hash. After 30 seconds or so it shows up in the
explorer

I check out my accounts:

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. I know now how to set up the testnet and a devnet, and to move CKB around
the testnet via the command line.

Appendix: CKB Documentation

This is just a list of links I collected.

13 Likes

It is so cool!!

Thank you so much for sharing your experience and taking the time to document it! It is incredibly helpful that you took such detailed notes- we are working on all of our on-boarding docs (!) so your timing is excellent and the feedback is very much appreciated!

1 Like

So thankful for you sharing your detail developing experience and thought here. It not only give me very impressed reading experience but learn how to develop on CKB. I believe it is also a good guide to help core team to find which part could be improved like doc and cli.
Here I translate your piece into Chinese version.If there is anything I can improve, let me know.

1 Like

Thanks for letting me read this wonderful piece.Thanks @brson again.
There are two very small points that I am not sure it is true or not.

Is this thin a typo (think)? means that you were still lack of pubkey?

According to the doc,it seems that the number is 5000 .

1 Like

@KGB_agent thanks for reviewing.

Yes a typo. I did not know where the pubkey was.

Yes, it is 5000. I must have typo’d 500. And 5000 was in the file by default.

Thank you so much for sharing the experience report, we are working on updating our documents, it is very helpful !

1 Like

It’s so cool! thank you very much!