跳转至

FAQ

跨链体验

1. M1芯片部署新版本中继链报错

# github.com/bytecodealliance/wasmtime-go
ld: library not found for -lwasmtime
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [install] Error 2

wasmtime-go默认并不支持arm架构,需要单独编译wasmtime,流程如下:

(注意!!!需要根据bitxhub go.mod文件中所依赖的wasmtime-go版本进行单独编译)

  1. 查看依赖的wasmtime-go版本

    # 切换到bitxhub目录
    $ git checkout release-2.0 
    # 查询wastime-go版本
    $ cat go.mod | grep wasmtime-go | awk '{print $2}'
    v0.34.0
    
  2. 部署rust编译环境

    # 下载安装rust
    $ curl https://sh.rustup.rs -sSf | sh
    # 检查是否是arm版本
    $ rustup show
    Default host: aarch64-apple-darwin
    rustup home:  /Users/xxx/.rustup
    
    stable-aarch64-apple-darwin (default)
    rustc 1.59.0 (9d1b2106e 2022-02-23)
    (base)
    
  3. 编译wasmtime-c-api

    # 在wasmtime中单独编译wasmtime-c-api,下载到$GOPATH/src目录下
    $ cd $GOPATH/src && git clone https://github.com/bytecodealliance/wasmtime.git 
    
    # 切换到与所依赖的wasmtime-go一致的版本
    $ cd wasmtime && git checkout v0.34.0
    # 当使用git clone下来的工程中带有submodule时,初始的时候,submodule的内容并不会自动下载下来的,此时,只需执行如下命令下载所有子模块
    $ git submodule update --init
    $ sudo cargo build -p wasmtime-c-api --release
    
  4. 更新go.mod依赖的wasmtime-go

    # 切换到go.mod的wasmtime-go路径下
    $ cd $GOPATH/pkg/mod/github.com/bytecodealliance
    # 使用脚本将编译好的文件拷贝到wasmtime-go项目的build目录下
    $ cd ../wasmtime-go@v0.34.0 && sudo bash ./ci/local.sh $GOPATH/src/wasmtime
    

    最后重新编译bitxhub即可,值得注意的是,如果不同bitxhub的版本依赖不同的wasmtime-go,需要重复上述步骤对指定版本的wasmtime-go进行编译。

2. geth部署以太坊私链导致跨链流程阻塞

由于以太坊采用非确定性共识算法,可能会有区块分叉现象存在,因此在以太坊插件配置中设置了min_confirm 字段用于等待区块得到确认,该参数可更改。如果在本地使用geth、goduck等工具搭建以太坊私链,如果没有非跨链交易上链,以太坊将不会继续出块。因此跨链交易将一直等待交易得到确认。

因此,实际使用时,需要把pier的配置目录下的ethereum.toml下的min_confirm 改为0即可。

$ vim $HOME/.pier/ether/ethereum.toml

[ether]
…………
key_path = "account.key"
password = "password"
# 修改为0
min_confirm = 0
…………

3. packr包的相关报错

需要将当前的packr包进行更新。

# 方法一:自行下载packr2包
# 查询当前go的版本号:
$ go env GOVERSION
# go版本小于1.16时执行:
$ go install github.com/gobuffalo/packr/v2/packr2@v2.8.3
# go版本大于1.16时执行:
$ go get github.com/gobuffalo/packr/v2/packr2@v2.8.3

# 方法二:使用项目内置脚本更新packr包
$ make prepare

跨链技术

1. 跨链的必要性

一是技术层面,区块链技术在单链架构下本身存在着性能、容量不足等问题。单链由于受到目前共识速度的限制,节点的执行性能无法做到线性扩展,这限制了高交易吞吐量低延迟的商业场景的应用。除此之外,随着区块链运行时间的增长,其存储容量也将逐渐增长,且这种数据增长的速度甚至会超过单链存储介质的容量上限。目前的区块链共识算法、存储结构、和安全机制不同导致链与链之间缺乏统一的互联互通机制,这极大限制了区块链技术和应用生态的健康发展。

二是业务层面存在跨区块链业务的资产交换和信息交换需求。在资产交换方面,一些区块链事实上仍处于互相隔离的状态,它们之间的资产交换主要依靠中心化的交易所来完成,中心化的交换方式既不安全规则也不透明。 而信息交换由于涉及链与链之间的数据同步和相应的跨链调用,实现更为复杂,目前各个区块链应用之间互通壁垒极高,无法有效地进行链上信息共享。

2. 跨链技术的可行性

目前区块链行业已经出现了很多的跨链技术产品,主要采用公证人机制(notary schemes)、侧链/中继(sidechains/relays)、哈希锁定(Hash-locking)等技术,已经在公链的场景中有很多应用例如:闪电网络,去中心化交易所等。

联盟链场景中采用类似技术及其增强技术,解决联盟链跨链需求,目前的产品已经能够解决跨链中的关键问题:

  1. 跨链交易的验证问题,如何确认记录交易发生的区块得到了足够的确认,即交易事务中各分布式网络间的数据一致性问题;
  2. 跨链事务的原子性问题,如何管理跨链事务中的各子交易确保跨链事务整体完整的原子性,即跨链事务的发生只存在两中状态完成或失败;
  3. 不同区块链之间的协议适配问题,如何对采用不同架构与协议的区块链之间进行适配,需要跨链协议中设计可以兼容多种异构区块链的数据结构、命名规范以及通信方式等。

产品功能

1. 产品简介

