长安链使用技巧总结

╰半夏微凉° 2024-05-08 07:09 147阅读 0赞

目录

长安链获取新增节点nodeId方式

长安链区块链浏览器的数据清理

长安链节点还原

长安链evm智能合约调用

长安链TDE透明数据加密源码位置

长安链获取新增节点nodeId方式

节点id用于在新增节点时执行某些cmc命令时带入。节点id是通过证书目录下node/consensus1里边的tls证书。

  1. [root@ljh37231node cmc]# ./cmc cert nid --node-cert-path ./testdata/crypto-config/ljh-org2.qianjinlian.com/node/consensus1/consensus1.tls.crt
  2. node id : Qmcgik9z8Hsbzn2UKetjfPur9t3U5ukdMMTHHLyb3ekTxx

长安链区块链浏览器的数据清理

首先删掉mysql容器

  1. #查看mysql容器
  2. [root@node _data]# docker ps -a|grep mysql
  3. 5ea89d5fd755 mysql:5.7 "docker-entrypoint.s…" 7 minutes ago Exited (0) 2 minutes ago chainmaker-explorer-cm_db-1
  4. #查看mysql容器的挂载目录
  5. [root@ljh37234node _data]# docker inspect chainmaker-explorer-cm_db-1 | grep Mounts -A 20
  6. "Mounts": [
  7. {
  8. "Type": "volume",
  9. "Source": "chainmaker-explorer_explorer_db_data",
  10. "Target": "/var/lib/mysql",
  11. "VolumeOptions": {}
  12. }
  13. ],
  14. "MaskedPaths": [
  15. "/proc/asound",
  16. "/proc/acpi",
  17. "/proc/kcore",
  18. "/proc/keys",
  19. "/proc/latency_stats",
  20. "/proc/timer_list",
  21. "/proc/timer_stats",
  22. "/proc/sched_debug",
  23. "/proc/scsi",
  24. "/sys/firmware"
  25. ],
  26. "ReadonlyPaths": [
  27. --
  28. "Mounts": [
  29. {
  30. "Type": "volume",
  31. "Name": "chainmaker-explorer_explorer_db_data",
  32. "Source": "/var/lib/docker/volumes/chainmaker-explorer_explorer_db_data/_data",
  33. "Destination": "/var/lib/mysql",
  34. "Driver": "local",
  35. "Mode": "z",
  36. "RW": true,
  37. "Propagation": ""
  38. }
  39. ],
  40. "Config": {
  41. "Hostname": "5ea89d5fd755",
  42. "Domainname": "",
  43. "User": "",
  44. "AttachStdin": false,
  45. "AttachStdout": true,
  46. "AttachStderr": true,
  47. "ExposedPorts": {
  48. "3306/tcp": {},

删掉挂载目录/var/lib/docker/volumes/chainmaker-explorer_explorer_db_data/_data下的所有文件。然后重启长安链浏览器即可。

或者使用如下命令停止浏览器后再重启也可以。

  1. docker-compose down -v

长安链节点还原

可将各节点配置文件中的data目录(如:/chainmaker-go/build/release/chainmaker-v2.2.1-ljh-org1.qianjinlian.com/data和log)删除后重启即可。如果采用的是mysql数据库,则还需将所有数据库的表删除。

长安链evm智能合约调用

长安链支持Solidity语言的智能合约,合约中经常会遇到

  1. msg.sender

如示例Token.sol智能合约中的构造方法和转账方法

  1. constructor (address _addressFounder) {
  2. owner = msg.sender;
  3. totalSupply = valueFounder;
  4. balanceOf[_addressFounder] = valueFounder;
  5. emit Transfer(address(0x0), _addressFounder, valueFounder);
  6. }
  7. function transfer(address _to, uint256 _value) public isRunning validAddress returns (bool success) {
  8. require(balanceOf[msg.sender] >= _value);
  9. require(balanceOf[_to] + _value >= balanceOf[_to]);
  10. balanceOf[msg.sender] -= _value;
  11. balanceOf[_to] += _value;
  12. emit Transfer(msg.sender, _to, _value);
  13. return true;
  14. }

此时就需要在使用sdk发起合约调用时,关注sender是谁?不然很容易出现下述调用失败的提示语。

  1. revert instruction was encountered during execution

在长安链的SDK源码中,sender是由用户的CA证书生成的,详见ChanClient.java类,方法如下:

  1. private TxRequest createTxRequest(Payload payload, EndorsementEntry[] endorsementEntries) throws ChainMakerCryptoSuiteException {
  2. Member sender;
  3. org.chainmaker.pb.common.Request.EndorsementEntry.Builder endorsementEntryBuilder;
  4. if (this.clientUser.getAuthType().equals(AuthType.PermissionedWithCert.getMsg())) {
  5. if (this.isEnabledCertHash && this.clientUser.getCertHash() != null && this.clientUser.getCertHash().length > 0) {
  6. sender = Member.newBuilder().setOrgId(this.clientUser.getOrgId()).setMemberInfo(ByteString.copyFrom(this.clientUser.getCertHash())).setMemberType(MemberType.CERT_HASH).build();
  7. } else if (this.isEnabledAlias && this.clientUser.getAlias() != null && this.clientUser.getAlias().length() > 0) {
  8. sender = Member.newBuilder().setOrgId(this.clientUser.getOrgId()).setMemberInfo(ByteString.copyFrom(this.clientUser.getAlias().getBytes())).setMemberType(MemberType.ALIAS).build();
  9. } else {
  10. sender = Member.newBuilder().setOrgId(this.clientUser.getOrgId()).setMemberInfo(ByteString.copyFrom(this.clientUser.getCertBytes())).setMemberType(MemberType.CERT).build();
  11. }
  12. endorsementEntryBuilder = EndorsementEntry.newBuilder().setSigner(sender).setSignature(ByteString.copyFrom(this.clientUser.getCryptoSuite().sign(this.clientUser.getPrivateKey(), payload.toByteArray())));
  13. } else {
  14. sender = Member.newBuilder().setOrgId(this.clientUser.getOrgId()).setMemberInfo(ByteString.copyFrom(this.clientUser.getPukBytes())).setMemberType(MemberType.PUBLIC_KEY).build();
  15. endorsementEntryBuilder = EndorsementEntry.newBuilder().setSigner(sender).setSignature(ByteString.copyFrom(this.clientUser.getCryptoSuite().rsaSign(this.clientUser.getPrivateKey(), payload.toByteArray())));
  16. }
  17. org.chainmaker.pb.common.Request.TxRequest.Builder txRequestBuilder = TxRequest.newBuilder().setPayload(payload).setSender(endorsementEntryBuilder);
  18. if (endorsementEntries != null) {
  19. txRequestBuilder.addAllEndorsers(Arrays.asList((Object[])endorsementEntries.clone()));
  20. }
  21. return txRequestBuilder.build();
  22. }

在了解源码后,在调用合约时就需要注意,发起交易的address是否正确,不然要么得不到正确的结果,要么就是交易执行失败。

长安链TDE透明数据加密源码位置

kv类数据库源码参考:chainmaker\store-leveldb\v2@v2.2.1\leveldb_handle.go

sql类数据库源码参考:chainmaker\store-sqldb\v2@v2.2.1\rawsqlprovider_kv.go

配置及启动同步节点

1、配置及启动新增同步节点操作(common2)

  1. 1. 复制部署包
  2. $ cd build/release
  3. $ cp -rf chainmaker-v2.0.0-wx-org1.chainmaker.org chainmaker-v2.0.0-wx-org1.chainmaker.org_common2
  4. 2. chainmaker-v2.0.0-wx-org1.chainmaker.org_common2/bin下所有的.sh脚本中所有wx-org1.chainmaker.org替换为wx-org1.chainmaker.org_common2
  5. 3. 重命名
  6. $ cd build/release/chainmaker-v2.0.0-wx-org1.chainmaker.org_common2/config
  7. $ mv wx-org1.chainmaker.org wx-org1.chainmaker.org_common2
  8. 4. 拷贝chainmaker-cryptogen扩展生成的crypto-config/wx-org1.chainmaker.org/node/common2 chainmaker-v2.0.0-wx-org1.chainmaker.org_common2/config/wx-org1.chainmaker.org_common2/certs/node
  9. 5. 修改chainmaker.yml
  10. chainmaker-v2.0.0-wx-org1.chainmaker.org_common2/config/wx-org1.chainmaker.org_common2/chainmaker.yml中所有路径中包含的wx-org1.chainmaker.org替换为wx-org1.chainmaker.org_common2
  11. 此处需要注意不要把org_id: wx-org1.chainmaker.org改了
  12. 修改node模块,把 certs/node/consensus1/consensus1.sign.key 修改为 certs/node/common2/common2.sign.key
  13. 修改node模块,把 certs/node/consensus1/consensus1.sign.crt 修改为 certs/node/common2/common2.sign.crt
  14. 修改net模块,把 certs/node/consensus1/consensus1.tls.key 修改为 certs/node/common2/common2.tls.key
  15. 修改net模块,把 certs/node/consensus1/consensus1.tls.crt 修改为 certs/node/common2/common2.tls.crt
  16. 修改net模块,把 listen_addr: /ip4/0.0.0.0/tcp/11301 修改为 listen_addr: /ip4/0.0.0.0/tcp/11306
  17. 修改rpc模块,把 port: 12301 修改为 port: 12306
  18. 修改monitor模块,把 port: 14321 修改为 port: 14326
  19. 修改pprof模块,把 port: 24321 修改为 port: 24326
  20. 6. 修改chainmaker-v2.0.0-wx-org1.chainmaker.org_common2/config/wx-org1.chainmaker.org_common2/chainconfig/bc1.yml中的trust_roots模块。
  21. 把所有 ../config/wx-org1.chainmaker.org 修改为 ../config/wx-org1.chainmaker.org_common2
  22. 7. 启动节点
  23. $ cd build/release/chainmaker-v2.0.0-wx-org1.chainmaker.org_common2/bin
  24. $ ./start.sh
  25. 8. End

1、配置及启动已有同步节点操作(common1)

在使用prepare.sh生成的材料包中默认就有1个同步节点的证书材料。

  1. 1. 复制部署包
  2. $ cd build/release
  3. $ cp -rf chainmaker-v2.0.0-wx-org1.chainmaker.org chainmaker-v2.0.0-wx-org1.chainmaker.org_common1
  4. 2. chainmaker-v2.0.0-wx-org1.chainmaker.org_common1/bin下所有的.sh脚本中所有wx-org1.chainmaker.org替换为wx-org1.chainmaker.org_common1
  5. 3. 重命名
  6. $ cd build/release/chainmaker-v2.0.0-wx-org1.chainmaker.org_common1/config
  7. $ mv wx-org1.chainmaker.org wx-org1.chainmaker.org_common1
  8. 4. 修改chainmaker.yml
  9. chainmaker-v2.0.0-wx-org1.chainmaker.org_common1/config/wx-org1.chainmaker.org_common1/chainmaker.yml中所有路径中包含的wx-org1.chainmaker.org替换为wx-org1.chainmaker.org_common1
  10. 此处需要注意不要把org_id: wx-org1.chainmaker.org改了
  11. 修改node模块,把 certs/node/consensus1/consensus1.sign.key 修改为 certs/node/common1/common1.sign.key
  12. 修改node模块,把 certs/node/consensus1/consensus1.sign.crt 修改为 certs/node/common1/common1.sign.crt
  13. 修改net模块,把 certs/node/consensus1/consensus1.tls.key 修改为 certs/node/common1/common1.tls.key
  14. 修改net模块,把 certs/node/consensus1/consensus1.tls.crt 修改为 certs/node/common1/common1.tls.crt
  15. 修改net模块,把 listen_addr: /ip4/0.0.0.0/tcp/11301 修改为 listen_addr: /ip4/0.0.0.0/tcp/11306
  16. 修改rpc模块,把 port: 12301 修改为 port: 12306
  17. 修改monitor模块,把 port: 14321 修改为 port: 14326
  18. 修改pprof模块,把 port: 24321 修改为 port: 24326
  19. 5. 修改chainmaker-v2.0.0-wx-org1.chainmaker.org_common1/config/wx-org1.chainmaker.org_common1/chainconfig/bc1.yml中的trust_roots模块。
  20. 把所有 ../config/wx-org1.chainmaker.org 修改为 ../config/wx-org1.chainmaker.org_common1
  21. 6. 启动节点
  22. $ cd build/release/chainmaker-v2.0.0-wx-org1.chainmaker.org_common1/bin
  23. $ ./start.sh
  24. 7. End

两种方式都需要注意不要把org_id: wx-org1.chainmaker.org改了,在使用上边的替换时很容易就把wx-org1.chainmaker.org改成wx-org1.chainmaker.org_common1。如果改成这样启动时会报错。

  1. 2022-07-28 19:39:13.161 [ERROR] [Blockchain] @chain1 blockchain/blockchain_init.go:487 initialize identity failed, fail to initialize identity management service: [setup cert member failed, organization information in certificate and in input parameter do not match [certificate: wx-org1.chainmaker.org, parameter: wx-org1.chainmaker.org_common1]]

发表评论

表情:
评论列表 (有 0 条评论,147人围观)

还没有评论,来说两句吧...

相关阅读