社区问答精选——长安链开发知多少?(8月)

本文是根据社群内开发者较为关注的问题进行整理,希望可以帮助开发者解决所遇到的问题。有更多问答在社区issue中描述更为细致,开发者提问前可以先按照关键词进行搜索。欢迎各位开发者按照问答template提交issue,也欢迎有意愿的开发者参与到社区issue版块维护中。

issue问答合集链接复制下面链接到浏览器或点击阅读原文:

https://git.chainmaker.org.cn/chainmaker/issue/-/issues?scope=all&utf8=%E2%9C%93&state=all

1. unknown revision v2.0.0

> go: chainmaker.org/chainmaker/[email protected]+incompatible: reading chainmaker.org/chainmker/pb-go/go.mod at revision v2.0.0: unknown revision v2.0.0

(1)可能chainmaker.org域名可能记录为其他主机地址了,删除 `~/.ssh/known_hosts文件` 重试即可。

(2)可能代理无法访问chainmaker.org,请切换代理尝试`go env -w GOPROXY=https://goproxy.cn,direct`

2. missing go.sum entry

到对应目录执行`go mod download` 或者 `go mod tidy`

3. not found GLIBC_2.18

缺少glibc的库,在linux下可进入:https://git.chainmaker.org.cn/chainmaker/chainmaker-go/-/tree/v1.2.7/scripts/3rd 网站下载`glibc-2.18.tar.gz`和`install.sh`到任一同级目录,文件设置install.sh可执行权限后直接用root权限执行该脚本即可安装 GLIBC_2.18依赖。

sh

# 注:此操作为安装替换GCC版本,请慎重操作。一旦出错系统将不可用。

chmod +x install.sh

sh install.sh

4. restart.sh 权限不足

> ./restart.sh: Permission denied

给脚本添加可执行权限。

sh

cd chainmaker-go/script/bin

chmod +x *.sh

5. syscall/js.valueGet not exported

>执行gasm合约时报错:resolve imports: syscall/js.valueGet not exported in module env

tinygo不支持fmt等函数,tinygo支持的包参考:https://tinygo.org/lang-support/stdlib/

注:官方推荐docker go合约、solidity合约以及Rust合约。

6. runtime type error | byte code validation failed

> 发送交易成功,但链打印错误信息:contract invoke failed, runtime type error, expect rust:[2], but got 4。同时根据该交易id查询到交易错误信息。

> failed to create vm runtime, contract: contract_test, [contract_test], byte code validation failed

执行交易是异步的(查询类交易除外),返回的状态为链成功接收到交易的状态。执行合约时,runtimeType选择错误,需要根据自己的合约语言选择对应的runtimeType。

byte code validation failed:可能原因:1、运行类型错误;2、wasm文件损坏;3、wasm文件非官网指定渠道编译。

| 语言     | 类型                      |

| :------- | ------------------------- |

| 系统合约 | RuntimeType_NATIVE = 1    |

| rust     | RuntimeType_WASMER = 2    |

| c++      | RuntimeType_WXVM = 3      |

| tinygo   | RuntimeType_GASM = 4      |

| solidity | RuntimeType_EVM = 5       |

| golang   | RuntimeType_DOCKER_GO = 6 |

7. 使用sdk、cmc执行安装、调用合约时,SDK 返回message为ok,但链和交易显示执行失败,是什么原因?

交易的执行是异步的。SDK返回的成功信息指的是链成功接收到该交易。

获取查看交易实际结果的方式:

- 根据txId查询该交易,解析出结果。

- 使用SDK时选择同步发送交易,等待执行结果。

8. 出块标记是什么?

>进入log目录,查看日志文件 筛选  `put block` 即可

> `cat system.log|grep "ERROR\|put block"` 

>其中一行解释如下:

>2021-11-04 15:55:06.351 [INFO] [Storage] @chain1 blockstore_impl.go:363 chain[chain1]: put block[1] (txs:1 bytes:15946), time used (mashal:0, log:1, blockdb:0, statedb:0, historydb:0, resultdb:0, contractdb:0, batchChan:0, total:1)