趣链科技跨链技术平台BitXHub,提出了一套完整的通用跨链传输协议IBTP(Inter-Blokcchain Transfer Protocol), 能够完美支持和兼容任意区块链系统,实现异构区块链的无缝连接。BitXHub采用先进的中继+网关的组合技术,解决了跨链中的交易捕获、传输以及验证的核心难题,所有关键技术均具有完全自主知识产权。同时,平台具备完善的跨链接口管理、异构链成员治理、联盟权限管控等联盟跨链专用机制,是目前业界最完备的异构联盟链跨链技术平台,已经在金融、政务等业务场景中进行了相关应用验证。

2. 实现原理

BitXHub提出一种可扩展的适应不同异构区块链系统之间的跨链方案,通过设计可插拔的跨链网关技术,实现区块链网络间的的协议转换,并支持异构区块链之间的交易验证,该方案支持异构区块链之间交易的可信验证和可靠传递。

应用基于插件机制的跨链网关,实现异构应用链的快速适配与统一管理,以动态加载插件的形式随时加入平台;应用基于智能合约的异构交易验证技术,将交易验证规则进行全生命周期的管理,实现统一、高效的跨链交易合法性验证;应用基于可信事件的跨链传输协议,消除异构区块链之间技术机制的差异性,实现跨链交易格式的通用化与标准化,达成区块链平台在应用级别的可扩展性。

3. 跨链交易基本流程

  1. SDK 调用具体的业务链A的合约方法;
  2. 合约方法被执行,抛出跨链事件T1;
  3. 业务链A的跨链网关监听到T1, 将其转换成IBTP结构,提交到中继链BitXHub上;
  4. BitXHub 依据相关规则对T1进行验证以及路由;
  5. 业务链B的跨链网关接受到T1并根据IBTP结构进行解析,转换成业务链B可识别的交易Tb
  6. B的跨链网关将Tb提交到业务链B上进行执行;

4. 跨链效率

跨链的完整流程所需时间:T = Ta + Thub + Tb

其中 Thub 是中继链的验证和共识所需的时间,可达到 5000TPS 左右;TaTb 分别是应用链A和应用链B的执行时间,其性能取决于应用链本身的执行效率。

5. 社区版与商业版有何区别?

社区版和商业版都支持基础功能:

  • 中继服务(跨链交易验证与路由、跨链成员管理);
  • 网关服务(跨链交易捕获、解析与调用);
  • SDK组件(GO、JAVA)。

其他对比如下:

image

6. 跨链平台目前适配了哪几种应用链?

目前已适配趣链区块链平台和Hyperledger Fabric,其他类型区块链(包括公链)可以按需通过插件形式灵活接入。社区版目前已提供Fabric的插件。

7. 所有跨链交易都会经过中继链处理,是否会存在数据安全性问题?如何实现不同业务链跨链时的数据隔离和隐私性?

中继链中的所有交易均以IBTP协议的数据结构进行存储、验证:

参数 说明
From 来源链ID
To 目的链ID
Version 协议版本号
Index 跨链交易索引
Payload 跨链调用内容编码
Timestamp 跨链事件发生的时间戳
Proof 跨链交易证明
Extra 自定义字段

其中的Payload是跨链交易的核心内容,BitXHub通过多种方式保证其安全性:

  • 采用特殊的编码机制,仅跨链双方可解;
  • 采用加密的方式,仅跨链双方持有秘钥;
  • 链上权限控制,非相关方无法读取相应交易(之后将核心代码开源以保证可信);
  • 采用类似隐私交易的机制,仅相关控制的BitXHub节点中保存相关方跨链交易

8. 跨链转账交易如何保证事务性?如何做回滚或补偿呢?

跨链通过中继链内置事务管理合约来保证事务性,跨链事务方案具有三个特性:一对一跨链一对多跨链超时回滚。详见 跨链事务方案

9. 通过DataSwapper相互传递的数据,如何保证真实性呢?

  • 验证引擎会对跨链交易、跨链交易执行结果采用SPV证明机制进行验证,来确保跨链交易和跨链交易的执行都是真实在链中发生的。
  • 应用链中跨链的接口必须按照规定实现,验证引擎会对比跨链调用的接口以及通过SPV机制验证调用接口执行后返回的数据的有效性。

跨链准备

1. 中继链由谁维护?如何搭建?

中继链本身就是一条联盟链,作为去中心化的可信中介,推荐的搭建方案是由参与跨链的各方共同维护节点来搭建中继链。

2. 跨链网关应该部署在哪里?

跨链网关部署是由应用链方决定的,跨链网关只负责跨链交易的收集、跨链真实性凭证收集和跨链交易执行;整个跨链操作的可信是通过验证引擎对IBTP的验证实现的,如果跨链网关篡改数据,中继链的验证引擎将不会验证通过。

3. 对于未适配应用链需要做哪些开发工作,改造的工作量是多少?

应用链适配工作包括:

  1. 根据我们提供的模板撰写跨链路由合约broker, 主要一方面将自己的合约某些方法提供给其他方使用;二是提供接受来自其他方的交换的信息或资产接口;
  2. 对于需要跨链的方法,添加调用跨链的逻辑,就是调用我们提供的跨链合约接口;
  3. 部署跨链网关(常见区块链无需改造,特殊的区块链只需要提供和区块链相关的SDK基本就可以);
  4. 将应用链的信息注册到BitXHub中,如链的ID,节点数量,共识算法类型等;
  5. 根据应用链的共识机制编写交易的验证规则,详见验证规则编写文档

跨链操作

1. Fabric没有token,在跨链转账时使用的是什么资产模型?

wiki中给出的例子是一个模拟资产操作的一个合约,对资产模型没做特定的假设。

2. 对于已经存在业务的应用链,是不是需要更改原来的业务合约才能兼容新的资产类型?

对于已有的业务合约需要进行一定的改造,即实现规定的几个接口,详见业务合约开发文档

回到页面顶部