# MeerContract 之 设计篇

自从上一讲跟大家解释为什么MeerContract 要跨链后,我们进一步解释下具体的实现。

部署

跨链首先要解决的是合约链的部署问题,经典的做法需要分别独立地去维护主链和合约链,直观的说就是节点维护者每次都要同时启动主链节点和合约链节点。这样会产生一定的维护成本,比如说节点维护者,忘记开启合约节点了,或者合约节点意外终止了,造成合约无法被处理的问题。

目前MeerContract 的解决方案是将合约链的客户端以网络库的形式集成到主链客户端中,虽然表面上看只运行了一条链,但实际上是两条链同时在运行。而且两条链之间的通信也是以RPC的方式进行交互,而非直接调用彼此之间的函数。

共识

合约链和主链是独立的两条链,因此可以有独立的共识,这也是MeerContract 技术上的优势。合约链比较耗费计算资源,很有可能某个应用比较热门,造成整个主链拥堵。合约链可以根据合约交易的负载程度采用支持更高交易吞吐量的共识,即使合约链因为意外情况造成了拥堵,也不会影响主链的正常运行。

值得注意的是,由于初期合约链上的交易量不够,完全独立的共识将会存在安全隐患。因此,MeerContract 会将每笔合约交易在主链上进行同步共识,利用主链基于工作量证明的MeerDAG共识协议的高安全性保证合约链共识的安全。未来等合约交易量稳定后,会逐渐降低对主链共识的依赖,以保证合约的高效以及主链的稳定。

数据结构

目前在交易的类型中加入了三种类型的交易:

  • 将通证从主链转入合约链
  • 将通证从合约链转入主链
  • 智能合约

由于MeerDAG是基于UTXO模型,其交易的的数据结构和以太坊的基于账户模型的交易数据结构并不兼容。为了保持UTXO交易结构,MeerDAG巧妙地利用了交易结构中的输入中的签名脚本以及序列字段

type TxInput struct {
   PreviousOut TxOutPoint
   //the signature script (or witness script? or redeem script?)
   SignScript []byte
   Sequence uint32 //work with LockTime (disable use 0xffffffff, bitcoin historical)
   AmountIn Amount
}

其中Sequence 字段在一般的交易中用得并不多,因此MeerDAG将此字段用于区分不同的交易类型,比如上述三种合约交易类型以及MeerToken资产发行系统的多种操作类型。由于确定了交易类型,SignScript这个字段就可以根据不同类型有不同的交易数据规则。因此,MeerDAG完全保留了UTXO数据结构,既可以兼容经典的UTXO交易,也具有非常强的可扩展性。

总结

MeerContract的具有两大设计创新,首先合约链跨链的设计可以让合约链具有更大的独立性,因此可以保证合约链的高效和主链的稳定;其次,通过巧妙的重新了定义了UTXO的数据结构,可以让MeerContract具有更强的可扩展性,也解决了UTXO模型的交易和账户模型的交易不兼容的问题。

1 Like