目录
介绍
Nervos 是一个旨在满足去中心化经济需求的分层网络
。Layer 1 协议 CKB(Common Knowledge Base 共同知识库)是整个网络的价值存储层,Layer 2 协议在 Layer 1 区块链上提供了无限的可扩展性。
Nervos 网络 = 坚持安全和去中心化的 CKB + 百花齐放的 Layer2
与其他公链的区别
- 比特币作为一个单一的可编程资产,在 Nervos CKB 上,所有的用户自定义代币(UDT)都可以和原生代币(CKB)都可以通过图灵完备的脚本进行编程,Nervos CKB 是一个多资产可编程的底层智能合约平台。
- CKB 并没有采用账户模型,而是
采用了和比特币一样的 UTXO 模型
,并基于 UTXO 设计了一套新的编程模型 —— cell 模型。 - 以太坊不同:
以太坊采用的是链上计算,链上验证的模式,而 CKB 采用的是链下计算,链上验证的设计思路
。
CKB特性
NC Max
比特币的中本聪共识(Nakamoto Consensus,简称 NC)的变体,命名为 NC Max,在保留 NC 优点的同时,提升了其性能极限和抵抗自私挖矿攻击的能力
Cell 模型
Nervos CKB 采用的是一种称为 cell 模型的通用的 UTXO 模型,通过 cell 模型来进行原生代币(CKB)和用户自定义代币(UDT)的描述和编程
RISC-V VM
CKB VM 是为 CKB 设计的基于开源 RISC-V 指令集的虚拟机。通过 CKB VM,任意一种可以编译成 RISC-V 二进制代码的语言都可以用来当作 CKB 的编程语言
,比如 C/C++,比如 JavaScript/Ruby/Rust 等等
经济模型
在 Nervos CKB 中,CKB 不仅仅是底层网络的原生代币,还代表了状态存储的权限,你持有 1 个 CKB 就拥有了 1 Byte 在 CKB 底层网络上的存储空间。
数据结构
CKB 编程模型
CKB 中的状态是一等公民(First-Class Citizen),状态包含在交易和区块中,它们直接同步在节点之间。CKB 的编程模型由三部分组成:
- 状态生成(链下)
- 状态存储(Cell 模型)
- 状态验证(CKB VM)
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>,
}
- capacity 定义 cell 容量的大小(用 shannons 表示,1 CKB = 100,000,000 shannons)
- data 用于存储数据(包括状态数据、脚本数据等)
- type script 定义 cell 类型的脚本
- lock script 定义 cell 所有权的脚本
lock 管死,type 管生。lock 负责 tx 中 input cells 的验证,type 负责 output cells 的验证。type 负责的是不能随意创建有某个 type 的 cell 出来,反过来的话,如果 cell 的 type 是 X,那 cell 一定通过了 X 的验证。
加入测试网络Aggron
系统环境
- centos7.6
- glibc, libstdc++, openssl
下载命令行程序
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 &
ckb-cli命令行
使用方法
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
在执行一些命令时,会从设定的 rpc url 中获得数据,如要连接到其他服务端请修改API_URL环境变量,默认值如下
export API_URL=http://127.0.0.1:8114
TUI
终端里的图形化界面,需在链启动后使用
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
查看公钥、生成block_assembler
$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
IDE
主要提供以下功能
- 搭建本地开发网络、连接测试网络、主网
- 简易的区块浏览器
- Tx 构造器
- 智能合约开发、部署
- 私钥、公钥管理
视频教程:https://docs.ckb.dev/docs/docs/ide/ide-ckb-studio
来源:oschina
链接:https://my.oschina.net/u/4321917/blog/4301584