>时间 [日志级别] [模块] @链名称 文件名.go:行数 链chain[链名称]:put block[区块高度](txs:交易个数 bytes:区块大小), 使用时间毫秒(mashal:0, log:1, blockdb:0, statedb:0, historydb:0, resultdb:0, contractdb:0, batchChan:0, total:1)

9. 组网成功标记是什么?

组网成功后,即可发送交易。此时接收到的交易将进入到交易池当中,并且会广播给网络的每一个节点(共识、同步节点、轻节点),随后等待共识成功选举leader开始打包区块。

启动成功日志:`init blockchain[chain1] success` 

多节点时,组网成日志:`all necessary peers connected`

10. 如何查看合约内的日志?

(1) 修改log.yml配置文件将vm的级别调整为debug;

(2) 重启该节点;

(3) 发起交易,即可查看到以后的日志,

如下:

sh

vim chainmaker-v2.2.0-wx-org1.chainmaker.org/config/wx-org1.chainmaker.org/log.yml

log:

  system: # 链日志配置

    log_level_default: INFO # 默认日志级别

    log_levels:

      core: INFO               # 查看commit block落块信息关键字,需将core改为info级别及以下

      net: INFO

      vm: DEBUG              # 合约中的日志,需将vm改为debug级别

      storage: INFO           # sql模式查看sql语句,需将storage改为debug级别

11. 节点的node_id如何生成?

节点的node_id是由其TLS证书的公钥哈希得来,是节点身份的唯一标识。

可使用cmc工具可获取nodeid: ./cmc cert nid -h,是对证书的公钥进行SHA2_256,再base58编码后形成nodeid。

12. 系统提示“x509: certificate signed by unknown authority”,是什么原因?

安装/升级自己服务器的`ca-certificates`。

13. PermissionedWithCert、PermissionedWithKey、Public 模式的区别是什么?

长安链的用户标识体系分为以下两大类:

(1) 基于数字证书的用户标识体系——PermissionedWithCert 即证书模式,为长安链的默认用户标识体系。通常适用于权限控制要求较高的应用场景。

(2) 基于公钥的用户标识体系:

   - PermissionedWithKey,该模式下进行管理操作时需要权限验证,通常适用于权限控制要求较高的应用场景。

   - Public 该模式下进行管理操作时不需要权限验证,通常适用于权限控制要求不高的应用场景。

14. 一条链是否支持同时使用PermissionedWithCert、PermissionedWithKey、Public等多个模式?

暂不支持,某条链只能选择其中一种模式。

15. 长安链的组织证书是用来干嘛的?

长安链的组织证书即是配置trust_root里面的证书,用来验证交易发起者或链参与者是否为该链的联盟成员。trust_root中可以配置组织根证书或组织中间证书。建议使用组织中间证书,以免根证书遗失或不慎泄露造成的不便。

16. 长安链的节点证书是用来干嘛的?

长安链的节点证书分为两类。一类是tls证书,一类是sign证书。tls证书用于跟客户端建立tls链接以及节点间通信。sign证书用于签名验签等,通常在共识投票过程中使用。上述证书均需通过`CA证书` 签发获得。

通过建链脚本生成的节点证书为consensus和common两套,均包括上述tls和sign证书。其中,配置使用的是consensus,而common作为预留。

17. 长安链的用户证书是用来干嘛的?

长安链的用户证书从角色上分为admin、client和light三类。

- admin角色证书,通常称为管理员证书,该证书拥有对系统合约(管理类)调用交易的签名投票权限。链配置中的权限配置项,默认为admin角色。

- client角色证书,通常称为普通用户证书,该证书拥有用户合约(普通类)调用交易和查询类交易的操作权限。

- light角色证书,通常上述每种角色的用户从用途上分为tls和sign两种,的tls证书和sign证书的主要作用是:

- 用户tls证书主要用户跟节点建立tls链接。

- 用户sign证书主要用户签名验签。

18. 如何申请证书?

证书包括

- CA 证书;

- 节点证书:

  -  共识节点的TLS 证书和sign证书;

  -  同步节点的TLS证书和sign证书;

  -  轻节点的TLS证书和sign证书;

