DMC模塊

實例屬性

類型:String

1
var chain = require('chain');

data_dir

dmc 的數據存放目錄

類型:String

1
chain.data_dir = 'dmc_data_dir';

config_dir

dmc 的配置存放目錄

類型:String

1
chain.config_dir = 'dmc_config_dir';

log_level

chain 的鏈日誌輸出級別,可選的值為 “all”, “debug”, “info”, “warn”, “error”, “off”

類型:String

1
chain.logger = 'all'

pubkey_prefix

dmc 公鑰前綴

類型:String

1
chain.pubkey_prefix = 'DM';

post

向節點發送請求, resource 指定請求的資源,body 指定請求的數據

類型:String

1
chain.post(String resource, String body = "") async;

實例方法

load

加載 load 本身配置

1
2
3
4
5
chain.load("chain", {
"delete-all-blocks": true,
'chain-state-db-size-mb': 8 * 1024,
'genesis-json': 'genesis.json'
});

參數說明:

加載系統 plugin 及其配置

1
dmc.load( name, cfg );

參數說明:

start

啟動 dmc

1
chain.start();

stop

停止 dmc

1
chain.stop();

系統 plugin

注意:系統 plugin 請配合 dmc.load 實例方法進行使用

http 插件

啟用 DMC 節點上所有的 RPC API

配置說明:

配置名稱 配置含義 默認值 參考值
unix-socket-path 為HTTP RPC創建unix套接字的文件名(相對於數據目錄);設置空白以禁用 - -
http-server-address 本地 http 服務地址 0.0.0.0:8870 -
https-server-address 本地 https 服務地址 - -
https-certificate-chain-file https 需要包含要在https連接上顯示的證書鏈的文件名PEM格式 - -
https-private-key-file https 需要PEM格式的具有https私鑰的文件名 - -
https-ecdh-curve 配置 https ECDH曲線以使用:secp384r1或prime256v1 secp384r1 -
access-control-allow-origin 指定每個請求返回的訪問控制允許源。 - -
access-control-allow-headers 指定每個請求返回的訪問控制允許標頭。 - -
access-control-max-age 指定每個請求要返回的訪問控制最大期限。 - -
access-control-allow-credentials 指定每個請求是否應返回Access Control Allow Credentials:true - -
max-body-size RPC 請求允許最大字節 1048576 -
http-max-bytes-in-flight-mb http_plugin用於處理http請求的最大大小(MB) 500 -
http-max-in-flight-requests http_plugin用於處理http請求的最大請求數 -1 -
http-max-response-time-ms 處理請求的最長時間。 30 -
verbose-http-errors 顯示 Http 返回的錯誤日誌 - -
http-validate-host 驗證 Http 請求 host 1 -
http-alias 可以多次指定傳入HTTP請求的“主機”標頭的其他可接受值。 - -
http-threads http線程池中的工作線程數 2 -

chain 插件

是 DMC 節點上處理和聚合鏈數據所需的核心插件

配置說明:

配置名稱 配置含義 默認值 參考值
genesis-json 指定創世塊數據路徑 genesis.json -
genesis-timestamp 覆蓋創世塊中的初試時間戳 - -
print-genesis-json 是否打印創世數據 false -
extract-genesis-json 從blocks.log中提取genesis_state作為JSON,寫入指定文件,然後退出 - -
fix-reversible-blocks 是否將數據恢復到不可逆高度 - -
force-all-checks 在重放不可逆塊時,不要跳過任何可以跳過的檢查 - -
disable-replay-opts 禁用專門針對重播的優化 - -
replay-blockchain 是否清除狀態數據然後回滾所有數據 - -
hard-replay-blockchain 是否清除狀態數據, 然後從區塊日誌中回滾儘可能多的數據 - -
delete-all-blocks 是否刪除所有的狀態數據和區塊數據 - -
truncate-at-block 停止出塊, 並在該區塊高度回滾 0 -
import-reversible-blocks 用從指定文件導入的塊替換可逆塊數據庫,然後退出 - -
export-reversible-blocks 將可移植格式的可逆塊數據庫導出到指定文件中,然後退出 - -
snapshot 要從中讀取快照狀態的文件 - -

net 插件

組成一個網絡

配置說明:

