Nervos 是一个旨在满足去中心化经济需求的分层网络
。Layer 1 协议 CKB(Common Knowledge Base 共同知识库)是整个网络的价值存储层,Layer 2 协议在 Layer 1 区块链上提供了无限的可扩展性。
Nervos 网络 = 坚持安全和去中心化的 CKB + 百花齐放的 Layer2
采用了和比特币一样的 UTXO 模型
,并基于 UTXO 设计了一套新的编程模型 —— cell 模型。以太坊采用的是链上计算,链上验证的模式,而 CKB 采用的是链下计算,链上验证的设计思路
。比特币的中本聪共识(Nakamoto Consensus,简称 NC)的变体,命名为 NC Max,在保留 NC 优点的同时,提升了其性能极限和抵抗自私挖矿攻击的能力
Nervos CKB 采用的是一种称为 cell 模型的通用的 UTXO 模型,通过 cell 模型来进行原生代币(CKB)和用户自定义代币(UDT)的描述和编程
CKB VM 是为 CKB 设计的基于开源 RISC-V 指令集的虚拟机。通过 CKB VM,任意一种可以编译成 RISC-V 二进制代码的语言都可以用来当作 CKB 的编程语言
,比如 C/C++,比如 JavaScript/Ruby/Rust 等等
在 Nervos CKB 中,CKB 不仅仅是底层网络的原生代币,还代表了状态存储的权限,你持有 1 个 CKB 就拥有了 1 Byte 在 CKB 底层网络上的存储空间。
CKB 中的状态是一等公民(First-Class Citizen),状态包含在交易和区块中,它们直接同步在节点之间。CKB 的编程模型由三部分组成:
Cell 是 CKB 中的主要状态存储单元,资产所有权归用户所有,并且必须遵循脚本指定的相关应用程序逻辑
。
这样一个模型的特点是:
utxo
class TxOut
{
public:
Amount Value;
Script scriptPubKey;
...
}
cell
pub struct CellOutput {
pub capacity: Capacity,
pub data: Vec<u8>,
pub lock: Script,
pub type_: Option<Script>,
}
lock 管死,type 管生。lock 负责 tx 中 input cells 的验证,type 负责 output cells 的验证。type 负责的是不能随意创建有某个 type 的 cell 出来,反过来的话,如果 cell 的 type 是 X,那 cell 一定通过了 X 的验证。
mkdir ~/nervosnetwork
cd ~/nervosnetwork
wget https://github.com/nervosnetwork/ckb/releases/download/v0.32.0/ckb_v0.32.0_x86_64-unknown-centos-gnu.tar.gz
tar zxvf ckb_v0.32.0_x86_64-unknown-centos-gnu.tar.gz
解压后的目录结构
tree ckb_v0.32.0_x86_64-unknown-centos-gnu
ckb_v0.32.0_x86_64-unknown-centos-gnu
├── CHANGELOG.md
├── ckb ①
├── ckb-cli ②
├── COPYING
├── docs
│ ├── ckb-core-dev.md
│ ├── ckb-debugging.md
│ ├── configure.md
│ ├── get-ckb.md
│ ├── hashes.toml
│ ├── integrity-check.md
│ ├── quick-start.md
│ ├── rpc.md
│ └── run-ckb-with-docker.md
├── init
│ ├── linux-systemd
│ │ ├── ckb-miner.service
│ │ ├── ckb.service
│ │ └── README.md
│ └── README.md
└── README.md
① ckb 是主程序,通过命令行操作,我们可以生产配置,运行节点,同步区块信息,并开启挖矿等。
② ckb-cli 是官方的附加命令行工具,rpc 请求,生成 ckb 地址,管理钱包,模拟发送交易,并可以向 Nervos Dao 中存币。
拷贝命令至bin目录
cp ckb_v0.32.0_x86_64-unknown-centos-gnu/ckb /usr/local/bin/
cp ckb_v0.32.0_x86_64-unknown-centos-gnu/ckb-cli /usr/local/bin/
清除不需要的文件
rm -rf ckb_v0.32.0_x86_64-unknown-centos-gnu
rm -f ckb_v0.32.0_x86_64-unknown-centos-gnu.tar.gz
查看命令是否正确安装
ckb --version
ckb-cli --version
ckb init --chain testnet
生成的配置文件如下
├── ckb-miner.toml
└── ckb.toml
日志在data/logs目录下
nohup ckb run >/dev/null 2>&1 &
启动后会生成数据目录,并同步测试链的数据
tree data
data
├── db
│ ├── 000003.log
│ ├── CURRENT
│ ├── IDENTITY
│ ├── LOCK
│ ├── LOG
│ ├── LOG.old.1591171377564776
│ ├── MANIFEST-000004
│ ├── OPTIONS-000028
│ └── OPTIONS-000030
├── indexer_db
│ ├── 000003.log
│ ├── CURRENT
│ ├── IDENTITY
│ ├── LOCK
│ ├── LOG
│ ├── LOG.old.1591171377671827
│ ├── MANIFEST-000004
│ ├── OPTIONS-000012
│ └── OPTIONS-000014
├── logs
│ └── run.log
└── network
├── peer_store
│ ├── addr_manager.db
│ └── ban_list.db
└── secret_key
curl http://127.0.0.1:8114 -H 'content-type: application/json' -d ' {"id":1,"jsonrpc":"2.0","method":"get_tip_block_number","params":[]} '
系统环境,下载命令行程序同上一步测试网络
ckb init --chain mainnet
具体用法可参考下一章节 ckb-cli命令行
#创建账号
ckb-cli account new
# 导出私钥
ckb-cli account export --extended-privkey-path wallet --lock-arg 你的账户lock-arg
# 根据私钥生成配置
ckb-cli util key-info --privkey-path wallet
# 修改block_assembler信息,添加上一步得到的
vi ckb.toml
日志在data/logs目录下
nohup ckb run >/dev/null 2>&1 &
nohup ckb miner >/dev/null 2>&1 &
USAGE:
ckb-cli [FLAGS] [OPTIONS] [SUBCOMMAND]
FLAGS:
# 输出 jason 取消高亮
--no-color Do not highlight(color) output json
# 显示请求参数
--debug Display request parameters
# 确保索引库在执行命令前完成同步
--wait-for-sync Ensure the index-store synchronizes completely before command being executed
# 打印帮助信息
-h, --help Prints help information
# 打印版本信息
-V, --version Prints version information
OPTIONS:
# RPC API 服务 url
--url <url> RPC API server url
# 选择输出格式,默认 yaml,可选项:yaml,json
--output-format <output-format> Select output format [default: yaml] [possible values: yaml, json]
SUBCOMMANDS:
# 对节点调用 RPC 命令
rpc Invoke RPC call to node
# 账户管理
account Manage accounts
# 处理模拟交易(验证/发送)
mock-tx Handle mock transactions (verify/send)
# 处理常见的签名/多签交易
tx Handle common sighash/multisig transaction
# 启动 API 服务
server Start advanced API server
# 常用工具
util Utilities
# molecule 编码/解码工具
molecule Molecule encode/decode utilities
# 交易 / 查询余额(通过本地索引)/ key utils
wallet Transfer / query balance (with local index) / key utils
# 存入 / 准备 / 取出 / 查询 Nervos DAO 余额(通过本地索引)/ key utils
dao Deposit / prepare / withdraw / query NervosDAO balance (with local index) / key utils
# 进入 TUI 模式
tui Enter TUI mode
# help
help Prints this message or the help of the given subcommand(s)
在执行一些命令时,会从设定的 rpc url 中获得数据,如要连接到其他服务端请修改API_URL环境变量,默认值如下
export API_URL=http://127.0.0.1:8114
终端里的图形化界面,需在链启动后使用
ckb-cli tui
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ <ckb_testnet> CKB 0.32.0 (248aa88 ) │
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
┌Menu───────────┐┌Summary─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Summary ││ │
│ Recent Blocks ││ API URL : http://127.0.0.1:8114 │
│ Peers ││ Chain : ckb_testnet │
│ Top Capacity ││ Epoch : 1315016309473354 │
│ ││ Difficulty : 30966321 │
│ ││ IBD : false │
│ ││ Tip Block : 48883 => Byte32(0x66fab37fa85bb385522750598a62fabec0af2da5ea919761e1fc9c37913c11ae) │
│ ││ TxPool : pending=0, proposed=0, orphan=0 │
│ ││ Peers : 8 │
│ ││ │
│ ││ │
│ ││ │
│ ││ │
│ ││ │
│ ││ │
│ ││ │
│ ││ │
│ ││ │
└───────────────┘│ │
┌Help───────────┐│ │
│ ││ │
│ Quit : Q ││ │
│ Help : ? ││ │
│ ││ │
└───────────────┘└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
$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: ckb1qyqt9h89me8e2ttugkh9c3xr0872mzda09hqqku8r0
testnet: ckt1qyqt9h89me8e2ttugkh9c3xr0872mzda09hqanzc0n
lock_arg: 0xb2dce5de4f952d7c45ae5c44c379fcad89bd796e
lock_hash: 0xf2bb0bc1a7c41ba1fbc804776bf01d876e0a1b51f655e92f8c5e5700b1d36b11
打开https://faucet.nervos.org/ ,填入你的testnet address,即可领取5000ckb,每三个小时能领取一次
等待上一步领取测试币的交易区块确认(12个区块?),即可查询
$ckb-cli wallet get-capacity --address ckt1qyqt9h89me8e2ttugkh9c3xr0872mzda09hqanzc0n
total: 5000.0 (CKB)
$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: ckb1qyqxqtqcmj6ar2v6x4ep9227xmcd842pcd3skjm2jr
testnet: ckt1qyqxqtqcmj6ar2v6x4ep9227xmcd842pcd3sth947l
lock_arg: 0x602c18dcb5d1a99a357212a95e36f0d3d541c363
lock_hash: 0x8465e5aca5b34daf2764154885e99da78cdd112646c80f1c9cee8d1d93cf1e96
–from-account 指定lock-arg
ckb-cli wallet transfer --from-account 0xb2dce5de4f952d7c45ae5c44c379fcad89bd796e --to-address ckt1qyqxqtqcmj6ar2v6x4ep9227xmcd842pcd3sth947l --capacity 100 --tx-fee 0.1
Password:
0xbf2c81bd89ca7589e95b48d6eec3b8a3feecb82bd6e0323acf283a600e54f083
$ckb-cli rpc get_transaction --hash 0xbf2c81bd89ca7589e95b48d6eec3b8a3feecb82bd6e0323acf283a600e54f083
transaction:
version: 0
cell_deps:
- out_point:
tx_hash: 0xf8de3bb47d055cdf460d93a2a6e1b05f7432f9777c8c474abf4eec1d4aee5d37
index: 0
dep_type: dep_group
header_deps: []
inputs:
- since: 0x0 (absolute block(0))
previous_output:
tx_hash: 0x63ccba3685254e38e604e544fab1f3ba79ddb59a8ddf13bb41a81ee112be5522
index: 0
outputs:
- capacity: "100.0"
lock:
code_hash: 0x9bd7e06f3ecf4be0f2fcd2188b23f1b9fcc88e5d4b65a8637b17723bbda3cce8 (sighash)
args: 0x602c18dcb5d1a99a357212a95e36f0d3d541c363
hash_type: type
type: ~
- capacity: "4899.9"
lock:
code_hash: 0x9bd7e06f3ecf4be0f2fcd2188b23f1b9fcc88e5d4b65a8637b17723bbda3cce8 (sighash)
args: 0xb2dce5de4f952d7c45ae5c44c379fcad89bd796e
hash_type: type
type: ~
outputs_data:
- 0x
- 0x
witnesses:
- 0x5500000010000000550000005500000041000000c8066f434dcdb96d4f4ee36778471649911b7fa15a4d6123d2f1ae99ac209b326560713cf0b00bf64c8685034b8d88d6e8646759383b5d153d2517b1c42f570a00
hash: 0xbf2c81bd89ca7589e95b48d6eec3b8a3feecb82bd6e0323acf283a600e54f083
tx_status:
status: committed
block_hash: 0x3c00035aee191361a3841a56e1cb7a6ab0a26c0059edeb75904af44edd88499e
下面两条命令等价,需要等待区块确认(100个区块?)
也可以在区块链浏览器查询
ckb-cli wallet get-capacity --address ckt1qyqt9h89me8e2ttugkh9c3xr0872mzda09hqanzc0n
ckb-cli wallet get-capacity --lock-hash 0xf2bb0bc1a7c41ba1fbc804776bf01d876e0a1b51f655e92f8c5e5700b1d36b11
–extended-privkey-path 后跟导出的文件位置和文件名
–lock-arg 0x834ae5… 导出 lock-arg 对应值的私钥
$ckb-cli account export --extended-privkey-path wallet --lock-arg 0xb2dce5de4f952d7c45ae5c44c379fcad89bd796e
Password:#输入密码
Success exported account as extended privkey to: "wallet", please use this file carefully
当前目录会生成一个wallet文件,第一行为私钥
$cat wallet
3afde6f941c3196658ca55e3098570cc730b66d97047fa34fb5df8b088d3876a
b2d5cf1ab9d01720163494210595720b7fc25e71df60cd53ef35ee5b2140a316
$ckb-cli util key-info --privkey-path wallet
Put this config in < ckb.toml >:
[block_assembler]
code_hash = "0x9bd7e06f3ecf4be0f2fcd2188b23f1b9fcc88e5d4b65a8637b17723bbda3cce8"
hash_type = "type"
args = "0xb2dce5de4f952d7c45ae5c44c379fcad89bd796e"
message = "0x"
address:
mainnet: ckb1qyqt9h89me8e2ttugkh9c3xr0872mzda09hqqku8r0
testnet: ckt1qyqt9h89me8e2ttugkh9c3xr0872mzda09hqanzc0n
lock_arg: 0xb2dce5de4f952d7c45ae5c44c379fcad89bd796e
lock_hash: 0xf2bb0bc1a7c41ba1fbc804776bf01d876e0a1b51f655e92f8c5e5700b1d36b11
old-testnet-address: ckt1q9gry5zgktwwthj0j5khc3dwt3zvx70u4kym67twlsen7q
pubkey: 02ed6f2b6f20c4711222133a4ff13a753fa00666f7e02449015697f1455364c8c9
ckb-cli account import --privkey-path wallet
主要提供以下功能
视频教程:https://docs.ckb.dev/docs/docs/ide/ide-ckb-studio