Hi 游客

更多精彩,请登录!

比特池塘 区块链前沿 正文

菜鸟学习状态通道 广义状态通道

fzny61226
61 0 0
###什么是广义状态通道?
8 y: |% I8 r) U
5 y( D7 k* z% J" C广义状态通道的意思是,用户可以用同一个通道做多种不同的事情。
7 V$ h( {- H: F) T0 X, Q; H  T) [; ]4 e; n! d
###广义状态通道有何意义?
" X; }! `. I: y; a# s
5 K- n3 D' Q* Y" D9 N没有状态通道,任何以太坊上的 App 都必须承担高额手续费,忍受延迟,因为 App 高度依赖于链上交易。使用 App 定制型状态通道,我们可以创建更经济更高效的 App ,用户只要在启动和关闭 App 时支付就可以了。广义状态通道更进一步地改善了这种情况,用户只需要在关闭 App 时支付。! F- D2 J4 j& j7 M/ c5 C4 V$ ]- b* o

6 a# _, S! l8 [4 I% U7 g3 X9 V注意:当我说“支付”的时候,我的意思是向链上提交交易。$ U4 D  t0 {0 b# y! a7 r

' _  |$ H" W" J: D4 S###广义状态通道2 f; u; s- c* E. b- U% [  R5 _
7 O, l6 `0 M8 K+ I' d
在技术上,要开启广义状态通道,所需要求与 App 定制型状态通道一般无二:一个足够强大的多签钱包就足够了,参与者用于锁住状态。区别在于,用户无需为每一个应用都“安装”链上组件——即便要使用多个应用,该多签钱包也将是用户所需的唯一链上组件。, P0 }$ G3 \- u+ L3 K
# `) U! |) P8 Z' w3 U6 M
App 定制型状态通道(回顾)- k4 ?+ I+ e" v3 W: u( n
8 m* N. n6 M$ p
鉴于在部署链上组件这一点上差别极大,我们先回顾一下我们在前面的文章中讲到的内容。在前文中,我们遵循下列步骤在多方间打开一个 App 定制型状态通道:$ y$ P0 _3 A/ M% k$ c8 a  U

7 o! X! T% [, R$ t, w, ?与相关方一起,部署一个多签钱包,把规则集(用来解析发送给钱包的交易)加到链上。7 g) w0 o- n* Z* S
9 g' m$ m+ w$ l( S& }7 W$ Z1 c
在他们进行不同的操作时,在参与者之间广播已签名的消息。: d, A( t7 }2 A# B2 H# N
" n9 v- j5 X' |
当参与者准备好开启或退出通道时,他们会把所有参与者签名的最新状态提交到多签钱包,多签钱包根据内置的规则集,决定如何在参与者之间分钱。
9 y$ I/ f- a" e, F. c, @4 i
& i' k0 m9 {! d; o这种配置看起来就是下图的样子:& M" X+ @2 ~* G