配置名稱 配置含義 默認值 參考值
p2p-listen-endpoint 監聽 p2p 連接的地址和端口 0.0.0.0:9876 -
p2p-server-addrsss 提供給其它節點 p2p 服務地址 p2p-listen-endpoint -
p2p-peer-address 公共的 p2p 對等節點地址 - DMC TestNet [ ]
p2p-max-nodes-per-host 單個 IP 能夠連接的最大客戶端數量 10 -
p2p-accept-transactions 允許通過p2p網絡接收的交易被評估和轉發。 1 -
p2p-reject-incomplete-blocks 即使在輕度驗證中也拒絕修剪的簽名塊 1 -
agent-name 提供的用於標識此節點的名稱 DM Test Agent -
allowed-connection 允許連接 any ‘any’/‘producers’/‘specified’/‘none’。如果 ‘specified’ ,則必須至少指定一次對等密鑰。如果只有 ‘producers’ ,則不需要對等密鑰。
peer-key 允許連接的對等方的可選公鑰。可多次使用。 - -
max-clients 接受連接的最大客戶端數,使用0表示無限制 25 -
connection-cleanup-period 清理死連接之前等待的秒數 30 -
max-cleanup-time-msec 每次清理調用的最大連接清理時間(毫秒) 10 -
net-threads 線程池中的工作線程數 2 -
sync-fetch-span 同步期間從任何單個對等方檢索塊的塊數 100 -
use-socket-read-watermark 啟用實驗性套接字讀取水印優化 0 -
peer-log-format 記錄對等方消息時用於格式化對等方的字符串。變量用${<variable name>}轉義。 =[“${_name}” ${_ip}:${_port}] -
p2p-keepalive-interval-ms 對等心跳保持活動消息間隔(毫秒) 32000 -
p2p-tls-security-group-ca-file 啟用安全組功能時用於驗證對等TLS連接的證書頒發機構的證書文件 - -
p2p-tls-own-certificate-file 如果啟用TLS,將用於驗證運行節點的證書文件 - -
p2p-tls-private-key-file p2p tls私鑰文件+p2p tsl自己的證書文件一起自動為對等方啟用僅tls連接。 - -

producer插件

加載出塊節點所需要的功能

配置說明:

配置名稱 配置含義 默認值 參考值
max-transaction-time 事務最大超時時間 30(s) -
max-irreversible-block-age 最大的不可逆塊時間 - -
private-key 簽名程序的公鑰、私鑰 - (可多參數)
signature-provider 簽名提供程序 - -
greylist-account 無法使用 CPU 和 NET 的賬號 - -
greylist-limit CPU/NET虛擬資源的倍數限制 1000 1-1000
produce-time-offset-us 非最後一個塊產生時間的偏移 0 -
last-block-time-offset-us 最後一個塊產生時間的偏移 -200000 -
cpu-effort-percent 用於生成塊的cpu塊生成時間的百分比 80 -
last-block-cpu-effort-percent 用於生成最後一個塊的cpu塊生成時間的百分比 80 -
max-block-cpu-usage-threshold-us 考慮區塊已滿的 CPU 區塊生產閾值 5000 -
max-block-net-usage-threshold-bytes 考慮區塊已滿的 NET 區塊生產閾值 1024 -
max-scheduled-transaction-time-per-block-ms 計劃的最長掛鐘時間 100 -
subjective-cpu-leeway-us 在CPU配額不足的情況下開始的事務所允許的時間 31000 -
incoming-defer-ratio 傳入事務和延遲事務在排隊等待執行時的比率 1 -
incoming-transaction-queue-size-mb 傳入事務隊列的最大大小 1024 -
disable-api-persisted-trx 禁用API事務的重新應用 - -
disable-subjective-billing 禁用 API/P2P 事務的主觀 CPU 計費 1 -
disable-subjective-account-billing 從主觀 CPU 計費中排除的帳戶 - -
disable-subjective-p2p-billing 禁用 P2P 事務的主觀 CPU 計費 1 -
disable-subjective-api-billing 禁用 API 事務的主觀 CPU 計費 1 -
producer-threads 生產者線程池中的工作線程數 2 -
snapshots-dir 快照目錄的位置 snapshots -

trace_api 插件

以消費者為中心的長期 API,用於從指定的塊中檢索退役操作和相關元數據。該插件將序列化的塊跟蹤數據存儲到文件系統中,以便以後通過 HTTP RPC請求進行檢索。

配置說明:

