将quorum区块联盟链中 input字段转为中文的方法(包含隐私交易)
本文基于web3,通过RPC窗口调用quorum区块联盟链(基于以太坊)的数据。
一、DApp调用以太坊数据存在的问题
在quorum中,sendTransaction支持数据的传送,其中有data字段用来存放数据。但是data字段只支持hex格式的数据,因此我们可以利用web3.toHex将任意数据转化为Hex格式数据,这样我们可以通过web3.toHex这个命令传送任意字段。
但是这样存在两个问题:
一、我们getTransaction得到是一个Hex格式的数,但是我们想要的中文。在web3 1.0版本中有web3.HextoUtf8命令可以转化,但是geth版本目前还是web3 0.20.7,无法使用该命令,我们需要自己编函数将Hex格式数转为中文。
二、quorum是有私有交易功能的,私有交易的过程比公开交易多了一步,在将input写入tx中时,会先将input在enclave中通过双方公钥转化一次(具体流程自己谷歌 quorum private transaction),我们最后得到的input已经不是原始的input,通过对交易的input转码,只能得到一堆乱码,我们必须先对私有交易的input预处理,才能得到我们想要的总问。
二、公有交易Input转码
直接写代码,可以将hex格式转为UTF8/中文,这是站内一个大神写的,原文章链接在后面参考资料里面。愿文章没得现成的代码,我将代码贴出。这个直接用在js或html文件里面。
encodeUtf8: function (str) {
var tempstr = ''
try{
tempstr = decodeURIComponent(str.replace(/\s+/g, '').replace(/[0-9a-f]{2}/g, '%$&'));
}
catch(err){
for (b = 0; b<str.length; b = b+2){
tempstr = tempstr +String.fromCharCode(parseInt(str.substr(b, 2),16));
}
}
return tempstr
},
三、私有交易Input转码
Quorum中私有交易多转化了一次,导致我们解决,我们需要将tx中的input预处理转为原来的Input,我找了一段时间,发现官方有一个命令可以解决eth.getQuorumPayload(string),string为交易中的input值,返回结果为原有的Input值。在quorum命令行中可以实现这个功能。
但是当我在前台利用web3.eth.getQuorumPayload()进行调用时,提示我getQuorumPayload not defined。根据字面意思,就是这个变量未被定义,原来我js功底差,不知道怎么调,搜索了一下,关于这个东西的介绍的很少,只有几个网页,介绍的方法也不行。
我估摸就是web3里面没得这个东西,这个是quorum自己加的一个东西,我在web3 0.20*和web3 1.0 版本说明中都没看到这个命令,查看web3.eth也没看到这个命令。我就想着看看其它命令是怎么实现的。
然后在网页控制台搜了一下,发现在web3.js文件和eth.js文件对这些变量进行了定义,而且定义的很简单。我就去DApp的文件里面找到了web3的包,Dapp这个文件夹名字为node_modules,这是node.js在npm后产生的。在里面找到web3的包,找到web3.js、eth.js里面的var methods = function (){}里面把getQuorumPayload()定义上即可(只需改一个即可,建议改eth,在web3.js里面改,命令需要改成web3.getQuorumPayload())。定义代码如下:
var getQuorumPayload = new Method({
name: 'getQuorumPayload',
call: 'eth_getQuorumPayload',
params: 1,
inputFormatter: [utils.toHex],
outputFormatter: utils.toHex
});
再在return那里加上getQuorumPayload即可,注意这里需要一一对应。改完之后保存,再次在js文件里面运行web3.eth.getQuorumPayload()就可以正常使用了。
参考资料:
1、[https://docs.goquorum.com/en/latest/Getting%20Started/api/]
2、https://blog.csdn.net/CHENYUFENG1991/article/details/81259248