我们可以用Substrate提供的一系列RPC方法和Runtime进行交互,也可以查询链上的数据,比如查询链上账户的余额、Session模块的当前session等,substrate查询storage数据的方法是如下定义的:
![](https://img.haomeiwen.com/i12133671/80cf75019a68f99e.png)
调用storage方法的时候需要提供一个storage key和一个可选的区块哈希值。下面是用curl命令查询Session模块的当前session的例子:
![](https://img.haomeiwen.com/i12133671/629583f9a0fdf9ca.png)
其中params里以0x开头的字符串就是storage key。Substrate对不同的storage类型,key值有不同的计算方法。
1、storage value类型
对于在Runtime Module里storage项是value类型,key值使用以下公式计算:
twox_128(ModuleName) + twox_128(StorageItem)
以上面提到的session为例,ModuleName为Session,StorageItem为CurrentIndex。
![](https://img.haomeiwen.com/i12133671/ee9872fb9b470431.png)
实现代码如下:
![](https://img.haomeiwen.com/i12133671/619bc442d3a33de2.png)
![](https://img.haomeiwen.com/i12133671/f316003875536b32.png)
2、storage map类型
![](https://img.haomeiwen.com/i12133671/7b51c772328cc83f.png)
忽略中间一行,上面显示的就是一个map类型,它保存的是某个账户的余额。map类型key值计算公式是:
twox_128(ModuleName) + twox_128(StorageItem) + blake2_256(StorageItemKey)
T::AccountId就是StorageItemKey。求key值的代码如下:
![](https://img.haomeiwen.com/i12133671/9081d3808d749c90.png)
![](https://img.haomeiwen.com/i12133671/e5a32d1b5884cb74.png)
3、storage double map类型
暂时还没用到,以后再说哈。
通过以上的方法得到key值以后,就可以把它作为params参数值调用RPC获得存储在链上的值了。
注:以上的计算公式适用于Substrate的最新代码,即metadata版本是V10。对于metadata V8及之前版本,计算公式有所不同,storage value的key值按下式求得:twox_128(ModuleName + " " + StorageItem)
网友评论