基于以太坊的快速数字资产交易

以太坊上网络支付通道 

Raiden 利用链下网络状态技术给以太坊上的数字资产带来了许多nice的属性:

  • 1.可扩展性: 它与参与者的数量呈线性关系(每秒可能有1,000,000+次转帐)。
  • 2.快速: 转账在一秒钟的时间内被确认和确定。
  • 3.匿名性:单次转帐不会显示在全局分布式帐本中。
  • 4.互操作性: 以太坊上任何实现了标准代币的接口的代币都可以互相交易。
  • 5.低额交易费: 交易费比区块链上的交易费低7个数量级。
  • 6.小额支付: 低交易费允许有效的转移小额资金。
    技术点 
    该技术类似于比特币的闪电网络。
    基本思想是: 所有的交易需要记载到区块链上的共享账本上(这是区块链的瓶颈),而该技术是通过交易双方私下签名交易信息, 不需要全部上链。Raiden 使用一个p2p支付通道网络,并在以太坊的区块链上存一定的押金。Raiden 是以太坊上的一个扩展应用。Raiden 节点和以太坊的节点互相联通工作,作为交易的基础设施, 并用以太坊上的链来管理通道的存证信息。Raiden 提供了简单的API, 使得DApps 非常容易实现。
    应用
  • 为内容分发做小额计费:Paywalls,广告和订阅。
  • 去中心化的M2M市场: 特别是在物联网中, 微小的带宽, 存储, cpu占有率, 能量, 传感器数据等可以交易。
  • 没有交集的代币系统: 游戏代币, 奖励代币, 私有货币。
  • API 访问: 对于即将来临的M2M经济,每次API 访问计费。
  • 快速去中心话交易。
    与以太坊相辅相成 
    Vitalik Buterin 说:“ 状态通道是一种重要技术, 有可能大大提高许多区块链应用程序的可扩展性和隐私性; 结合分片和其他隐私秘密保护技术, 他们是一个重要的组合,可以实现去中心化的许多属性,而这些属性是圈内人和机构所期望,也应该实现的“

Raiden 1.0 详解:
Raiden 1.0 通过合约的方式实现了token 的线下状态通道支付。
Registry 合约是系统注册合约,以太坊上的每一种代币都可以一次注册, 然后会产生一个基于该token的状态通道管理合约。每个有该token的用户都可以选择一个搭档建立一个状态通道合约,通过设置押金(会在链上存证)实现线下通道支付,线下交易都是双方各自签名确认即可, 撤出时, 再双方提供证据, 链上交易存证。合约如下:

Raiden 的类介绍:

ASSET

  • a. 没有特殊规范来规定哪样的资产。
  • b.只要是上链的一个简单合约地址就可以(如Toke address)。

    RAIDENPROTOCOL

  • a.节点间的传输层交互
  • b.RaidenService 的网络事件通知。

    RAIDEN SERVICE

  • a.链下运行。
  • b.Raiden 的根类。
  • c.暴露Raiden 与Raiden的接口。
  • d.需要直接访问本地的Blockchain节点。
  • e.管理所有的链上链下交互路由。
  • f.维护AssetManagers列表。
  • g.每个维护的AssetManagers只负责一个资产。

    ASSETMANAGER

  • a.链下运行。
  • b.完全由RaidenService实例拥有。
  • c.与一个单一资产相关联。
  • d.与链上的ChannelManagerContract相关联,负责同一个资产。
  • e.在单一资产上维护一组到其他节点的通道。
  • f.从链上的ChannelManagerContract获取通道初始化列表。

    CHANNELMANAGERCONTRACT

  • a.链上运行。
  • b.关联实实在在的一种资产。
  • c. 维护链上的NettingChannelContracts列表。

    NETTINGCHANNELCONTRACT

  • a.链上运行。
  • b.和一种资产相关联。
  • c.知道同一通道的两个参与方(链上 地址)
  • d.持有双方存款
  • e.在链上执行一个通道的结算。

    TRANSFERMANAGER

  • a.链下运行。
  • b.负责处理TransferTasks,它们代表了脱机通道中双方之间的单一转移。
  • c.在没有直接目标通道打开的情况下,会产生TransferTask 作为中介转移。
  • d.如果具有接收到的转移目标的通道打开,则可以启动到目标的转移。

    TRANSFERTASK(UML: TRANSFER_ACTIVITY, TRANSFER_STATE)

  • a.链下运行。
  • b.异步运行, 通过网络事件触发。
  • c.和AssetManager, TransferManager 和RaidenService 相关联。
  • d. 和transfer完全相关联。
  • e.负责找到与之相关联的传输路径。
  • i. 路径是活跃的。
  • ii.路径有足够的资金用于转移。
  • f.如果找不到路径,则启动CancelTransfer。

    TRANSFER

  • a.包含nonce, 资产, 金额,参与方,locksroot[, secret]。
  • b. nonce: 跟踪消息序列的计数器。Transfers的nonce 在通道中更新, 参与方的nonce在参与方的本地镜像中更新。
  • c.是一个merkle树的树根。它记录了他们的hashlocks的最精简locked_ammounts。

    LOCKEDTRANSFER

  • a. 如果收款人知道hashlock的secret, 那么他就可以声明locked_amount。 locked_amount不是余额的一部分,而是在locksroot中隐含。

    CHANNEL

  • a.链下运行。
  • b.被本地或者伙伴节点初始化。
  • c.在链上有一个相对应的NettingChannelContract。
  • d.在每个资产的对端节点中最多有一个通道。也就是说,(目前)最多两个(不同的)节点可以为每个资产设置一个通道。
  • e.和伙伴节点维护最终的交易账本。
  • f.执行创造和取消transfers。
  • g.维护LockedTransfers列表。
  • h. 执行LockedTransfers的声明。
  • i.更新自己和伙伴的账目(接受或者发送)。

    各模块关系图如下:

    核心步骤。

    TRANSFERS IN A CHANNEL

  • a.类型: Transfer, LockedTransfer (Parent class for): MediatedTransfer, CancelTransfer。
  • b.Trasfers 接收到一个RaidenProtocol实例化的消息,并转发给RaidenService,由TransferManager来真正的处理。
  • c.TransferManager 从AssetManager中获得相关联的通道。
  • d.任何通道可以追踪Transfers和LockedTransfers。
  • e.Transfers 可以通过通道发送给参与方的节点, 也可以注册本地通道。因此,通道中的transfer既可以是用于发送的, 也可以是用于接收的。
  • f.一旦接收到transfer, 由通道注册。
  • i.Transfer 接收者必须要有正确的nonce。这个nonce是当每次接收到伙伴节点transfer而增加。这个nonce 在本地伙伴节点维护。参与双方维护相同的增加。保证参与transfer双方的序列一致性。
  • ii.收到的transfer包含secret, 解锁secret得到金额, 并相应更新余额。
  • iii.如果我们收到了LockerTransfer,LockedTransfer将被注册。
  • iiii.最后,自己的余额和合作伙伴的余额根据allowance(= transfer.balance - self.balance)进行更新。如果转让包含secreted, 余额则根据步骤ii中触发的声明进行。
  • g.如果Transfer被发送, 则由Channel注册:
  • i.对于接收方,是对称的。
  • ii.我们不需要验证lockroots是否正确。
  • h.只有节点的当前余额超过传送的额度并且未达到到期的块高度(后者仅与LockedTransfers相关),Transfers才能被初始化。

