Raiden Network — Ethereum 区块链支付通道

注意这篇文章假设你已经了解 Smart Contract 了,如果不了解 Smart Contract 的话读起来会有点吃力。

Raiden Network — Ethereum 区块链支付通道_第1张图片
-https://raiden.network/-

Raiden 是一个基于 Ethereum (以太坊)的链下交易方案,主要想解决三大问题:速度、费用与隐私。

速度跟费用是在 Ethereum 上蛮需要解决的问题,依照目前的信息目前网络上每秒的平均交易数量为 10 个,而交易费虽然可以每次 Transaction 都可以调整 gas price,不过网络雍塞时却不得不调高来让自己的交易可以完成,最近的以太猫(Cryptokitties)之乱让整个 Ethereum 网络拥塞想必有些支持以太币 (Ether) 的交易所像是热锅上的蚂蚁一样吧。

虽然 Sharding 与 Plasma 等等解决交易速度的扩展解决方案愈来愈常提及,不过距离正式的释出似乎都还需要一段时间的酝酿。而 Raiden 在目前看起来是完成度较高的扩展方案。

注:我没介绍隐私方面有什么问题,因为觉得速度跟费用这两个问题比较严重。

速度与交易费的问题

但这实际上问题到底是出在哪里呢?

在速度方面,因为所有交易都需要全网共识的关系,所以每个交易都须要等到新的区块被算出来时,并且此笔新交易需要包含在其中之后才会成立,依照目前 Ethereum 的出块速度交易可能会需要数十秒到数分钟才有办法确认,在网络壅塞时甚至需要等更久。
交易费的状况则是因为 Ethereum 中所设计的 gas 机制的关系,每笔交易都会支付给矿工一笔交易费用,这交易费用如果放到比较大额的交易时还好,不过如果在小额交易时费用比例就会太高。比如说最近几次我完成的交易费用大约在 0.3USD~0.37USD 之间,如果只是作几百块台币的交易那就显然太贵了。

Raiden 网络的解决方案

最前面有提到一个让人很疑惑的句子:Raiden 是一个基于 Ethereum (以太坊)的链下交易方案 ,既然是链下解决方案,怎么会又基于 Ethereum 呢?

因为 Raiden 是一个辅佐型的网络,利用开启通道 (Channel) 来处理一批次的交易,再用一些加密算法的机制在链下纪录并核实真正的交易数据,最后在关闭 Channel 时将交易数据送入区块链中进行实际的加密货币交易与核实。这样实际在区块链上的交易笔数就会减少许多,达成减低交易费与加速的目的了。

听起来很神奇(确实也是),但是要达成这样的目的需要有许多细节,会在下面一一的解释。

首先要先说明 Raiden 是一个多节点的网络,但是为了先从简单的情境开始,我们会先说明两个节点之间要怎么利用 Raiden 的原理达成减少交易费以及加速的目的,最后再解释在许多 Raiden 的节点所形成的网络要怎么达成目的。
另外 Raiden 可以转任何 ERC20 的 token,我们以下虽然用以太币 Ether (ETH) 作为范例,不过实际上会被包装成一个兼容于 ERC20 的 token。

先想象一下…

因为我还没看过 Raiden 的服务或钱包长怎样,为了比较好的解释跟想象 Raiden Network,请先想象使用 Raiden 时会像是悠游卡一样的储值卡 app,不一样的是它是一个 app,平常你会到捷运(编者注:即轨道交通)的储值机储值悠游卡,在 Raiden Network 底下你需要要一个 app 把你的 Ether 以太币储值入 Raiden 里面。

Raiden Network — Ethereum 区块链支付通道_第2张图片
-抱歉我画得很丑 ?-

你可以在这个 app 上面看到你的 Ethereum 账户与 Raiden 账户里面分别有多少余额、列出你曾经在 Raiden 网络上作的转账,最后 app 底端有三个功能:

