在前篇文章《以太坊 + IPFS 数据存储可行方案》中有提到这样的数据存储方案,在以太坊上只存储文本的哈希值以节约gas。那么,问题来了,IPFS是如何存取文本的呢?
前期做网站的时候往IPFS中存过图片和视频,存文本稍微有点不同。把文档找来复习下。文档在这,https://github.com/ipfs/js-ipfs 。存取文本不是太难,有些固定的格式。
存文本
1 2 3 4
| const content = Buffer.from('hello lemooljiang!') let res = await that.ipfs.add(content) console.log(345, res[0].hash)
|
读文本
因为文本会自动转成utf-8格式存储,所以,读出来还要转换成字符串。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| let con = await that.ipfs.cat(hash) let t = that.utf8ArrayToStr(con)
utf8ArrayToStr(array) { let out, i, len, c let char2, char3 out = "" len = array.length i = 0 while(i < len) { c = array[i++] switch(c >> 4) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: out += String.fromCharCode(c) break case 12: case 13: char2 = array[i++] out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F)) break case 14: char2 = array[i++]; char3 = array[i++]; out += String.fromCharCode(((c & 0x0F) << 12) | ((char2 & 0x3F) << 6) | ((char3 & 0x3F) << 0)) break } } return out }
|
方法就这两个,试了下,很快就成功了。这样的话,往以太坊上存东西就不会太费钱了,而且这种方案正在被越来越多的人采用,因为只要是IPFS网关就可以根据文本的哈希值直接读出文本的内容来,是不是很方便呢?! 这是我上传的一段文本哈希QmZcLE9qPzzyeJqT1yxErZcxbCSufXWSJRhywGLChegyL8
,大家可以使用任意的IPFS网关去读下试试,比如这样: https://ipfs.eternum.io/ipfs/QmZcLE9qPzzyeJqT1yxErZcxbCSufXWSJRhywGLChegyL8
This page is synchronized from the post: ‘上传文本至IPFS / 网络研习社#62’