长安链使用技巧总结
目录
长安链获取新增节点nodeId方式
长安链区块链浏览器的数据清理
长安链节点还原
长安链evm智能合约调用
长安链TDE透明数据加密源码位置
长安链获取新增节点nodeId方式
节点id用于在新增节点时执行某些cmc命令时带入。节点id是通过证书目录下node/consensus1里边的tls证书。
[root@ljh37231node cmc]# ./cmc cert nid --node-cert-path ./testdata/crypto-config/ljh-org2.qianjinlian.com/node/consensus1/consensus1.tls.crt
node id : Qmcgik9z8Hsbzn2UKetjfPur9t3U5ukdMMTHHLyb3ekTxx
长安链区块链浏览器的数据清理
首先删掉mysql容器
#查看mysql容器
[root@node _data]# docker ps -a|grep mysql
5ea89d5fd755 mysql:5.7 "docker-entrypoint.s…" 7 minutes ago Exited (0) 2 minutes ago chainmaker-explorer-cm_db-1
#查看mysql容器的挂载目录
[root@ljh37234node _data]# docker inspect chainmaker-explorer-cm_db-1 | grep Mounts -A 20
"Mounts": [
{
"Type": "volume",
"Source": "chainmaker-explorer_explorer_db_data",
"Target": "/var/lib/mysql",
"VolumeOptions": {}
}
],
"MaskedPaths": [
"/proc/asound",
"/proc/acpi",
"/proc/kcore",
"/proc/keys",
"/proc/latency_stats",
"/proc/timer_list",
"/proc/timer_stats",
"/proc/sched_debug",
"/proc/scsi",
"/sys/firmware"
],
"ReadonlyPaths": [
--
"Mounts": [
{
"Type": "volume",
"Name": "chainmaker-explorer_explorer_db_data",
"Source": "/var/lib/docker/volumes/chainmaker-explorer_explorer_db_data/_data",
"Destination": "/var/lib/mysql",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],
"Config": {
"Hostname": "5ea89d5fd755",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": true,
"AttachStderr": true,
"ExposedPorts": {
"3306/tcp": {},
删掉挂载目录/var/lib/docker/volumes/chainmaker-explorer_explorer_db_data/_data下的所有文件。然后重启长安链浏览器即可。
或者使用如下命令停止浏览器后再重启也可以。
docker-compose down -v
长安链节点还原
可将各节点配置文件中的data目录(如:/chainmaker-go/build/release/chainmaker-v2.2.1-ljh-org1.qianjinlian.com/data和log)删除后重启即可。如果采用的是mysql数据库,则还需将所有数据库的表删除。
长安链evm智能合约调用
长安链支持Solidity语言的智能合约,合约中经常会遇到
msg.sender
如示例Token.sol智能合约中的构造方法和转账方法
constructor (address _addressFounder) {
owner = msg.sender;
totalSupply = valueFounder;
balanceOf[_addressFounder] = valueFounder;
emit Transfer(address(0x0), _addressFounder, valueFounder);
}
function transfer(address _to, uint256 _value) public isRunning validAddress returns (bool success) {
require(balanceOf[msg.sender] >= _value);
require(balanceOf[_to] + _value >= balanceOf[_to]);
balanceOf[msg.sender] -= _value;
balanceOf[_to] += _value;
emit Transfer(msg.sender, _to, _value);
return true;
}
此时就需要在使用sdk发起合约调用时,关注sender是谁?不然很容易出现下述调用失败的提示语。
revert instruction was encountered during execution
在长安链的SDK源码中,sender是由用户的CA证书生成的,详见ChanClient.java类,方法如下:
private TxRequest createTxRequest(Payload payload, EndorsementEntry[] endorsementEntries) throws ChainMakerCryptoSuiteException {
Member sender;
org.chainmaker.pb.common.Request.EndorsementEntry.Builder endorsementEntryBuilder;
if (this.clientUser.getAuthType().equals(AuthType.PermissionedWithCert.getMsg())) {
if (this.isEnabledCertHash && this.clientUser.getCertHash() != null && this.clientUser.getCertHash().length > 0) {
sender = Member.newBuilder().setOrgId(this.clientUser.getOrgId()).setMemberInfo(ByteString.copyFrom(this.clientUser.getCertHash())).setMemberType(MemberType.CERT_HASH).build();
} else if (this.isEnabledAlias && this.clientUser.getAlias() != null && this.clientUser.getAlias().length() > 0) {
sender = Member.newBuilder().setOrgId(this.clientUser.getOrgId()).setMemberInfo(ByteString.copyFrom(this.clientUser.getAlias().getBytes())).setMemberType(MemberType.ALIAS).build();
} else {
sender = Member.newBuilder().setOrgId(this.clientUser.getOrgId()).setMemberInfo(ByteString.copyFrom(this.clientUser.getCertBytes())).setMemberType(MemberType.CERT).build();
}
endorsementEntryBuilder = EndorsementEntry.newBuilder().setSigner(sender).setSignature(ByteString.copyFrom(this.clientUser.getCryptoSuite().sign(this.clientUser.getPrivateKey(), payload.toByteArray())));
} else {
sender = Member.newBuilder().setOrgId(this.clientUser.getOrgId()).setMemberInfo(ByteString.copyFrom(this.clientUser.getPukBytes())).setMemberType(MemberType.PUBLIC_KEY).build();
endorsementEntryBuilder = EndorsementEntry.newBuilder().setSigner(sender).setSignature(ByteString.copyFrom(this.clientUser.getCryptoSuite().rsaSign(this.clientUser.getPrivateKey(), payload.toByteArray())));
}
org.chainmaker.pb.common.Request.TxRequest.Builder txRequestBuilder = TxRequest.newBuilder().setPayload(payload).setSender(endorsementEntryBuilder);
if (endorsementEntries != null) {
txRequestBuilder.addAllEndorsers(Arrays.asList((Object[])endorsementEntries.clone()));
}
return txRequestBuilder.build();
}
在了解源码后,在调用合约时就需要注意,发起交易的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. 复制部署包
$ cd build/release
$ cp -rf chainmaker-v2.0.0-wx-org1.chainmaker.org chainmaker-v2.0.0-wx-org1.chainmaker.org_common2
2. 把chainmaker-v2.0.0-wx-org1.chainmaker.org_common2/bin下所有的.sh脚本中所有wx-org1.chainmaker.org替换为wx-org1.chainmaker.org_common2
3. 重命名
$ cd build/release/chainmaker-v2.0.0-wx-org1.chainmaker.org_common2/config
$ mv wx-org1.chainmaker.org wx-org1.chainmaker.org_common2
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下
5. 修改chainmaker.yml
把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
此处需要注意不要把org_id: wx-org1.chainmaker.org改了
修改node模块,把 certs/node/consensus1/consensus1.sign.key 修改为 certs/node/common2/common2.sign.key
修改node模块,把 certs/node/consensus1/consensus1.sign.crt 修改为 certs/node/common2/common2.sign.crt
修改net模块,把 certs/node/consensus1/consensus1.tls.key 修改为 certs/node/common2/common2.tls.key
修改net模块,把 certs/node/consensus1/consensus1.tls.crt 修改为 certs/node/common2/common2.tls.crt
修改net模块,把 listen_addr: /ip4/0.0.0.0/tcp/11301 修改为 listen_addr: /ip4/0.0.0.0/tcp/11306
修改rpc模块,把 port: 12301 修改为 port: 12306
修改monitor模块,把 port: 14321 修改为 port: 14326
修改pprof模块,把 port: 24321 修改为 port: 24326
6. 修改chainmaker-v2.0.0-wx-org1.chainmaker.org_common2/config/wx-org1.chainmaker.org_common2/chainconfig/bc1.yml中的trust_roots模块。
把所有 ../config/wx-org1.chainmaker.org 修改为 ../config/wx-org1.chainmaker.org_common2
7. 启动节点
$ cd build/release/chainmaker-v2.0.0-wx-org1.chainmaker.org_common2/bin
$ ./start.sh
8. End
1、配置及启动已有同步节点操作(common1)
在使用prepare.sh生成的材料包中默认就有1个同步节点的证书材料。
1. 复制部署包
$ cd build/release
$ cp -rf chainmaker-v2.0.0-wx-org1.chainmaker.org chainmaker-v2.0.0-wx-org1.chainmaker.org_common1
2. 把chainmaker-v2.0.0-wx-org1.chainmaker.org_common1/bin下所有的.sh脚本中所有wx-org1.chainmaker.org替换为wx-org1.chainmaker.org_common1
3. 重命名
$ cd build/release/chainmaker-v2.0.0-wx-org1.chainmaker.org_common1/config
$ mv wx-org1.chainmaker.org wx-org1.chainmaker.org_common1
4. 修改chainmaker.yml
把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
此处需要注意不要把org_id: wx-org1.chainmaker.org改了
修改node模块,把 certs/node/consensus1/consensus1.sign.key 修改为 certs/node/common1/common1.sign.key
修改node模块,把 certs/node/consensus1/consensus1.sign.crt 修改为 certs/node/common1/common1.sign.crt
修改net模块,把 certs/node/consensus1/consensus1.tls.key 修改为 certs/node/common1/common1.tls.key
修改net模块,把 certs/node/consensus1/consensus1.tls.crt 修改为 certs/node/common1/common1.tls.crt
修改net模块,把 listen_addr: /ip4/0.0.0.0/tcp/11301 修改为 listen_addr: /ip4/0.0.0.0/tcp/11306
修改rpc模块,把 port: 12301 修改为 port: 12306
修改monitor模块,把 port: 14321 修改为 port: 14326
修改pprof模块,把 port: 24321 修改为 port: 24326
5. 修改chainmaker-v2.0.0-wx-org1.chainmaker.org_common1/config/wx-org1.chainmaker.org_common1/chainconfig/bc1.yml中的trust_roots模块。
把所有 ../config/wx-org1.chainmaker.org 修改为 ../config/wx-org1.chainmaker.org_common1
6. 启动节点
$ cd build/release/chainmaker-v2.0.0-wx-org1.chainmaker.org_common1/bin
$ ./start.sh
7. End
两种方式都需要注意不要把org_id: wx-org1.chainmaker.org改了,在使用上边的替换时很容易就把wx-org1.chainmaker.org改成wx-org1.chainmaker.org_common1。如果改成这样启动时会报错。
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]]
还没有评论,来说两句吧...