【问题标题】:Dogecoin address validation, on nodejs狗狗币地址验证,在 nodejs 上
【发布时间】:2014-03-27 16:47:48
【问题描述】:

我正在尝试使用 node.js javascript 验证狗狗币地址。

但我仍在努力理解算法。

我当前的 node.js 版本是 v0.10.22

据我所知(如果我错了,请纠正我)它的狗狗币地址与比特币地址没有什么不同。

所以我尝试执行以下操作

  1. Base58 解码地址
  2. 对解码后地址的一个sha256(两次sha256)计算返回结果的sha256
  3. 将 sha256 结果的前 4 个字节与解码地址的后 4 个字节进行比较(我认为我在这里犯了一个错误)..

当我尝试将其写入 javascript 时,base58 解码结果是正确的,当我尝试从解码值创建缓冲区时,它会抛出错误,指出该值是 not 正确

var decodedHex = new Buffer(decodedBase58Result,'hex')

上面会抛出一个错误,如果我执行decodedBase58Result.toString(),它将字符串化脚本继续但不返回预期结果的数字。

那么,有没有办法解决这个问题? 不依赖第三方 api 调用


更新: 我研究了很多,我找到了一个客户端验证器,我用一小段代码制作了一个 npm 包

在不依赖任何第三方 api/服务调用的情况下验证地址。

【问题讨论】:

  • 你能举一个有效的狗狗币地址的例子吗?
  • @alex 一个狗狗币地址DBKh7QAP9gkXncVK32jtfae4QXChPwsyKH 及其base58 解码值5.868133917508844e+59
  • node-dogecoin 公开了validateaddress 命令。您可以使用它,尽管我不确定这是否算作“第三方 api 调用”。
  • @JamesAllardice 是的,我见过那个模块,它需要一个狗狗币守护进程来执行命令,验证是我唯一想做的事情,对于这么简单的事情来说似乎有很多额外的东西.

标签: javascript node.js cryptography bitcoin dogecoin-api


【解决方案1】:

我为此编写了一个模块 (coinstring)。它是CryptoCoinJS 项目的一部分,该项目有很多您可以使用的组件。使用非常简单:

npm install --save coinstring@0.2.0

例子:

var coinstring = require('coinstring');

//0x1E => for public Dogecoin addresses
var isValid = coinstring.validate(0x1E, 'DBKh7QAP9gkXncVK32jtfae4QXChPwsyKH');
console.log(isValid); // => true

这也适用于浏览器。希望这会有所帮助。

【讨论】:

    【解决方案2】:

    decodedBase58Result 对于DBKh7QAP9gkXncVK32jtfae4QXChPwsyKH 将是1e43d1c5e88853622efe39e7a838cebf01cf3029589a614274

    crypto.createHash('sha256').update(crypto.createHash('sha256').update((new Buffer('1e43d1c5e88853622efe39e7a838cebf01cf3029589a614274', 'hex')).slice(0,21)).digest('buffer')).digest('buffer')
    <SlowBuffer 9a 61 42 74 97 0b 64 ae 2e 7f d6 f8 b1 81 90 12 f3 5e 3a 0b a1 f4 f2 c2 47 fe 20 7e 4f a1 27 25>
    

    将地址的最后 4 个字节 - ...9a614274 - 与生成的哈希 - 9a614274... 进行比较,如果匹配,则地址有效。

    所以不,它和比特币一样,代码示例是here

    5.868133917508844e+59 是解码为整数的地址。问题在于 javascript 使用 52 位来表示整数,但您有 200 位地址。所以你使用的解码器在这里不起作用。

    【讨论】:

    • 不幸的是,node.js 中没有脚本或模块可以正确地进行 base58 解码,尽管我现在很难理解这个概念,即使在 npm 中使用像 big-integer 这样的模块来实现这一点. python 示例看起来很简单.. 无论如何我会在 bash 示例周围包装一些东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多