zoukankan      html  css  js  c++  java
  • 基于以太坊的快速数字资产交易

    以太坊上网络支付通道 

    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 正在准备实现側链的功能。

  • 相关阅读:
    PAT 甲级 1126 Eulerian Path (25 分)
    PAT 甲级 1126 Eulerian Path (25 分)
    PAT 甲级 1125 Chain the Ropes (25 分)
    PAT 甲级 1125 Chain the Ropes (25 分)
    PAT 甲级 1124 Raffle for Weibo Followers (20 分)
    PAT 甲级 1124 Raffle for Weibo Followers (20 分)
    PAT 甲级 1131 Subway Map (30 分)
    PAT 甲级 1131 Subway Map (30 分)
    AcWing 906. 区间分组 区间贪心
    AcWing 907. 区间覆盖 区间贪心
  • 原文地址:https://www.cnblogs.com/dqh123/p/9417805.html
Copyright © 2011-2022 走看看