如何让BTC接入NULS生态网络

目标

在BTC测试网钱包中发起一笔交易,收币地址是一个固定的btc地址,备注填写NULS地址(包括友链)。NULS地址在一定的时间确认后,就可以在NULS生态网络中收到BTC。
反方向BTC可以回到BTC网络。

意义

吸引BTC持有者了解NULS生态网络,参与NULS建设
让基于NULS搭建的应用可以用通用的、高效的方式使用真正的BTC
通过BTC的接入,完成converter的抽象,为未来接入其他网络资产做好准备

实现方式

整个实现分为3个部分

  • NULS生态端
  • 协议转换层
  • BTC端
    难点主要在协议转换层和BTC端。

    BTC端

    使用多重签名账户作为跨链资产的中转站,BTC转入NULS生态的地址都放在多签地址中,NULS生态转回BTC网络的交易由多签地址发起。

    协议转换层

    协议转换层也设计成一条区块链,这条区块链可以和NULS进行跨链。我们暂时把它叫做converter。
    Converter需要和BTC节点(或者其他外部区块链节点)部署在一起,并且可以正常通信。(如果能整合在一起更好,converter可以管理区块链节点的启动、停止)

    Converter

    一条独立的区块链,可以抵押NULS创建节点,并确认节点职责(如对接BTC、对接BNB、对接其他链),每个节点都可以有不同的职责,但要做一个区块链的跨链,必须保证一定的节点数量。每个节点只处理自己职责范围内的交易,其他交易可以通过其对应职责的节点验证。

    核心设计思想

    converter-core:协议转换器核心逻辑,实际是一个共识模块。
    该模块可以创建节点、追加保证金,但不接受委托(为了让节点增加投入),节点出块门槛将更高。退出节点将需要更长时间解锁,在退出节点和解锁的过程中,委托的NULS将接受共识节点多签控制,在必要时通过社区治理机制没收节点保证金。
    默认设置5个种子节点,由团队控制,在共识节点中选择10个节点参与多签地址创建和管理,多签地址可以每月或者每个季度重新生成一次(取前十金额节点,不变时不需要重新生成)
    每个节点中有一个NULS账户和一个btc账户,作用不同。
    社区治理机制动态确定出块节点委托金额的最低值,根据btc和nuls价格比例进行计算,要求委托总价值应该是预计可锁定btc的1.5倍。

    接口设计

    converter-module-sdk:这是一个独立的模块,遵循NULS模块规范,包含以下接口的实现:
    1
    2
    3
    4
    5
    6
    7
    start:启动进程,初始化操作。核心内容是监听btc网络,当btc的转帐交易被6个块确认的时候,转换btc协议为NULS协议,并放入交易池。
    verifyInTx:验证转入NULS生态交易是否已确认
    assemblingTx:组装一个从NULS生态转出的交易
    verifyOutTx:验证转出交易是否是正确的转出交易(不能多转,少转)
    signOutTx:签名(追加签名)
    verifySigns:验证多签是否已经足够
    broadcastOutTx:广播交易

社区治理

  • 跨链仲裁,当验证人节点抱团作恶时,可以罚没保证金,用于赔偿使用者损失
  • 调整系统运行参数
  • 其他社区治理功能

    奖励模型

    btc交易手续费,比如按比例0.5%收取
    NULS交易手续费,收取的NULS
    ??产生一种新币进行奖励,但没什么好的用途设计

    BTC网络对接说明

    BTC上如何转入NULS

    在BTC上发起一笔交易,将要转入NULS生态的BTC转入NULS提供的多签地址中,同时在交易的备注中填入NULS生态中的地址,然后等待交易确认。

    Converter操作

    当上面的交易被6个区块确认后,进行协议转换,封装一个NULS跨链交易,交易的资产就是BTC(减去手续费)。
    把这笔交易进行打包,打包后推送到NULS主网,之后使用常规的NULS跨链操作完成最终结果。

    BTC网地址如何转换为NULS地址

  1. 在Converter中提取NULS和BTC地址中的hash160(pk),并按照相应的格式生成地址

    如何把BTC转回BTC主网

    NULS生态中的跨链交易,最终在Converter进行确认,区块确认后各个节点组装多签交易,并广播到Converter网络中,当签名数量足够后,把交易广播到BTC主网。

    BTC地址在NULS生态中的格式

    NULS为生态外地址设置了特有的地址格式,如下:
    address = Base58Encode(chainId+原始地址+xor)
    序列化时不包含xor

注意:这不是最终方案,只是一个讨论过程方案

-------------The End-------------