• 储值 (Deposit):把以太币从 Ethereum 账户转到 Raiden 账户
• 提领 (Withdraw):把以太币从 Raiden 账户转回 Ethereum 账户
• 转账 (Transfer):把以太币转给同样在 Raiden 网络里面的帐户

先谈两个节点之间的互动

说了这么多,终于要开始解释两个节点之间的互动了。前面有提到 Raiden 网络的原理是在 Ethereum 上开一个通道来处理多笔交易,让我们来好好检视一下之中的细节。
开启通道

首先,其实通道 (Channel) 其实就是一个 Smart Contract。当你打开了一个通道后就是布署了一个新的 Smart Contract。举例来说 Bob 跟 Alice 之间经常一起吃饭,三天两头就要互相 Cover 饭钱,他们之间的互动会是这样:

Raiden Network — Ethereum 区块链支付通道_第3张图片

上面的这张图虚线以上是区块链上的互动,虚线以下是 Raiden 网络上的互动。

首先他们要先开启一个通道(部署一个 Smart Contract),接着两个人都先放 5 以太币到这个 Smart Contract 里面,让资金足够可以在两人之间流动。当这个 Smart Contract 已经储存了两人的以太币后,双方就可以开始在 Raiden 网络中进行交易了。当 Bob 在 Raiden 网络送出第一笔 1 ETH 的交易给 Alice 时,此笔交易并不会发到区块链上,取而代之的是 Bob 会将此笔交易信息包含双方在信道中的余额利用自己的私钥签章过后,送给 Alice 保存此笔信息,此笔信息称为 Balance Proof。当 Alice 也通知 Bob 收到 Balance Proof 后,这笔交易在 Raiden 上面就会成立了。

在这个时间点,双方都会有信道上的余额信息,如 Alice 会拥有一份 Balance Proof Bob: 4 ETH, Alice 6 ETH 并且已经经过了 Bob 的签章。
接下来的三笔交易都会用同样的方式仅在 Raiden 当中检查、签名与传送,这些信息都不会上到 Ethereum 区块链网络上。

另外在 Raiden 网络上面并不需要保存所有的交易纪录,仅需要保存最后的余额即可。

关闭通道

当这两个节点的任何一个节点想要把在 Smart Contract 的储值的钱领回时,可以关闭通道 (Close Channel)。

假设是 Bob 想要关闭通道,则 Bob 呼叫 Smart Contract 的 close() ,此时 Bob 会在 close() 的参数内附上自己最新取得的一次 Balance Proof,同时在一段时间内 Alice 也可以呼叫 updateTransfer() 更新双方余额数据。
当双方都更新完数据后,此信道可以被任何一个人(不限于双方,可以是 Ethereum 上的任一节点)触发 settle() 将双方的钱都发回。Bob 跟 Alice 当初都存了 5 ETH 进去这个信道,最后余额的状况则是发回给 Bob 6 ETH, 给 Alice 4 ETH。

Raiden Network — Ethereum 区块链支付通道_第4张图片

这边的重点就是因为每个人拥有的 Balance Proof 都会经过对方的私钥签名,所以不论是哪一方呼叫了 close() 或是 updateTransfer() ,此通道的 Smart Contract 都可以利用 Solidity 中的 ecrecover() 验证签名,当 Balance Proof 验证正确后,Smart Contract 就可以确认这笔余额双方都确认无误。

注:Brian Po-han Chen 写过一篇文章解释如何使用 ecrecover。

整个 Raiden 网络

刚刚先说明了两个节点在 Raiden 网络的运作状况,但是如果每次都要在需要支付的双方开一个通道来转账显得很不合理,所以 Raiden 网络上的多个节点就派上用场,假如说 Alice (A) 现在要转账给 David (D),他们之间其实并不需要双方存在直接通道,仅需要 Alice 跟 David 都在 Raiden 网络上即可,也就是说他们都跟 Raiden 网络上的其中一些节点之间已经开启了通道。

Raiden Network — Ethereum 区块链支付通道_第5张图片
原图出自 Raiden Network 101 ,但是把格式改成横的方便阅读

