以太坊上网络支付通道
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
1token_address = tools.create_token(initial_alloc=1000, name="mytoken", symbol="MT", decimals=2) -
2.Bob的地址
1bob = 'addresss of partner without leading 0x' -
3.确保可以链接bob
1tools.ping(bob) -
4.打开状态通道
1tools.open_channel_with_funding(token_address, bob, amount) -
5.bob的操作
1raiden.api.deposit(token_address, alice, amount) -
6.可以互相转帐
1234alice -> bobraiden.api.transfer(token_address, 73, bob)bob -> aliceraiden.api.transfer(token_address, 50, alice) -
7.可以查看通道的状态
1tools.channel_stats_for(token_address, bob, pretty=True) -
8.关闭通道
1raiden.api.close(token_address, bob) -
9.为了防止对方欺骗,设置了settle过程,有10个块的timeout, 等待对方确认
1raiden.api.settle(token_address, bob) -
10.可以查看双方的资金状况:
12asset.balance_of(raiden.address)asset.balance_of(bob)
Raiden 2.0 正在准备实现側链的功能。
内容来源于网络如有侵权请私信删除
- 还没有人评论,欢迎说说您的想法!