轻量级演算的目的是让节点在不存储全状态,只需要存储状态根的情况下也能执行和验证交易。比特币的轻节点客户端能够验证交易的有效性,并不能执行和演算交易。轻量级演算可以用于跨链过程中演算和验证其它链交易、可以用于多链中不同链验证节点随机洗牌后切换节点、可以用于快速同步其它链数据、可以用于主-子链结构中,子链节点作恶没法演算子链节点数据问题等。
轻量级演算实际上是构造在轻量级客户端之上,轻量级客户端只存储状态树根。轻量级客户端概念,假设状态转换可以用数学的方式进行表达,则表达形式为Bu_ST(S, B) -> S’,其中S、S’代表状态,B代表区块(或者是T,代表交易),那么Bu_ST就是状态转换函数。理论上,很多相似的协议,都能通过同种协议变形进行变更。
转换过程如下:
S变成S的状态根,就像S的32字节Merkle根哈希
B变成(B,P),其中P代表‘证人’,即证明执行B可访问的所有数据的值的一组Merkle分支
Bu_ST变成Bu_ST’,以状态根以及区块+证人(数据)做输入,然后在执行区块需要读取账户信息、存储密钥或其他状态数据时,使用证人做‘数据库’数据库(若证人不包含请求数据片段,则退出并提示错误),最后输出新状态根
也就是说全节点只存储状树根,打包区块与Merkle分支(‘证人’)是验证节点的事;然后由全节点下载并验证这些大(带证人数据的)区块。所以轻量级全节点与常规全节点是完全可以在同一个网络中和平共处的;设置个状态转换节点,为区块B附上验证其所需的证人数据,然后在另个都是轻量级节点网络协议中广播这个(B,P);验证节点的Leader在该无状态网络上打包区块后,把附带的证人数据去掉,然后重新在常规网络上进行播。
以上都为理论上的描述,以下我们会以流程的方式对轻量级验证进行说明,轻量级演算节点只存储状态的root信息,观察客户端存储链的全状态信息。轻量级演算节点想要执行交易tx,在链上对应的状态为C,轻量级演算节点并不知道C的状态,所以它会向观察者客户端请求C的状态以及会影响C变化的Merkel分支Witness: {R, A, C, D, B},轻量级演算节点获取相关的数据后会把所影响的C状态及Merkel分支等RW_Set广播给其它节点,不同节点收到交易及相关依赖后执行和验证交易。在图的右边看到了轻量级演算用于各种各样的场景,这个部分在开端就又阐述,此处滤过。