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
which does have a testnet 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 generatelock_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 inargs
- 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.
- https://docs.nervos.org
- https://github.com/nervosnetwork/ckb/blob/develop/docs/get-ckb.md
- ckb/docs at develop · nervosnetwork/ckb · GitHub
- RFC: Simple UDT Draft Spec
- RFC: anyone-can-pay lock
- Proposal for User Defined Fungible Token standard on CKB · GitHub
- ckb-cli/README.md at develop · nervosnetwork/ckb-cli · GitHub
- Chains · nervosnetwork/ckb Wiki · GitHub
- Home · nervosnetwork/ckb Wiki · GitHub
- Introducing Godwoken - A missing piece of the cell model
- SECBIT Labs - zkp-toolkit-ckb - a Zero-Knowledge Proof toolkit for CKB
- GitHub - nervosnetwork/wasm-secp256k1-test: A demo showcasing running WASM programs on CKB VM
- Summa - Bitcoin SPV Utils
- Sub Commands · nervosnetwork/ckb-cli Wiki · GitHub