Nervos CKB初体验

徘徊边缘 提交于 2020-08-18 06:49:14

介绍

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!