: G2 _  A6 L9 P; b) F( U-在任何时候,Bob 和 Alice 都可以把双方都签过名最新状态提交到多签钱包,来配置通道。-5 A, \# L' c% e, z9 t  z$ Y6 D0 V
+ \3 |- Y( q7 k
注意,上述过程所用的多签钱包只支持符合其内置规则集的 App 。再次强调,广义状态通道通过“反事实实例化(Counterfactual Instantiation)”扩展了 App 定制型状态通道的功能:允许新的 App 安装在现有的状态通道中。/ n2 ]( D# F( [4 u$ [( G

. U3 O/ O/ ]6 w/ L4 x###反事实实例化
* p# u2 P: o2 @
- g0 u! C; ^, O1 T' m/ R/ I反事实实例化是一个通道内成员同意接受链下智能合约约束过程。这是一个比较奇怪的概念,因为它意味着“链下代码即法律”(给 Liam Horne 点小费吧,这是他提出的),一下是一个简单的例子:
5 ~. h0 \; L4 t+ N
( G, g. |5 Q( N% `$ L$ eSo Easy (作者你是认真的吗?)-, N8 P- C3 Q1 \/ B% P8 r

8 v: y7 I1 a+ {0 y" N! J# K要创建广义状态通道,我们唯一需要的就是一个多签钱包。我跟阿剑各往钱包了存了 5ETH,并且决定要在我们之间创建一个支付通道。所以,我们在链下创建了一个支付通道,并且都对合约代码签过了名,同意在关闭通道时部署它。我们同样也对基于已部署的支付通道的最终状态、发往多签钱包的条件支付请求签了名。
# z+ D/ Q* T; f9 S: a# v
* c5 P: P3 {0 H2 A5 ]( s那么,使用同样的方式——所有参与者都签名,我们不仅能保证状态的可信,也能保证代码的可信。所以,只要我们都签署了代码,我们就可以像该代码已在链上部署的那样,放心地签署相关的状态。两种方式最主要的不同就是,我们只需要在想要结算状态通道时部署代码。" S" _3 G! @4 \" s& C& B6 S6 A/ Z
/ |! `6 Q# i" T& k9 S! n
那么,当我们想结算时的时候,我们需要:  D9 g1 T9 a! a6 d8 b
( y2 Z# P! {3 n: f
部署支付通道合约
7 A" O5 E0 E2 y6 C- H3 y; z. r9 A! |6 }7 I, D8 g- e) H! R
向该合约提交所有参与者签名的最新状态
8 L: p5 C5 W" _$ v1 Y$ f" j7 m. X! o3 ~% E1 G+ B/ k  P4 f/ |
(基于支付通道的余额)将条件支付请求提交给多签钱包- y! b- [( A$ Z! L

! o5 a) N& B% G多签钱包给各参与方支付
& ?2 o- ?; @/ n3 c# d0 n
& z6 X# _+ I6 f% w那么,反事实实例化使我们可以假设链下代码已经被部署到了链上,并据此行动;因为我们可以在任何时候部署上链并提交最新状态。但是,这就有个问题——我们如何在没有链上地址的情况下签署状态转换?这就是注册合约的用武之地!" b. l1 W2 R# [
: Z0 s# s1 X1 y4 I# l9 v
###注册
- s/ w4 o, H0 F& k5 ^6 f, a- u
7 J2 S# M, j7 F6 W0 q! N从比较抽象的层面上讲,注册器智能合约允许我们做以下操作:. b* o/ ]9 X' k4 e' ^

& x2 A6 U% ^( Z, _# t- d' b/ X基于合约字节码,创建一个链下地址(cfAddress)8 [8 u* n) j  F+ i  s' _- d
# ^" x( Q) r$ ^
部署智能合约,并把 cfAddress 和链上地址进行映射5 v) X5 V. Y" {

* Y3 b. |$ X- S8 Y* Q: r, c. _通过 cfAddress 执行链上合约代理调用5 z$ @, u' p- l5 B, R

0 D/ \! {, E5 v7 ]注册合约伪代码:% D9 I8 ?( Z+ [
% d; u0 X. Z. g2 O5 P
contract Registry {0 I) L  R  ^6 E, L1 ^

, |( m. Y' W0 |# z! M: K# n  mapping(bytes32 => address) resolver;" R9 v( Q1 |0 C9 T$ u! O
. `3 V2 k5 I- [# H
  function cfAddress(bytes code) returns (bytes32) { ... }
4 C3 y! k( @; [8 e- z- l, d
, B$ s) \( A7 K  function deploy(bytes code) { ... }. d/ d/ W# }( A1 O+ Z5 J9 F& W
% O- F$ X, R3 H, c) {! t
  function proxyCall(Registry r, bytes32 addr, bytes data) { ... }) i- F) }: z( g" S

/ h8 t( n$ _0 `}
* G; d+ d- G3 G! O  \
% j, y) |" p6 U- t* [  t1 E所以,如果你想部署一个合约,你需要用交易调用 deploy 函数,并以合约的 initcode(初始码)作为参数(一般来说,它是与 ABI 编码的构造函数参数连接的合约构造函数字节码)。这个函数把智能合约部署到链上,并且把合约地址加到注册映射表中。
1 b6 T+ y6 s8 L0 p9 \2 T& Q9 N* F# z
以这种方式,你可以通过注册表中的解析器创建相互引用并互相依赖的链下合约。那么,要是想让我们上述例子中的通道运行起来,我们就得通过注册合约来部署支付通道,在多签钱包的条件支付中解析出支付通道的地址。3 L" X8 S" q1 i& w6 h
# g! H- z* y* Y* M1 Y! S- s
###依赖
" B1 A7 r8 y) Y+ Z9 a4 D% m# i) C
  O; w5 f' x0 L6 A1 `5 p2 K注册合约允许我们做的就是可以建立互相依赖的链下合约,就像合约 A 依赖于合约 B,只有在 B 最终确定之后,A 才能确定(条件层级确定性)。
1 C* v  n, X6 E8 P) w+ N# d
5 m, ^' w. u1 \: W-以上我们可以看到,除非 Nonce 合约确定了,否则 PC 合约无法确定。-
$ a, ?. [( H# {1 c5 \, n# e3 b# w4 q/ N0 [8 u' f
你看,上面是一个比较基础的例子,我们要求当前合约基于另一个合约的布尔条件值。我们可以扩展这个条件,允许所谓的“原子状态转换”。
( A% r3 D; a( Y5 F$ I& k/ v% N
1 V$ x5 g  U$ H4 v4 C1 l###原子状态转换, z: X' L3 l$ i- i' V" \6 r( U

8 S3 y9 c/ ^( |3 v( c* r; A根据这种层级的依赖结构,我们可以进行原子状态转换,转换的同时,伴随着一些合约生效,一些合约失效。下面例子表明,一个 10 ETH 的支付通道,基于 nonce 值,转换为一个 8 ETH 的支付通道,加一个 2 ETH 的扑克游戏。
0 Q( b$ u% o* y0 W4 l0 w2 f) Z, ~3 n  [5 ?
-合约的有效性基于 nonce 值-
4 z2 ^# g& }  m
" k1 n7 w! A% f. X& a$ D4 i如果支付通道的双方都同意用支付通道里的 2 ETH 来创建一个扑克游戏,他们可以签署支付通道的余额更新变化,从(5,5)到(4,4),同时签署一个内置 2 ETH 的扑克合约,nonce 合约的 nonce 值是 4 的时候,这两个合约才会生效。
- L& l3 ?& {3 P) H- [/ n
& Q: U0 M& D2 o. o+ N9 E8 F-基于新 nonce 值的原子状态转换-/ B) I. t* S1 J: S, r8 K# j3 W- ~

" E* N  t* d" h当支付通道的双方都签署了支付通道和扑克合约的条件更新之后,他们可以签署 nonce 合约,使得 nonce 值加 1。一旦 nonce 值更新为 4,旧的支付通道状态就会失效,同时扑克合约和新的支付通道状态就会生效。9 d% f! n+ Q, y9 ?

) e1 j; y) \: K+ h有原子状态转换,代码升级就会变得容易。如果之前支付通道的参与双方想修复代码中的 bug,他们可以在更新余额的时候修复代码。当更新 nonce 值后,之前有 bug 的代码就失效了。; c: B+ |  x2 ?: ~" e. J: v( a

8 B- B4 R" P( G0 D# r5 J2 ^* `7 h下面有个例子,这就是基于“根 nonce”合约的一系列反事实合约:
- V5 e* ~1 i6 A
8 ^% O! f* `8 w( k8 K. {" j0 m根据这种架构,我们可以通过一个“根 nonce”合约有条件地更新所有链下合约的有效性。这允许我们可以根据参与方的需求,迭代地从状态通道中添加和删除链下合约。
; U3 x& F4 l8 P/ d# _8 H/ @6 E/ B! T2 ^" ^* h
配置通道
" {* @/ I1 K9 A4 p3 q+ c: G- N# f6 h4 X2 ^6 R1 p
假设我和阿剑想玩四子连珠的游戏。我们将会这样做:
2 G* a. K6 q: \8 K5 w% x
; s2 `/ O4 ~6 s8 |- Q! t: P  X部署根 nonce 合约、ETH 支付通道(PC)、ETH 条件支付通道(CPC)和四子连珠智能合约
8 E3 \: D6 {$ _0 `. W* C4 r/ F+ E9 r- M8 c! H% A6 j
向四子连珠游戏提交最新的签过名的状态# M* u3 g( K* h  L/ r6 g

+ U  w9 S8 s# B8 o+ w& D基于四子连珠的游戏规则确定 CPC
. u% r( H; K2 E( y9 z! p+ b( B. K
基于 CPC 确定 PC
! i$ [! ^) }: H' O' x& h+ `. @/ f2 L4 Y$ X3 J
向多签钱包提交已签名的条件支付(基于 PC 的最终确定状态进行支付)& X# M7 U, v5 _2 i% Z

& W5 q9 [, r2 i4 D9 y' n因此,我们可以一直开启其他状态通道,甚至允许我们重用已经部署在链上的四子连珠游戏的代码。下一次我们想要玩游戏的时候,我们只需要对游戏状态进行签名,然后提交到已经部署好的智能合约上。唯一需要实现的是取消现有链上代码的确定性,这是一个实现细节。
8 |2 [$ y. G( `/ r3 n& K, u7 @9 d# k' q& C( n% Y2 c+ _: \8 L
###注意:你不需要像我展示的四子连珠、CPC 和 PC一样,为你的合约加上这么多的依赖。无论你希望怎么做,这都取决于你和你状态通道中的伙伴。
, }5 _4 a9 V/ G% W1 N  W5 a4 T+ T! d; V: f3 I: j3 o1 l4 x
现在,假设阿剑的朋友 Hunter 想跟阿剑玩四子连珠游戏,但是他只跟我开了一个状态通道,这时候 Metachannels 就可以派上用场啦。
( V# h  b3 Q; v% ^  j! c: r: C2 A; v( ~
###Metachannels
, v) a( G2 |0 o# k; _* k2 D
& `# N& Z) f. q# CMetachannels 是状态通道上的虚拟通道(参见本系列 Part-4)。要创建一个 Metachannels,你需要两个想交互的参与者,他们各自有一个状态通道,并且通道的另一方是同一个人。两个参与者同意创建一个新的合约,通道另一方(即共同的中心)会与他们一起创建一个代理合约,指向两个参与者的新合约。看起来就像下面这张图:6 j  L: m& p& d% I4 L! K

+ w( V  R, F, w% B$ f; V-广义虚拟状态通道 = Metachannels !-
) d% ?6 J5 w: J7 ~' ]; X# X/ e
我们可以无限地扩展这个模型,让我们想跟谁玩四子连珠,就能跟谁玩。
" h8 i; |, c$ \
6 i; ?! M) ^8 {& T###广义状态通道的优点
8 i1 m* \5 c6 s# R1 P6 d! R2 [& g- C+ B
引导——因为我们所需要的只有一个多签钱包,我们可以很容易在链上现有的多签钱包中选择一个开始开发。& n" l* M8 _; j, ^

  i' z5 `: x5 `' N0 Y7 h隐私——除了参与者之外,没有人知道状态通道内发生了什么,对于外部世界来讲,参与者之间只有一个多签钱包。
* E  z8 u  ^4 W( Y" m2 {- l* W& W* q; L" X) W0 A
可升级——如果链下代码中有 bug,所有参与者可以通过链下的操作修复 bug,不需要进行任何链上操作。" o. q" f% @. f, i3 {# U' x
$ B4 x  h, ^: L4 A! R
可重用——这种方法有效地鼓励了通用链上库的形成,让所有状态通道都可以引用。
0 i$ _4 l4 _2 w' |4 o
$ a: W/ G/ ?. A* W9 s###Part-6:反讹诈' c$ @9 w) i4 H# C3 W" E! _
  k& r. `% R' t3 g' g
在我下一篇博文中,我将会深入讲解状态通道中的反讹诈。讹诈即是说参与者向通道提交一个对自己更有利的较早状态。博文的焦点是 Pisa.
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

fzny61226 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    22