- 用户证书:

  - admin 证书的TLS证书和 sign 证书;

  - client 证书的TLS证书和 sign 证书;

以上证书均可以通过 [chainmaker-crypogen](https://docs.chainmaker.org.cn/v2.3.2/html/instructions/证书生成工具.html) 或者[自建 CA 证书服务生成](https://docs.chainmaker.org.cn/v2.3.2/html/dev/CA证书服务.html)。

19. 不同组织间有没有共同的ca,证书的组织和org_id有什么联系?

不同组织间的CA证书可以使用同一个。但是不建议这样做,建议是一个组织一个CA证书。

证书的组织字段和trust_roots的org_id字段,无强制联系。

# 各组织不同CA配置

trust_roots:

  - org_id: "wx-org1.chainmaker.org"

    root: "ca1.crt"

  - org_id: "wx-org2.chainmaker.org"

    root: "ca2.crt"

  - org_id: "wx-org3.chainmaker.org"

    root: "ca3.crt"  

# 各组织相同CA配置

trust_roots:

  - org_id: "wx-org1.chainmaker.org"

    root: "ca1.crt"

  - org_id: "wx-org2.chainmaker.org"

    root: "ca1.crt"

  - org_id: "wx-org3.chainmaker.org"

    root: "ca1.crt"

20. 一个组织的证书申请数量是否有有上限?

理论上没有上限。

21. 组织间的数据能否实现哪些数据可以公开给对方,哪些数据不能公开给对方?

上链数据均共享。可以根据场景需要,采用混合加密、分层身份加密、同态加密、零知识证明等方式保护数据隐私。

22. 是否支持外部证书,外部证书和长安链证书在使用上有什么差异点?

支持外部证书。目前长安链的用户、节点的签名证书(即业务证书)支持使用BJCA、CFCA等国家认可的第三方CA颁发的外部证书。因TLS证书仅作用于通信层,故无需使用外部证书。[外部证书参考](https://docs.chainmaker.org.cn/v2.3.2/html/recovery/外部证书兼容配置手册.html)。

相比长安链证书,外部证书通常无法自定义证书内字段,因此需要进行额外的配置才能使用。

23. TLS怎么开启和关闭?

RPC连接的TLS开启和关闭如下,P2P连接的TLS暂不支持关闭:

参考 chainmaker.yml 的配置rpc的 tls 配置

# RPC TLS settings

  tls:

    # TLS mode, can be disable, oneway, twoway.

    mode:  disable

    # RPC TLS private key file path

    priv_key_file:  ../config/wx-org1.chainmaker.org/certs/node/consensus1/consensus1.tls.key

    # RPC TLS public key file path

    cert_file:      ../config/wx-org1.chainmaker.org/certs/node/consensus1/consensus1.tls.crt

tls 关闭时,mode的值为 disable。

tls 开启时,mode的值可以是 oneway 或 twoway。

- oneway 模式即单向认证,客户端保存着rpc的tls证书并信任该证书即可使用。

- twoway 模式即双向认证,用户企业应用。双向认证模式先决条件是有两个或两个以上的证书,一个是rpc的tls证书,另一个或多个是客户端证书。长安链上保存着客户端的证书并信任该证书,客户端保存着长安链的证书并信任该证书。这样,在证书验证成功时可以完成链的相关操作。

24. 长安链是否支持国密TLS,如果支持,再哪里可以启用?

支持国密。可以在生成tls证书的时候选用国密方式,tls证书接入到长安链上,长安链会根据tls的加密方式匹配到国密的加密方式,无需用户多余的操作。

长安链支持用 chainmaker-cryptogen 工具生成tls证书

需要修改配置 pk_algo: sm2。配置文件参考

yaml

crypto_config:

  - domain: chainmaker.org

    host_name: wx-org

    count: 4   # 如果为1,直接使用host_name,否则添加递增编号

pk_algo: sm2

    ski_hash: sm3

    ## pkcs11配置

[参考文档](https://docs.chainmaker.org.cn/v2.3.2/html/manage/长安链配置管理.html#chainmaker-cryptogen)

你可能感兴趣的:(区块链,智能合约)