配置名稱 配置含義 默認值 參考值
trace-dir 跟蹤目錄的位置 traces -
trace-slice-stride 每個“切片”的塊數 10000 -
trace-minimum-irreversible-history-blocks 確保保留的塊數 -1 -
trace-minimum-uncompressed-irreversible-history-blocks 確保經過 LIB 壓縮的塊數 -1 -
trace-rpc-abi 解碼跟蹤 RPC 響應時使用的ABI。 - -
trace-no-abis 用於指示 RPC 響應 true -

實例

bp節點

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
var chain = require('chain');
var config = require('../config.json');
var accounts = require('./bpaccounts.json');
console.notice("start first chain producer node");
var _config = require('./config.json');

var producer = accounts[0];

var producername = producer.account;
var public_key = producer.public_key;
var private_key = producer.private_key;

chain.pubkey_prefix = _config.pub_key_prefix;
chain.config_dir = _config.bp_dir + "/" + producername;
chain.data_dir = _config.bp_dir + "/" + producername;

console.notice("config_dir:", chain.config_dir);
console.notice("data_dir:", chain.data_dir);

chain.load("http", {
"http-server-address": "0.0.0.0:8801",
"access-control-allow-origin": "*",
"http-validate-host": false,
"verbose-http-errors": true //打開報錯
});

chain.load("net", {
"p2p-peer-address": config["bios_p2p_peer_address"],
"max-clients": 100,
"p2p-listen-endpoint": "0.0.0.0:9801",
"p2p-max-nodes-per-host": 10,
});

chain.load("producer", {
'producer-name': producername,
'enable-stale-production': true,
'max-transaction-time': 3000,
'incoming-transaction-queue-size-mb': 14095,
'private-key': JSON.stringify([public_key, private_key])
});


chain.load("chain", {
"contracts-console": true,
'chain-state-db-size-mb': 8 * 1024,
"delete-all-blocks": true,
"genesis-json": "genesis.json"
});

chain.load("chain_api");
chain.load("trace_api", {
"trace-no-abis": "true"
});
chain.start();

同步節點

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
var chain = require('chain');
var fs = require("fs");
var process = require('process');
var producer = process.argv;
var producername = producer[2];
var public_key = producer[3];
var private_key = producer[4];
var http = producer[5];
var p2p = producer[6];

var _config = require('../common/config.json');

chain.config_dir = _config.bp_dir + "/" + producername;
chain.data_dir = _config.bp_dir + "/" + producername;
chain.pubkey_prefix = _config.pub_key_prefix;
console.notice("producer===>", producer)
console.notice("start CHAIN producer node:", producername, 'http:', http, 'p2p:', p2p);

console.notice("config_dir:", chain.config_dir);
console.notice("data_dir:", chain.data_dir);

let chain_config = {
"contracts-console": true,
'chain-state-db-size-mb': 8 * 1024,
"delete-all-blocks": true
};

if (!fs.exists(chain.data_dir) && !fs.exists(chain.config_dir)) {
chain_config['genesis-json'] = "genesis.json";
}

chain.load("http", {
"http-server-address": "0.0.0.0:" + http,
"access-control-allow-origin": "*",
"http-validate-host": false,
"verbose-http-errors": true
});

chain.load("net", {
"p2p-peer-address": _config["p2p_peer_address"],
"max-clients": 100,
"p2p-listen-endpoint": "0.0.0.0:" + p2p,
"p2p-max-nodes-per-host": 25
});

chain.load("producer", {
'producer-name': producername,
'enable-stale-production': true,
'max-transaction-time': 3000,
'private-key': JSON.stringify([public_key, private_key])
});


chain.load("chain", chain_config);

chain.load("chain_api");

chain.start();

genesis.json 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
"initial_timestamp": "2023-01-10T00:00:00.000",
"initial_key": "DM6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV",
"initial_configuration": {
"max_block_net_usage": 1048576,
"target_block_net_usage_pct": 1000,
"max_transaction_net_usage": 524288,
"base_per_transaction_net_usage": 12,
"net_usage_leeway": 500,
"context_free_discount_net_usage_num": 20,
"context_free_discount_net_usage_den": 100,
"max_block_cpu_usage": 200000,
"target_block_cpu_usage_pct": 1000,
"max_transaction_cpu_usage": 150000,
"min_transaction_cpu_usage": 100,
"max_transaction_lifetime": 3600,
"deferred_trx_expiration_window": 600,
"max_transaction_delay": 3888000,
"max_inline_action_size": 4096,
"max_inline_action_depth": 4,
"max_authority_depth": 6
}
}