14. TCIP中继跨链使用指南
14.1. 概述
根据长安链的跨链设计,完成一次跨链操作需要中继链(至少一条)、中继网关(至少一个)、跨链网关(至少两个)、事务合约、业务链(至少两条)。跨链使用强依赖于ChainMaker本身,因此请在阅读该跨链使用前先对ChainMaker进行一定程度上的熟悉,否则可能会存在无法部署成功或使用的情况。
温馨提示:本项要求长安链版本为v2.3.1及以上,低于该版本需要自行适配,暂时不支持chainmaker业务链使用EVM合约
Hyperledger Fabric sdk版本为v1.0.0,理论上与此版本sdk适配的链版本均可使用,本项目基于fabric 2.2.0开发
FISCO-BCOS sdk版本为v1.0.0,理论上与此版本sdk适配的链版本均可使用,本项目基于2.9.0开发
14.2. 相关代码
14.2.1. tcip-samples 快速部署示例
git clone https://git.chainmaker.org.cn/chainmaker/tcip-samples.git
14.2.2. tcip-relayer 中继网关
git clone https://git.chainmaker.org.cn/chainmaker/tcip-relayer.git
14.2.3. tcip-chainmaker 长安链跨链网关
git clone https://git.chainmaker.org.cn/chainmaker/tcip-chainmaker.git
14.2.4. tcip-fabric fabric跨链网关
git clone https://git.chainmaker.org.cn/chainmaker/tcip-fabric.git
14.2.5. tcip-bcos bcos跨链网关
git clone https://git.chainmaker.org.cn/chainmaker/tcip-bcos.git
14.2.6. tcip-go golang语言tcip协议
git clone https://git.chainmaker.org.cn/chainmaker/tcip-go.git
14.2.7. tcip tcip协议
git clone https://git.chainmaker.org.cn/chainmaker/tcip.git
14.3. 中继跨链部署详解
14.3.1. 部署方式
TCIP中继跨链服务有两种部署方式,一是组织内跨链,可以使用中心化中继网关的方式部署跨链服务,如上图组织2内部进行跨链;二是组织间进行跨链,可以使用分布式中继网关的方式部署跨链服务,如上图组织一和组织2之间进行跨链。
部署跨链服务的核心是部署中继链、业务链、中继网关、跨链网关、业务链、部署业务合约,主要步骤如下:
14.3.1.1. 中继链相关部署
启动中继链(要求chainmaker版本大于等于v2.3.1),参考长安链通过命令行工具启动链,此处示例合约为docker-go合约,所以要求启动支持docker-go的长安链节点,参考通过命令行启动启用Docker虚拟机的链;
下载中继网关代码,编译代码,修改主配置文件
tcip_relay.yml
,使用编译好的命令行工具启动中继网关;
# 下载中继网关代码
git clone https://git.chainmaker.org.cn/chainmaker/tcip-relayer.git
# 进入主目录,选择相应的tag,编译代码
cd tcip-relayer
git checkout -b [tag]
make
# 修改配置文件
cd config
cat tcip_relayer.yml
配置文件内容介绍
# 网关基础配置
base:
gateway_id: relay # 中继网关ID(保持唯一)
gateway_name: relay_gateway # 中继网关的名称(尽量保持唯一)
default_timeout: 1000 # 全局默认超时时间
# rpc服务配置
rpc:
port: 19999 # Web服务监听端口
restful:
max_resp_body_size: 10 # body最大值,单位M
tls:
mode: twoway # disable, oneway, twoway
ca_file: config/cert/server/ca.crt # tlsca文件
cert_file: config/cert/server/server.crt # tls证书文件
key_file: config/cert/server/server.key # tls私钥文件
server_name: chainmaker.org # 证书中的域名
max_send_msg_size: 10 # 最大发送数据大小,单位M
max_recv_msg_size: 10 # 最大接收数据大小,单位M
client_key: config/cert/client/client.key # 客户端私钥,用来访问跨链网关
client_cert: config/cert/client/client.crt # 客户端证书,用来访问跨链网关
# 中继链配置
relay_chain:
chainmaker_sdk_config_path: config/sdk_config.yml # 中继链sdk配置文件路径
users: # 创建合约需要的用户信息(需要满足中继链的签名策略)
- sign_key_path: config/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.sign.key # 签名私钥路径
sign_crt_path: config/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.sign.crt # 签名证书路径
org_id: wx-org1.chainmaker.org # 组织ID
- sign_key_path: config/crypto-config/wx-org2.chainmaker.org/user/admin1/admin1.sign.key
sign_crt_path: config/crypto-config/wx-org2.chainmaker.org/user/admin1/admin1.sign.crt
org_id: wx-org2.chainmaker.org
- sign_key_path: config/crypto-config/wx-org3.chainmaker.org/user/admin1/admin1.sign.key
sign_crt_path: config/crypto-config/wx-org3.chainmaker.org/user/admin1/admin1.sign.crt
org_id: wx-org3.chainmaker.org
- sign_key_path: config/crypto-config/wx-org4.chainmaker.org/user/admin1/admin1.sign.key
sign_crt_path: config/crypto-config/wx-org4.chainmaker.org/user/admin1/admin1.sign.crt
org_id: wx-org4.chainmaker.org
# 日志配置,用于配置日志的打印
# 模块名称取值为:
# default:默认的日志配置,未配置日志的模块会使用该配置
# server:服务日志
# cli:命令行日志
# access_control:权限控制日志
# cross_chain_tx_manager:跨链交易日志
# gateway_manager:跨链网关管理日志
# handler:控制器日志
# prove_manager:交易证明日志
# relay_chain_manager:中继链管理日志
# rquest_manager:接口请求日志
# rpc_server:rpc日志
log:
- module: default # 模块名称(取值为:default/server/cli/access_control/)
log_level: DEBUG # 日志打印级别
file_path: logs/default.log # 日志文件路径
max_age: 365 # 日志最长保存时间,单位:天
rotation_time: 1 # 日志滚动时间,单位:小时
log_in_console: false # 是否展示日志到终端,仅限于调试使用
show_color: true # 是否打印颜色日志
- module: server # 模块名称
log_level: DEBUG # 日志打印级别
file_path: logs/server.log # 日志文件路径
max_age: 365 # 日志最长保存时间,单位:天
rotation_time: 1 # 日志滚动时间,单位:小时
log_in_console: false # 是否展示日志到终端,仅限于调试使用
show_color: true # 是否打印颜色日志
# 启动中继网关
nohup ./tcip-relayer start -c ./config/tcip_relayer.yml > panic.log 2>&1 &
14.3.1.2. 业务链相关部署
部署业务链,本教程以chainmaker跨chainmaker为例,额外部署两条业务链(中继链也可以作为业务链使用),参考长安链通过命令行工具启动链;
下载跨链网关代码,编译代码,修改主配置文件,使用编译好的命令行工具到中继网关注册跨链网关,获取到跨链网关编号ID;
# 下载中继网关代码
git clone https://git.chainmaker.org.cn/chainmaker/tcip-chainmaker.git
git clone https://git.chainmaker.org.cn/chainmaker/tcip-fabric.git
git clone https://git.chainmaker.org.cn/chainmaker/tcip-bcos.git
# 进入主目录,选择相应的tag,编译代码
cd [tcip-chainmaker/tcip-fabric/tcip-bcos]
git checkout -b [tag]
make
配置文件内容介绍
# 修改配置文件
cd config
cat [tcip_chainmaker.yml/tcip_fabric.yml/tcip_bcos.yml]
##################tcip_chainmaker.yml##################
# 网关基础配置
base:
gateway_id: 0 # 跨链网关ID(注册的时候由中继网关返回)
gateway_name: relay_gateway # 跨链网关的名称(尽量保持唯一)
address: 127.0.0.1:19998 # 中继网关访问跨链网关的地址
server_name: chainmaker.org # 跨链网关的server name(证书中的sans)
tls_ca: config/cert/client/ca.crt # 跨链网关的ca证书
client_cert: config/cert/client/client.crt # 跨链网关的client证书
client_key: config/cert/client/client.key # 跨链网关的client私钥
to_gateway_list: # 允许向哪些跨链网关发起跨链请求,不配置则没有限制
from_gateway_list: # 允许哪些跨链网关对本网关发起跨链请求,不配置则没有限制
tx_verify_type: spv # 交易验证方式,取spv、notneed,这里需要注意的,如果业务链本身又是中继链,那么需要设置为notneed
tx_verify_interface: # 该配置在此项目中不需要设置
call_type: grpc # 调用方式 取值为grpc,暂不支持restful
default_timeout: 1000 # 默认全局延时,s
# rpc服务配置
rpc:
port: 19998 # Web服务监听端口
restful:
max_resp_body_size: 10 # body最大值,单位M
tls:
ca_file: config/cert/server/ca.crt # tlsca文件
cert_file: config/cert/server/server.crt # tls证书文件
key_file: config/cert/server/server.key # tls私钥文件
server_name: chainmaker.org # 证书中的域名
max_send_msg_size: 10 # 最大发送数据大小,单位M
max_recv_msg_size: 10 # 最大接收数据大小,单位M
# 中继链配置
relay:
address: 127.0.0.1:19999 # 中继网关地址
server_name: chainmaker.org # 中继网关域名
tls_ca: config/cert/server/ca.crt # 中继网关的tlsca证书
client_cert: config/cert/client/client.crt # 中继网关客户端证书
client_key: config/cert/client/client.key # 中继网关客户端私钥
call_type: grpc # 中继网关调用方式,grpc,暂不支持restful的形式
# leveldb数据库路径
db_path: "./database"
# 日志配置,用于配置日志的打印
# 模块名称取值为:
# default:默认的日志配置,未配置日志的模块会使用该配置
# server:服务日志
# cli:命令行日志
# access_control:权限控制日志
# cross_chain_tx_manager:跨链交易日志
# gateway_manager:跨链网关管理日志
# handler:控制器日志
# prove_manager:交易证明日志
# relay_chain_manager:跨链链管理日志
# rquest_manager:接口请求日志
# rpc_server:rpc日志
log:
- module: default # 模块名称(取值为:default/start/register)
log_level: DEBUG # 日志打印级别
file_path: logs/default.log # 日志文件路径
max_age: 365 # 日志最长保存时间,单位:天
rotation_time: 1 # 日志滚动时间,单位:小时
log_in_console: true # 是否展示日志到终端,仅限于调试使用
show_color: true # 是否打印颜色日志
##################tcip_fabric.yml##################
# 网关基础配置
base:
gateway_id: 0 # 跨链网关ID(注册的时候由中继网关返回)
gateway_name: relay_gateway # 跨链网关的名称(尽量保持唯一)
address: 127.0.0.1:19998 # 中继网关访问跨链网关的地址
server_name: chainmaker.org # 跨链网关的server name(证书中的sans)
tls_ca: config/cert/client/ca.crt # 跨链网关的ca证书
client_cert: config/cert/client/client.crt # 跨链网关的client证书
client_key: config/cert/client/client.key # 跨链网关的client私钥
to_gateway_list: # 允许向哪些跨链网关发起跨链请求,不配置则没有限制
from_gateway_list: # 允许哪些跨链网关对本网关发起跨链请求,不配置则没有限制
tx_verify_type: rpc # 交易验证方式,rpc、notneed
tx_verify_interface: # 交易验证接口,如果是notneed则不需要配置
address: 127.0.0.1:19998/v1/TxVerify # 交易验证地址(本项目为本服务地址)
tls_enable: true # 是否启用tls,ture的话要配置下面两个个证书路径和域名
tls_ca: config/cert/client/ca.crt # ca证书
client_cert: config/cert/client/client.crt # 客户端证书
host_name: chainmaker.org # 域名
call_type: grpc # 调用方式 取值为grpc,暂不支持restful
default_timeout: 100 # 默认全局延时,s
# rpc服务配置
rpc:
port: 19998 # Web服务监听端口
restful:
max_resp_body_size: 10 # body最大值,单位M
tls:
ca_file: config/cert/server/ca.crt # tlsca文件
cert_file: config/cert/server/server.crt # tls证书文件
key_file: config/cert/server/server.key # tls私钥文件
server_name: localhost # 证书中的域名
max_send_msg_size: 10 # 最大发送数据大小,单位M
max_recv_msg_size: 10 # 最大接收数据大小,单位M
# 中继链配置
relay:
address: 127.0.0.1:19999 # 中继网关地址
server_name: chainmaker.org # 中继网关域名
tls_ca: config/cert/server/ca.crt # 中继网关的tlsca证书
client_cert: config/cert/client/client.crt # 中继网关客户端证书
client_key: config/cert/client/client.key # 中继网关客户端私钥
call_type: grpc # 中继网关调用方式,grpc/restful
# 日志配置,用于配置日志的打印
# 模块名称取值为:
# default:默认的日志配置,未配置日志的模块会使用该配置
# server:服务日志
# cli:命令行日志
# access_control:权限控制日志
# cross_chain_tx_manager:跨链交易日志
# gateway_manager:跨链网关管理日志
# handler:控制器日志
# prove_manager:交易证明日志
# relay_chain_manager:跨链链管理日志
# rquest_manager:接口请求日志
# rpc_server:rpc日志
log:
- module: default # 模块名称(取值为:default/start/register)
log_level: DEBUG # 日志打印级别
file_path: logs/default.log # 日志文件路径
max_age: 365 # 日志最长保存时间,单位:天
rotation_time: 1 # 日志滚动时间,单位:小时
log_in_console: true # 是否展示日志到终端,仅限于调试使用
show_color: true # 是否打印颜色日志
# leveldb数据库路径
db_path: "./database"
##################tcip_bcos.yml##################
# 网关基础配置
base:
gateway_id: 0 # 跨链网关ID(注册的时候由中继网关返回)
gateway_name: relay_gateway # 跨链网关的名称(尽量保持唯一)
address: 127.0.0.1:19998 # 中继网关访问跨链网关的地址
server_name: chainmaker.org # 跨链网关的server name(证书中的sans)
tls_ca: config/cert/client/ca.crt # 跨链网关的ca证书
client_cert: config/cert/client/client.crt # 跨链网关的client证书
client_key: config/cert/client/client.key # 跨链网关的client私钥
to_gateway_list: # 允许向哪些跨链网关发起跨链请求,不配置则没有限制
from_gateway_list: # 允许哪些跨链网关对本网关发起跨链请求
tx_verify_type: rpc # 交易验证方式,取rpc、notneed
tx_verify_interface: # 交易验证接口,如果是notneed则不需要配置
address: 127.0.0.1:19998/v1/TxVerify # 交易验证地址(本项目为本服务地址)
tls_enable: true # 是否启用tls,ture的话要配置下面两个个证书路径和域名
tls_ca: config/cert/client/ca.crt # ca证书
client_cert: config/cert/client/client.crt # 客户端证书
host_name: chainmaker.org # 域名
call_type: grpc # 调用方式 取值为grpc,暂不支持restful
default_timeout: 1000 # 默认全局延时,s
# rpc服务配置
rpc:
port: 19998 # Web服务监听端口
restful:
max_resp_body_size: 10 # body最大值,单位M
tls:
ca_file: config/cert/server/ca.crt # tlsca文件
cert_file: config/cert/server/server.crt # tls证书文件
key_file: config/cert/server/server.key # tls私钥文件
server_name: chainmaker.org # 证书中的域名
max_send_msg_size: 10 # 最大发送数据大小,单位M
max_recv_msg_size: 10 # 最大接收数据大小,单位M
# 中继链配置
relay:
address: 127.0.0.1:19999 # 中继网关地址
server_name: chainmaker.org # 中继网关域名
tls_ca: config/cert/server/ca.crt # 中继网关的tlsca证书
client_cert: config/cert/client/client.crt # 中继网关客户端证书
client_key: config/cert/client/client.key # 中继网关客户端私钥
call_type: grpc # 中继网关调用方式,grpc/restful
# leveldb数据库路径
db_path: "./database"
# 日志配置,用于配置日志的打印
# 模块名称取值为:
# default:默认的日志配置,未配置日志的模块会使用该配置
# server:服务日志
# cli:命令行日志
# access_control:权限控制日志
# cross_chain_tx_manager:跨链交易日志
# gateway_manager:跨链网关管理日志
# handler:控制器日志
# prove_manager:交易证明日志
# relay_chain_manager:跨链链管理日志
# rquest_manager:接口请求日志
# rpc_server:rpc日志
log:
- module: default # 模块名称(取值为:default/start/register)
log_level: DEBUG # 日志打印级别
file_path: logs/default.log # 日志文件路径
max_age: 365 # 日志最长保存时间,单位:天
rotation_time: 1 # 日志滚动时间,单位:小时
log_in_console: true # 是否展示日志到终端,仅限于调试使用
show_color: true # 是否打印颜色日志
# 注册跨链网关
./tcip-chainmaker register -c config/tcip_chainmaker.yml
./tcip-fabric register -c config/tcip_fabric.yml
./tcip-bcos register -c config/tcip_bcos.yml
根据生成的注册json文件调用中继网关的/v1/GatewayRegister进行注册,参考tcip协议规范
# 将返回的跨链网关编号ID写入配置文件中
{"gateway_id":"1","message":"GATEWAY_SUCCESS"}
修改主配置文件
tcip-chainmaker.yml
,将中继网关编号ID写入配置文件,使用编译好的命令行工具启动跨链网关;
# 将返回的跨链网关编号ID写入配置文件中
{"gateway_id":"1","message":"GATEWAY_SUCCESS"}
# 启动跨链网关
nohup ./tcip-chainmaker start -c ./config/tcip_chainmaker.yml > panic.log 2>&1 &
nohup ./tcip-fabric start -c ./config/tcip_chainmaker.yml > panic.log 2>&1 &
nohup ./tcip-bcos start -c ./config/tcip_chainmaker.yml > panic.log 2>&1 &
在跨链网关中注册业务链;
调用跨链网关的/v1/ChainIdentity接口进行注册,参考tcip协议规范
# chainmaker示例
{
"version": 0,
"operate": 0,
"chainmaker_config": {
"chain_rid": "chainmaker001",
"chain_id": "chain2",
"org_id": "wx-org.chainmaker.org",
"sign_cert": "签名证书字符串",
"sign_key": "签名私钥字符串",
"tls_cert": "tls证书字符串",
"tls_key": "tls私钥字符串",
"node": [
{
"node_addr": "127.0.0.1:12301",
"trust_root": [
"ca证书字符串"
],
"conn_cnt": 10,
"enable_tls": true,
"tls_host_name": "chainmaker.org"
}
]
}
}
#fabric示例
{
"version": 0,
"operate": 0,
"fabric_config": {
"chain_rid": "chain001",
"chain_id": "mychannel",
"org": [
{
"org_id": "Org1",
"msp_id": "Org1MSP",
"sign_cert": "签名证书字符串",
"sign_key": "签名私钥字符串",
"peers": [
{
"node_addr": "grpcs://9.134.82.212:7051",
"trust_root": ["peer ca证书字符串"],
"tls_host_name": "peer0.org1.example.com"
}
]
},
{
"org_id": "Org2",
"msp_id": "Org2MSP",
"sign_cert": "签名证书字符串",
"sign_key": "签名私钥字符串",
"peers": [
{
"node_addr": "grpcs://9.134.82.212:9051",
"trust_root": ["peer ca证书字符串"],
"tls_host_name": "peer0.org2.example.com"
}
]
}
],
"tls_cert": "tls证书字符串",
"tls_key": "tls私钥字符串",
"orderers": [
{
"node_addr": "grpcs://9.134.82.212:7050",
"trust_root": ["orderer ca证书字符串"],
"tls_host_name": "orderer.example.com"
}
]
}
}
#bcos示例
{
"version": 0,
"operate": 0,
"bcos_config": {
"chain_rid": "chain002",
"ca": "ca证书字符串",
"tls_key": "tls私钥字符串",
"tls_cert": "tls证书字符串",
"private_key": "私钥字符串",
"group_id": "1",
"address": "127.0.0.1:20200",
"chain_id": 1,
"is_sm_crypto": false
}
}
14.3.1.3. spv验证合约部署
tcip-chainmaker验证方式为spv时,需要部署spv合约,合约名称为
spv[gatewayId][chainRid]
(tcip-samples 项目提供了spv验证合约,如需自己实现需要完全按照该合约的方法和参数进行改造)
14.3.1.4. 跨链合约部署
部署跨链合约(要求跨链合约中需要有合约事件产生,事件中需要包含跨链所需要的数据,tcip-samples 项目提供了示例的跨链合约,可以参考该合约进行实现)
chainmaker可以参考命令行工具安装合约
fabric可以参考在通道中部署智能合
bcos可以参考合约开发样例
14.3.1.5. 跨链触发器设置
在跨链网关中注册跨链事件触发器; 调用跨链网关的/v1/CrossChainEvent接口注册跨链事件触发器参考tcip协议规范
#chainchain-chainmaker示例
{
"version": 0,
"operate": 0,
"cross_chain_event": {
"cross_chain_event_id": "0000001",
"chain_rid": "chainmaker001",
"contract_name": "erc20_01",
"cross_chain_name": "test",
"cross_chain_flag": "test",
"trigger_condition": 1,
"event_name": "transfer",
"timeout": 1000,
"cross_type": 1,
"chainmaker_event_data_type": [
0, 0, 0
],
"is_cross_chain": "one == \"lockaddress\"",
"confirm_info": {},
"cancel_info": {
"chain_rid": "chainmaker001",
"contract_name": "erc20_01",
"method": "invoke_contract",
"parameter": "{\"method\":\"minter\",\"to\":\"%s\",\"value\":\"%s\"}",
"param_data": [0, 2]
},
"cross_chain_create": [
{
"gateway_id":"1",
"chain_rid": "chainmaker002",
"contract_name": "erc20_02",
"method": "invoke_contract",
"parameter": "{\"method\":\"minter\",\"to\":\"2988661373ff198c5e5b14a65d78569a710cccfb3e44bb60cf2d8c0e440f12ef\",\"value\":\"%s\"}",
"param_data": [2],
"confirm_info": {
"chain_rid": "chainmaker002",
"contract_name": "erc20_02",
"method": "invoke_contract",
"parameter": "{\"method\":\"transfer\",\"to\":\"%s\",\"value\":\"%s\"}",
"param_data": [0, 2]
},
"cancel_info": {
"chain_rid": "chainmaker002",
"contract_name": "erc20_02",
"method": "invoke_contract",
"parameter": "{\"method\":\"burn\",\"value\":\"%s\"}",
"param_data": [2]
}
}
]
}
}
#fabric-bcos示例
{
"version": 0,
"operate": 0,
"cross_chain_event": {
"cross_chain_event_id": "0000001",
"chain_rid": "chain001",
"contract_name": "crosschain1",
"cross_chain_name": "test",
"cross_chain_flag": "test",
"trigger_condition": 1,
"event_name": "test",
"timeout": 1000,
"fabric_event_data_type": 6,
"cross_type": 1,
"fabric_array_event_data_type": [
0, 0
],
"is_cross_chain": "zero == \"fabr2bcoskey\"",
"confirm_info": {
"chain_rid": "chain001",
"contract_name": "crosschain1",
"method": "CrossChainConfirm",
"parameter": "[\"%s\"]",
"param_data": [0]
},
"cancel_info": {
"chain_rid": "chain001",
"contract_name": "crosschain1",
"method": "CrossChainCancel",
"parameter": "[\"%s\"]",
"param_data": [0]
},
"cross_chain_create": [
{
"gateway_id":"1",
"chain_rid": "chain002",
"contract_name": "ADDRESS1",
"method": "CrossChainTry",
"parameter": "[\"%s\",\"%s\"]",
"param_data": [0, 1],
"param_data_type": [0, 0],
"abi": "合约abi字符串",
"confirm_info": {
"chain_rid": "chain002",
"contract_name": "ADDRESS1",
"method": "CrossChainConfirm",
"parameter": "[\"%s\"]",
"param_data": [0],
"param_data_type": [0],
"abi": "合约abi字符串"
},
"cancel_info": {
"chain_rid": "chain002",
"contract_name": "ADDRESS1",
"method": "CrossChainCancel",
"parameter": "[\"%s\"]",
"param_data": [0],
"param_data_type": [0],
"abi": "合约abi字符串"
}
}
]
}
}
#bcos-fabric示例
{
"version": 0,
"operate": 0,
"cross_chain_event": {
"cross_chain_event_id": "0000001",
"chain_rid": "chain002",
"contract_name": "ADDRESS1",
"cross_chain_name": "test",
"cross_chain_flag": "test",
"trigger_condition": 1,
"event_name": "Test(string,string)",
"timeout": 1000,
"cross_type": 1,
"bcos_event_data_type": [
0, 0, 0
],
"is_cross_chain": "one == \"bcos2fabkey\"",
"confirm_info": {
"chain_rid": "chain002",
"contract_name": "ADDRESS1",
"method": "CrossChainConfirm",
"parameter": "[\"%s\"]",
"param_data": [
1
],
"param_data_type": [
0
],
"abi": "合约abi字符串"
},
"cancel_info": {
"chain_rid": "chain002",
"contract_name": "ADDRESS1",
"method": "CrossChainCancel",
"parameter": "[\"%s\"]",
"param_data": [
1
],
"param_data_type": [
0
],
"abi": "合约abi字符串"
},
"abi": [
"{\"name\":\"value\",\"type\":\"string\"}","{\"name\":\"flag\",\"type\":\"string\"}"
],
"cross_chain_create": [
{
"gateway_id":"0",
"chain_rid": "chain001",
"contract_name": "crosschain1",
"method": "CrossChainTry",
"parameter": "[\"%s\",\"%s\"]",
"param_data": [1, 2],
"confirm_info": {
"chain_rid": "chain001",
"contract_name": "crosschain1",
"method": "CrossChainConfirm",
"parameter": "[\"%s\"]",
"param_data": [1]
},
"cancel_info": {
"chain_rid": "chain001",
"contract_name": "crosschain1",
"method": "CrossChainCancel",
"parameter": "[\"%s\"]",
"param_data": [1]
}
}
]
}
}
14.3.1.6. 发起跨链
14.3.1.7. 部署流程图示
14.4. 快速部署
下载tcip-samples项目(文件树述请参考该项目中的README.md文件)
该项目中需要用到chainmaker、cmc的二进制文件
请下载chainmaker的二进制文件到chainmaker2chainmaker/chainmaker-go-run/chainmaker/bin和fabric2bcos/chainmaker-go-run/chainmaker/bin文件夹下,下载地址:chainmaker-v2.3.2-linux-x86_64,并解压命名为chainmaker
请下载cmc的二进制文件到chainmaker2chainmaker/chainmaker-go-run和fabric2bcos/chainmaker-go-run文件夹下,下载地址:cmc-v2.3.2-linux-x86_64,并解压命名为cmc
git clone https://git.chainmaker.org.cn/chainmaker/tcip-samples.git
进入主项目目录
cd tcip-samples
项目目录如下
├── chainmaker2chainmaker #长安链跨长安链环境快速搭建目录
├── fabric2bcos #fabric、bcos互相跨链环境快速搭建目录
├── Makefile #makefile
├── README.md #帮助文档
└── test.sh #测试脚本
部署流程详见该项目README.md
温馨提示:tcip-samples项目中的跨链网关可以随意自由组合,这里只是提供了三种跨链场景,长安链与fabric互跨、长安链与bcos互跨场景可以参考中继跨链部署详解自行搭建,中继网关可以按需搭建多个,达到去中心化的目的
14.5. 更新网关信息
修改对应的跨链网关配置;
使用如下命令生成配置信息:
./tcip-chainmaker update -c config/tcip_chainmaker.yml
./tcip-fabric update -c config/tcip_chainmaker.yml
./tcip-bcos update -c config/tcip_chainmaker.yml
生成”update.json”文件,使用该文件内容作为body,调用/v1/GatewayUpdate接口进行更新,参考tcip协议规范
14.6. 中继网关断电恢复
处于跨链过程中的跨链交易,当中继网关断电后会自动恢复。
需要注意的是,由于中继网关断电导致的区块头同步失败,会导致中继链在断电恢复的过程中多次尝试请求区块头,从而减慢中继网关的启动速度,并且处于WAIT_EXECUTE状态的跨链交易会因为交易验证失败进入回滚状态,需要在正常的情况下再次触发