Base58 JavaScript实现

时间:2019-05-10 08:34:18

标签: javascript ipfs base58

我正在使用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

2 个答案:

答案 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

希望这会有所帮助:)