我正在使用IPFS-multihash方法将IPFS哈希存储在智能合约中。 为此,我需要解码base58格式:
QmaozNR7DZHQK1ZcU9p7QdrshMvXqWK6gpu5rmrkPdT3L4
以二进制形式(以十六进制表示):
1220b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
但是我无法在浏览器中使用bs58模块(我尝试使用Browserify)。您能告诉我在base58中用于解码和编码的javascript实现,这样我可以在不使用node_modules的情况下实现上述方法吗? 还是可以告诉我如何完全使用Browserify逐步使用节点模块?
运行第一个命令后,将在“ node_modules”文件夹中创建“ bs58”文件夹。.....没有lib文件夹。您能指导我使用必须使用的确切命令吗?
npm install --save bs58
npm install -g browserify
browserify < lib/bs58.js > lib/bs85.bundle.js
我的文件结构有点像这样:
-node_modules
-src
|___index.html
|___js
|____app.js
答案 0 :(得分:0)
对我来说,它是通过使用Base58 implementation并将结果转换为十六进制来工作的。
var MAP = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
var decoded = toHexString(from_b58(ipfsHash,MAP)).toUpperCase();
感谢Chris G
答案 1 :(得分:0)
根据您的用例,仅处理Base58可能不够。
考虑使用官方的cids库来对您的合同进行过时验证。
IPFS内容标识符称为CID(docs)。当前默认值为CIDv0(等于Base58btc中的原始多哈希值),但CIDv1是已经在野外使用的可选升级(它允许编码为任意基数)。 IPFS it will switch to CIDv1 in Base32作为将来的新默认设置(但每个人都可以随意使用其他基础):
<cidv0> ::= <multihash-content-address>
<cidv1> ::= <multibase-prefix><cid-version><multicodec-content-type><multihash-content-address>
要使用cids
库将完整的IPFS CID转换为十六进制,您可以执行以下操作:
const cidHex = new CID('bafkreigh2akiscaildcqabsyg3dfr6chu3fgpregiymsck7e7aqa4s52zy').buffer.toString('hex').toUpperCase()
或者如果您只关心原始的多哈希,则可以通过.multihash
从CID中提取它:
const mhHex = new CID('bafkreigh2akiscaildcqabsyg3dfr6chu3fgpregiymsck7e7aqa4s52zy').multihash.toString('hex').toUpperCase()
cids
library应该可以与browserify和其他捆绑程序一起正常工作。
也有prebuilt version for the browser。
希望这会有所帮助:)