账户抽象
Substrate使用多组公私密钥对来代表区块链网络的参与者。
Substrate节点使用提名权益证明(Nominated Proof-of-Stake,NPoS)算法做为共识机制来选择验证人,验证人和提名人可能拥有大量资金,因此Substrate的抵押模块引入了帐户抽象,以确保资金安全。
这些抽象包括账户密钥(Account Keys)和会话密钥(Session Keys)。
账户密钥包含:
Stash Key(储藏密钥):储藏账户用于存储资金,私钥应当尽可能安全,最好放在冷钱包中;Controller Key(控制器密钥):控制器账户代表储藏账户发出的信号,应仅持有少量资金用于支付交易费用;
会话密钥是保存在验证人节点客户端中的“热”密钥,验证人使用会话密钥对共识相关的信息签名,此密钥不应持有资金。
可以声明任何数量的会话密钥,默认的Substrate节点使用4个会话密钥。
实际应用中,验证人将所有会话公共密钥合并为一个对象,使用“控制器”账户对公共密钥集进行签名,并发送交易以在链上注册密钥,这部分内容在之前的文章《搭建自定义Substrate区块链网络》中已经有过实际运用。
资源和权重
区块链上的可用资源是有限的,这些资源包括内存使用量(memory)、存储(storage)、计算量(CPU)、交易/区块的大小、状态数据库的大小。不同的区块链平台对这些资源可能定义了不同的名字,例如EOSIO把这些资源抽象成RAM、CPU、NET,但本质上是一样的。
Substrate有几种机制可以管理对资源的访问,防止链中的各个组件消耗过多的资源。
权重是用于管理验证区块所需时间的机制,不用于限制对其他资源的访问。
Substrate将一个权重单位定义为固定参考硬件的执行时间,硬件标准是Intel Core i7-7700K CPU、64GB内存、NVMe固态硬盘。
在参考硬件上进行基准测试可以使权重在各个运行时之间具有可比性,从而可以使不同来源的软件组件具有可组合性。
权重(Weight)代表了验证区块必须的有限时间,包含了计算周期和存储I/O,权重在源码中只是一个数值:
除了影响手续费外,权重系统的主要目的是防止区块被填充太多的交易,以至于需要过长的时间来执行这些交易。
在处理区块内部的交易时,system模块会计算该区块的总长度(以字节为单位)和该区块的总权重,如果这些数字中任何一个超出限制,则该区块将不在接受其他交易被打包进来。
这些限制在Trait frame_system::Trait中定义:
type MaximumBlockLength: Get<u32>type MaximumBlockWeight: Get<Weight>
分别表示最大区块长度和最大区块权重。
还有一个可配置的比率参数
type AvailableBlockRatio: Get<Perbill>
表示正常交易可用的区块部分,其余的只能由业务交易使用,可以应用于system模块管理的任何资源限制,包括区块权重和区块长度。
例如,如果区块长度限制为1MB,AvailableBlockRatio设置为80%,则所有交易只能填充该区块的前819.2KB,剩余部分只能由操作类填充。
链下工作机(Off-Chain Workers)
目前区块链业务中大部分操作都是在链上完成的,若操作结果的时间具有不确定性,则该操作不适宜在链上进行,会影响达成一致共识的时间。
链下操作适用于以下场景,可以通过Substrate链下工作机完成:
计算量大的,委派给某个节点计算,然后写回到链上去,区块链上需要有核实机制;处理时间不确定,可长可短的,如通过http/https对外存取数据;某类节点可作专业分工化;某类工作存储量大的,不需要每个节点都存储的;
Substrate链下工作机有以下特点:
链下工作机运算和区块生成计算是异步操作,如进行大量计算操作时,不影响区块的生成;能读取区块链上的状态信息;可进行具签名和不具签名交易(系统交易);可通过https API获取外部互联网数据;有专属链下工作机的存储系统;可指定只有某些节点运行;
链下工作机的运行机制如下图所示:
链下工作机可以访问扩展的API来与外部世界通信,具体包括:
向区块链提交具签名和不具签名交易,以发布计算结果;一个全特征的HTTP客户端,允许链下工作机访问外部服务并获取数据;访问本地密钥库,以签署或验证交易;在所有链下工作机之间共享一个本地key-value数据库;一个安全的局部熵源,用于生成随机数;访问节点的精确本地时间,以及睡眠和恢复工作的能力;
在runtime实现中,可以通过以下函数初始化链下工作机:
fn offchain_worker(block: T::BlockNumber)
链下工作机的运算结果不受常规交易验证的约束,应该使用其他一些验证机制(如投票、取平均值、检查发送者的签名等)以确定哪些信息可以上链。
关于链下工作机还有很多可以讲的内容,这里只介绍一些基础概念,具体的使用方法在后续的文章中会介绍。