当 Alice 要转账给 David 时,首先他要先在 Raiden 中找到一条通往 David 节点的路径,找到后就可以借用这些节点之间的通道把以太币转给 David。而在整个传输完成前,这条信道上交易会使用 Hash Lock 锁定住,直到 David 在通道上确认已经收到款项,跟 Alice 用 SecretRequest要求解锁的 Key 后,整个交易才会解锁。

最后每个传送者都会传送 Balance Proof 给下一个接收者,最终的状态则是在这个通道上的所有人,都会拥有上一个的 Balance Proof。比如说 Bob (B) 有 Alice (A) 签名过的 Balance Proof,Carol (C) 有 Bob (B) 签名过的 Balance Proof,这些 Balance Proof 就可以在关闭通道时使用。

如果你不熟悉 Hash Lock,可以参考这篇 A Simple Hash Locked Contract: Part 1 用比较简单的方式介绍了 Hash Lock。

而这些通道不必然要马上关闭,因为这些通道还可以用在其他人的转账,这样就可以在不需要 Ethereum 交易费的状况下继续转账。这个时候让我们再回到原本的那张草图,你的 Raiden app 就像是储值卡一样,可以快速地拿它来做小额交易,直到你认为需要把钱提领回你的 Ethereum 账号时,才按 Withdraw 提领把钱领出来。在你的通道还没关闭时,都可以透过 Raiden 网络转账给另外一个人。

Raiden Network — Ethereum 区块链支付通道_第6张图片

由于不需要全网共识的关系,所以 Raiden 可以在相对快的速度当中完成交易。另外在这边要说 Raiden 网络中传输还是会有费用的,总共有两种,其中一种 Protocol level fees 会在你转账时收取,不过理论上费用会非常少。另外一个费用是 Peripheral fees,如果你只有使用 Raiden 的轻节点 (light node) 时因为自身没有跑完整的 Raiden 服务的关系,所以会需要全节点替你提供服务,所以会收取费用。

但如果是跑全节点 (full node) 就不需要收取费用,反而还可以因为提供转发服务而从轻节点那边收取到 Peripheral fees,关于费用的详情请参考 Raiden FAQ 。

结论

总之 Raiden Network 就是利用上述的方式用链下的方案来解决目前 Ethereum 交易速度与费用的问题,不过我目前都仅是在文件上的阅读与理解,还没试着跑过他们的网络来实际体验一下效果。所以实际上到底能不能解决问题还需要更深入的探讨才能知道目前实作的状况。

另外在 Raiden Network 要解决交易费太少的这个问题上,其实在透过多个节点转送交易时,交易费的高低会依照中间经过的节点数量会有所不同,数量愈高交易费也会伴随着提高。所以问题会回到在 Raiden 网络上找到的最短路径所产生的交易费是不是可以比原本直接在 Ethereum 区块链上直接交易要来得低。

最后这篇文章主要是参考下面两篇 Raiden Network 的官方文件与 Github 源码:

• Raiden Network 101
• Raiden Network FAQ(编者按:文末附EthFans提供的中译本)
• Raiden 的 [Smart Contract: NettingChannelContract.sol, NettingChannelLibrary.sol

感谢 Will 跟昶吾在 Ethereum Taipei Meetup 的 Slack 上面回答了我的疑问,也谢谢两位在发布前先看过了文章,给了我一些建议。

延伸信息

这篇文章并没有讲到 TimeLock 部份的设计,如果你对这部分的信息有兴趣,可以参考下面这场演讲《闪电网络/支付信道于Ethereum的基础介绍》。

视频链接

 


链接: https://medium.com/taipei-ethereum-meetup/raiden-network-ethereum-%E5%8D%80%E5%A1%8A%E9%8F%88%E6%94%AF%E4%BB%98%E9%80%9A%E9%81%93-c44cea954e9b

你可能感兴趣的:(区块链,以太坊)