选择多条Transfer的场景

正常的TRANSFER

1
2
3
4
5
6
7
A 通过B 转帐给C:
A: 初始化secret
A: MediatedTransfer -> B
B:MediatedTransfer -> C
C:secretRequest -> A (证明收到的transfer是有效的)
A:Secret -> C
C:Secret -> B

CANCELTRANSFER:

1
2
3
4
5
6
A: 初始化Secret
A: MediatedTransfer -> B
B: MediatedTransfer -> C(失败: C 不能和D建立路经)
C:CancelTransfer -> B
B:MediatedTransfer -> C2
C2:MediatedTransfer -> D

TIMEOUTTRANSFER

1
2
3
4
5
A: 初始化Secret
B: MediatedTransfer -> B
B: MediatedTransfer -> C (失败:没有接收到C的ACK消息)
B: TransferTimeout -> A
决议:A不会透露secret,尝试新的transfer,B禁止C

私有链上运行步骤:(geth 需要 < 1.6.0的版本)

1,编译合约,并生成到genesis.json。

1
python tools/config_builder.py full_genesis > mycustomgenesis.json

2, 根据genesis.json初始化内容到指定目录。

1
geth --datadir /tmp/privategeth init mycustomgenesis.json

3,启动geth

1
geth --datadir /tmp/privategeth --networkid 123 --nodiscover --maxpeers 0 --rpc --minerthreads 1 --etherbase c13f2e8e9c92d81de806023d68cc64fe85bf6740 --mine

4,启动雷电网络

1
raiden --eth_rpc_endpoint 127.0.0.1:8545 --registry_contract_address 79eafd0b5ec8d3f945e6bb2817ed90b046c0d0af --discovery_contract_address 2ce636d6240f8955d085a896e12429f8b3c7db26

进入Raiden 控制台

举一个 alice 给 bob 转帐的例子:

  • 1.创建token, 或者用已有toke

    1
    token_address = tools.create_token(initial_alloc=1000, name="mytoken", symbol="MT", decimals=2)
  • 2.Bob的地址

    1
    bob = 'addresss of partner without leading 0x'
  • 3.确保可以链接bob

    1
    tools.ping(bob)
  • 4.打开状态通道

    1
    tools.open_channel_with_funding(token_address, bob, amount)
  • 5.bob的操作

    1
    raiden.api.deposit(token_address, alice, amount)
  • 6.可以互相转帐

    1
    2
    3
    4
    alice -> bob
    raiden.api.transfer(token_address, 73, bob)
    bob -> alice
    raiden.api.transfer(token_address, 50, alice)
  • 7.可以查看通道的状态

    1
    tools.channel_stats_for(token_address, bob, pretty=True)
  • 8.关闭通道

    1
    raiden.api.close(token_address, bob)
  • 9.为了防止对方欺骗,设置了settle过程,有10个块的timeout, 等待对方确认

    1
    raiden.api.settle(token_address, bob)
  • 10.可以查看双方的资金状况:

    1
    2
    asset.balance_of(raiden.address)
    asset.balance_of(bob)

Raiden 2.0 正在准备实现側链的功能。

原文地址:https://www.cnblogs.com/dqh123/p/9417805.html