Hi 游客

更多精彩,请登录!

比特池塘 区块链前沿 正文

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

fzny61226
109 0 0
###什么是广义状态通道?9 Q* o& B" c1 M
  q; g8 W0 b% n
广义状态通道的意思是,用户可以用同一个通道做多种不同的事情。
9 e  E6 S8 d, t6 W, W
3 W" Q6 K5 r4 x! R2 i$ R. E% T###广义状态通道有何意义?% Z6 x; [+ O- @. h  r
2 l4 u! P. e$ R9 p
没有状态通道,任何以太坊上的 App 都必须承担高额手续费,忍受延迟,因为 App 高度依赖于链上交易。使用 App 定制型状态通道,我们可以创建更经济更高效的 App ,用户只要在启动和关闭 App 时支付就可以了。广义状态通道更进一步地改善了这种情况,用户只需要在关闭 App 时支付。/ U8 ]: T9 U2 O% a, d/ l% j+ ^

! V4 b- @2 a$ G$ J+ D9 Y注意:当我说“支付”的时候,我的意思是向链上提交交易。. d  S) {5 `5 f; z5 Z8 e& W
) w/ ~9 v) Q! {6 s' d" z7 {
###广义状态通道; e: J, f9 h* z- W; J, F, {

& E( z  |9 p6 \) ?% I在技术上,要开启广义状态通道,所需要求与 App 定制型状态通道一般无二:一个足够强大的多签钱包就足够了,参与者用于锁住状态。区别在于,用户无需为每一个应用都“安装”链上组件——即便要使用多个应用,该多签钱包也将是用户所需的唯一链上组件。
  s" Y: `1 p. C5 A4 n/ M8 M8 w% u+ X" h9 a) j, p# [
App 定制型状态通道(回顾)
: W3 j' F. X) x: M; @) i; Z3 J6 `5 r
鉴于在部署链上组件这一点上差别极大,我们先回顾一下我们在前面的文章中讲到的内容。在前文中,我们遵循下列步骤在多方间打开一个 App 定制型状态通道:# e. X- U5 t; X& ]6 E( n

: U% u# c: k) A3 T$ [与相关方一起,部署一个多签钱包,把规则集(用来解析发送给钱包的交易)加到链上。
- P% m$ P  l9 g2 W) M) v/ r' S# l, M# Y, U8 m9 N+ g. W
在他们进行不同的操作时,在参与者之间广播已签名的消息。
/ H2 z( ?1 Z' I" P
5 d1 N- r" v5 f  k# F4 g当参与者准备好开启或退出通道时,他们会把所有参与者签名的最新状态提交到多签钱包,多签钱包根据内置的规则集,决定如何在参与者之间分钱。
+ ?1 [" r1 e: [7 ]# r6 d0 v: y' ~9 j
这种配置看起来就是下图的样子:
& E: w0 d" G9 U2 C( Y6 }9 x  v$ R. U
-在任何时候,Bob 和 Alice 都可以把双方都签过名最新状态提交到多签钱包,来配置通道。-
% f9 l% B8 @" A& j8 @- s. p. N
' O- h6 j" s. p1 n) _" ^' {注意,上述过程所用的多签钱包只支持符合其内置规则集的 App 。再次强调,广义状态通道通过“反事实实例化(Counterfactual Instantiation)”扩展了 App 定制型状态通道的功能:允许新的 App 安装在现有的状态通道中。
3 {4 v9 m1 i; N0 M6 N+ J
% ^* P5 C4 w8 C: g" b" w###反事实实例化
" k2 y( w* L3 z) @% [5 c4 u/ E* K- C7 ?1 L. }6 N9 R$ {) ]
反事实实例化是一个通道内成员同意接受链下智能合约约束过程。这是一个比较奇怪的概念,因为它意味着“链下代码即法律”(给 Liam Horne 点小费吧,这是他提出的),一下是一个简单的例子:
; {$ I# x/ b+ a; \0 e6 f' ^( u) U5 b
5 v. q/ Q  ~' q, ]/ [, PSo Easy (作者你是认真的吗?)-
: G2 e/ _! G) q* G) M1 o  l# }( V7 a& R+ e8 C6 G
要创建广义状态通道,我们唯一需要的就是一个多签钱包。我跟阿剑各往钱包了存了 5ETH,并且决定要在我们之间创建一个支付通道。所以,我们在链下创建了一个支付通道,并且都对合约代码签过了名,同意在关闭通道时部署它。我们同样也对基于已部署的支付通道的最终状态、发往多签钱包的条件支付请求签了名。
# m# ^4 B2 L1 x; C+ M0 Q6 V- T3 h; x0 k
那么,使用同样的方式——所有参与者都签名,我们不仅能保证状态的可信,也能保证代码的可信。所以,只要我们都签署了代码,我们就可以像该代码已在链上部署的那样,放心地签署相关的状态。两种方式最主要的不同就是,我们只需要在想要结算状态通道时部署代码。2 u" c- t) q; }/ x" x

3 ?7 T' n& `% r2 H那么,当我们想结算时的时候,我们需要:6 K5 y4 w; }8 \4 b
) z( a$ D' ?3 g. L) ~
部署支付通道合约
& X  U# L, A6 M  O$ z1 M
; A$ r; N& \, k% g# F% |向该合约提交所有参与者签名的最新状态2 f, l0 S; O3 L0 b3 X8 n5 I" t
' y& p, |, Q9 e1 X+ v* i& w
(基于支付通道的余额)将条件支付请求提交给多签钱包
! k+ B1 w( Z1 j- ^( a5 T8 S/ J* r- Z* {' z2 o# x, `5 P& }
多签钱包给各参与方支付7 O. a% q5 l% E0 f; G! j% m
/ b" k( l  u) F' f
那么,反事实实例化使我们可以假设链下代码已经被部署到了链上,并据此行动;因为我们可以在任何时候部署上链并提交最新状态。但是,这就有个问题——我们如何在没有链上地址的情况下签署状态转换?这就是注册合约的用武之地!
9 j; Q5 W! i9 O5 B
8 T2 q$ ]$ i) W3 T7 K* ]###注册/ |0 Z( R% W$ k
% l* r# E! E" |8 C9 i/ Q. A* T) p  h, q% [
从比较抽象的层面上讲,注册器智能合约允许我们做以下操作:- e- w5 m0 m& S2 q% T

2 D/ U2 t* g8 j1 z基于合约字节码,创建一个链下地址(cfAddress)
/ w- ], i2 U, D; K8 A5 g& C$ c8 Q" g, N0 @- r# h
部署智能合约,并把 cfAddress 和链上地址进行映射+ s& t% b$ P- V0 x/ n& }- B
; X4 I$ k7 z, K* E; \
通过 cfAddress 执行链上合约代理调用
) q# d+ x7 r( M/ ?3 s0 w7 S$ t- b: z! A: Y4 L, x! m. m8 i
注册合约伪代码:
& s$ S" T) V, W4 n2 v+ t6 Z2 c% r" F4 U# C  V
contract Registry {
% i9 N, [3 S8 w+ ?
0 }1 Q% r' Y+ ~  mapping(bytes32 => address) resolver;
5 A0 d5 i0 u; O3 _; h; {
2 T  s/ I4 q' d+ l# s  function cfAddress(bytes code) returns (bytes32) { ... }5 p) ]- N& T- w

% \' N. j2 x  z: m  function deploy(bytes code) { ... }! @$ G. T: e7 d; p1 z% U8 ]2 A: u
. Y( Q8 {% C6 b
  function proxyCall(Registry r, bytes32 addr, bytes data) { ... }. ?: [4 |) E: R4 e1 Z4 H" ^

. X7 I; A; c6 @8 E$ b) v}9 L9 C' x# Y0 J" @5 m- c$ z( _
! Z' r2 M  y: y/ O' a; m* W
所以,如果你想部署一个合约,你需要用交易调用 deploy 函数,并以合约的 initcode(初始码)作为参数(一般来说,它是与 ABI 编码的构造函数参数连接的合约构造函数字节码)。这个函数把智能合约部署到链上,并且把合约地址加到注册映射表中。6 H0 Z7 {4 K- T. H5 t3 q
' o) I3 T3 m: T& d2 h* F! z' T
以这种方式,你可以通过注册表中的解析器创建相互引用并互相依赖的链下合约。那么,要是想让我们上述例子中的通道运行起来,我们就得通过注册合约来部署支付通道,在多签钱包的条件支付中解析出支付通道的地址。
: @) o  N) O" T' O. X# o; n4 {+ b% Q4 ?2 z- g3 c. o
###依赖) o& X0 A/ ^/ D
* ~: X! V3 u* |4 L: L  \
注册合约允许我们做的就是可以建立互相依赖的链下合约,就像合约 A 依赖于合约 B,只有在 B 最终确定之后,A 才能确定(条件层级确定性)。: b9 d3 p! e. y
- V+ ^$ }9 o1 e& W7 G
-以上我们可以看到,除非 Nonce 合约确定了,否则 PC 合约无法确定。-
. \+ H1 n2 X7 J& v" E, K& S2 j& g
3 z3 f8 h! O$ e/ P你看,上面是一个比较基础的例子,我们要求当前合约基于另一个合约的布尔条件值。我们可以扩展这个条件,允许所谓的“原子状态转换”。$ X( v9 U5 S, Z  g

8 y5 F& O& N2 A: q+ z$ d$ p3 ^+ u3 n% t###原子状态转换0 i; q9 Q' \* I$ Q+ H
# \  b8 f/ F2 ?* e1 h. N) Z
根据这种层级的依赖结构,我们可以进行原子状态转换,转换的同时,伴随着一些合约生效,一些合约失效。下面例子表明,一个 10 ETH 的支付通道,基于 nonce 值,转换为一个 8 ETH 的支付通道,加一个 2 ETH 的扑克游戏。
% D/ l0 e; j/ r/ g# w, ]) B, M% z7 K
-合约的有效性基于 nonce 值-$ c/ }2 z8 |4 S- @% W( Z
' }" m$ z/ b: c
如果支付通道的双方都同意用支付通道里的 2 ETH 来创建一个扑克游戏,他们可以签署支付通道的余额更新变化,从(5,5)到(4,4),同时签署一个内置 2 ETH 的扑克合约,nonce 合约的 nonce 值是 4 的时候,这两个合约才会生效。. G2 I: M  U7 |
  O" K4 `7 M. m1 d1 F3 L$ B
-基于新 nonce 值的原子状态转换-9 G& j  g  V) E. x6 X/ H0 F
! V0 E% U1 ]  B* d& X- c
当支付通道的双方都签署了支付通道和扑克合约的条件更新之后,他们可以签署 nonce 合约,使得 nonce 值加 1。一旦 nonce 值更新为 4,旧的支付通道状态就会失效,同时扑克合约和新的支付通道状态就会生效。
  ?( n0 l4 h* c4 F$ b8 K
  d: e) ^& t- v$ z- X4 s有原子状态转换,代码升级就会变得容易。如果之前支付通道的参与双方想修复代码中的 bug,他们可以在更新余额的时候修复代码。当更新 nonce 值后,之前有 bug 的代码就失效了。
) V  j5 W3 N7 j/ m/ o4 l/ _! C. R
/ _+ K4 Y  o* S6 J下面有个例子,这就是基于“根 nonce”合约的一系列反事实合约:
6 y! ]* z. B6 X
1 `8 B3 @/ T  N) ~2 R根据这种架构,我们可以通过一个“根 nonce”合约有条件地更新所有链下合约的有效性。这允许我们可以根据参与方的需求,迭代地从状态通道中添加和删除链下合约。& |# j+ y7 N& m9 \
; ~6 V% O, W' \9 Z) f
配置通道
* L3 [* ?  l! F! z, _1 ~7 W: K7 E
7 I+ C) D/ e5 T$ Z# }8 @3 f" B# R假设我和阿剑想玩四子连珠的游戏。我们将会这样做:9 {  }1 U& x+ B. R" \

: b5 \0 ^9 s2 L" U: I! @1 n9 l部署根 nonce 合约、ETH 支付通道(PC)、ETH 条件支付通道(CPC)和四子连珠智能合约, D9 [# n) u$ s
0 a( g1 f9 f3 B
向四子连珠游戏提交最新的签过名的状态
9 ]+ d- r8 W. M; Y3 h. e* s4 @- A, i: O: [+ l7 G/ X
基于四子连珠的游戏规则确定 CPC1 ?# D& G- W! B
( b! b3 b+ r  v" V( e8 G, i
基于 CPC 确定 PC
4 @" R2 R1 o& p! A* Z3 ]( G, z- W" n8 [: t
向多签钱包提交已签名的条件支付(基于 PC 的最终确定状态进行支付)
! z4 N' V8 t5 U8 S
- r# v7 B: ^) |0 t7 q' Y因此,我们可以一直开启其他状态通道,甚至允许我们重用已经部署在链上的四子连珠游戏的代码。下一次我们想要玩游戏的时候,我们只需要对游戏状态进行签名,然后提交到已经部署好的智能合约上。唯一需要实现的是取消现有链上代码的确定性,这是一个实现细节。+ K: S+ h- l6 L6 n- t2 M

4 p, x2 g8 w8 T- ]1 |###注意:你不需要像我展示的四子连珠、CPC 和 PC一样,为你的合约加上这么多的依赖。无论你希望怎么做,这都取决于你和你状态通道中的伙伴。
, I" Y7 V' P& D; ]/ ~" r! {0 C0 U" A$ R' I4 p! q
现在,假设阿剑的朋友 Hunter 想跟阿剑玩四子连珠游戏,但是他只跟我开了一个状态通道,这时候 Metachannels 就可以派上用场啦。
* W+ }/ W, Y+ G3 s- N7 J- q3 D0 G4 ]* A, Z* }
###Metachannels, G& _+ u6 H+ n2 X% W3 U

' n+ a0 s5 v" [# A1 }) L5 oMetachannels 是状态通道上的虚拟通道(参见本系列 Part-4)。要创建一个 Metachannels,你需要两个想交互的参与者,他们各自有一个状态通道,并且通道的另一方是同一个人。两个参与者同意创建一个新的合约,通道另一方(即共同的中心)会与他们一起创建一个代理合约,指向两个参与者的新合约。看起来就像下面这张图:$ r3 t+ E  U6 S# o& V9 K

8 n# U$ r) d! q8 b0 e' K8 ~-广义虚拟状态通道 = Metachannels !-2 w& B8 d4 w* r" z# `. B, h$ g# [
- V* t+ ~1 _+ u: z
我们可以无限地扩展这个模型,让我们想跟谁玩四子连珠,就能跟谁玩。. `1 ?' f/ C& ]. j

8 J5 W2 a5 ~7 D. w, i) l###广义状态通道的优点- s" M& L) o( m* M. @0 J

" b/ N. C5 p! o& U引导——因为我们所需要的只有一个多签钱包,我们可以很容易在链上现有的多签钱包中选择一个开始开发。
3 x% M4 O3 h- M, Q# j& S0 R7 h- v  m+ q: j" @: I" D
隐私——除了参与者之外,没有人知道状态通道内发生了什么,对于外部世界来讲,参与者之间只有一个多签钱包。
, o6 B5 C) I5 K- _& G( q/ ^
) Z2 t2 z. ?3 T/ E" N6 E可升级——如果链下代码中有 bug,所有参与者可以通过链下的操作修复 bug,不需要进行任何链上操作。
# z: V1 {1 `" I" Q& v$ v: \, E4 V# {0 G3 y
可重用——这种方法有效地鼓励了通用链上库的形成,让所有状态通道都可以引用。
! Q1 t+ r: C) z' @7 g' P
9 L. [2 r9 c0 v% @$ R. d###Part-6:反讹诈, t2 c* [0 e$ u( P3 c5 _

4 [, h0 q6 }' ~; ], x$ M在我下一篇博文中,我将会深入讲解状态通道中的反讹诈。讹诈即是说参与者向通道提交一个对自己更有利的较早状态。博文的焦点是 Pisa.
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

fzny61226 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    22