天天看點

Nervos CKB初體驗

目錄

    • 介紹
    • 與其他公鍊的差別
    • CKB特性
      • NC Max
      • Cell 模型
      • RISC-V VM
      • 經濟模型
    • 資料結構
    • CKB 程式設計模型
    • 加入測試網絡Aggron
      • 系統環境
      • 下載下傳指令行程式
      • 初始化配置
      • 運作測試鍊
      • 通路測試鍊
    • 加入主網
      • 初始化配置
      • 修改挖礦配置
      • 運作主鍊
      • 開啟挖礦
    • ckb-cli指令行
      • 使用方法
      • 設定rpc url
      • TUI
      • 建立新賬戶
      • 領取測試币
      • 檢視餘額
      • 再建立一個賬戶(接收轉賬)
      • 轉賬
      • 檢視交易
      • 查詢餘額
      • 導出私鑰
      • 檢視公鑰、生成block_assembler
      • 導入私鑰
    • IDE

介紹

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 底層網絡上的存儲空間。

資料結構

Nervos 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目錄下

啟動後會生成資料目錄,并同步測試鍊的資料

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
           

通路測試鍊

加入主網

系統環境,下載下傳指令行程式同上一步測試網絡

初始化配置

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目錄下

開啟挖礦

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

繼續閱讀