如何在Ruby中生成比特币地址

铁轨42

我正在尝试通过使用此指南来生成红宝石中的比特币地址:

https://bhelx.simst.im/articles/generating-bitcoin-keys-from-scratch-with-ruby/

但是有些事情不太正确,因为生成的地址不是很正确。

这是我正在使用的课程:

require 'openssl'
require 'ecdsa'
require 'securerandom'
require 'base58'

class BitcoinAddressGenerator

  ADDRESS_VERSION = '00'

  def self.generate_address
    # Bitcoin uses the secp256k1 curve
    curve = OpenSSL::PKey::EC.new('secp256k1')

    # Now we generate the public and private key together
    curve.generate_key

    private_key_hex = curve.private_key.to_s(16)
    puts "private_key_hex: #{private_key_hex}"
    public_key_hex = curve.public_key.to_bn.to_s(16)
    puts "public_key_hex: #{public_key_hex}"

    pub_key_hash = public_key_hash(public_key_hex)
    puts "pub_key_hash: #{pub_key_hash}"

    address = generate_address_from_public_key_hash(public_key_hash(public_key_hex))

    puts "address: #{address}"
  end

  def self.generate_address_from_public_key_hash(pub_key_hash)
    pk = ADDRESS_VERSION + pub_key_hash
    encode_base58(pub_key_hash + checksum(pub_key_hash))
  end

  def self.int_to_base58(int_val, leading_zero_bytes=0)
    alpha = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
    base58_val, base = '', alpha.size
    while int_val > 0
      int_val, remainder = int_val.divmod(base)
      base58_val = alpha[remainder] + base58_val
    end
    base58_val
  end

  def self.encode_base58(hex)
    leading_zero_bytes = (hex.match(/^([0]+)/) ? $1 : '').size / 2
    ("1"*leading_zero_bytes) + int_to_base58( hex.to_i(16) )
  end

  def self.checksum(hex)
    sha256(sha256(hex))[0...8]
  end

  # RIPEMD-160 (160 bit) hash
  def self.rmd160(hex)
    Digest::RMD160.hexdigest([hex].pack("H*"))
  end

  def self.sha256(hex)
   Digest::SHA256.hexdigest([hex].pack("H*"))
  end

  # Turns public key into the 160 bit public key hash
  def self.public_key_hash(hex)
    rmd160(sha256(hex))
  end

end

它输出类似:

private_key_hex: C96DE079BAE4877E086288DEDD6F9F70B671862B7E6E4FC0EC401CADB81EDF45
public_key_hex: 0422435DF80F62E643D3CFBA66194052EC9ED0DFB47A1B26A4731079A5FF84FBF98FF0A540B6981D75BA789E6192F3B38BABEF6B0286CAEB4CAFCB51BB96D97B46
public_key_hash: db34927cc5ec0066411f366d9a95f9c6369c6e1d
address: Lz3xnxx6Uh79PEzPpWSMMZJVWR36hJgVL

如果我将此地址插入blockchain.info和类似的工具,它说这是一个无效的地址。

任何帮助将不胜感激。

马特

在您的generate_address_from_public_key_hash方法中,校验和应位于包含地址prefix的哈希值之上pk分配变量后,您实际上根本没有使用该变量。该代码应类似于:

def self.generate_address_from_public_key_hash(pub_key_hash)
  pk = ADDRESS_VERSION + pub_key_hash
  encode_base58(pk + checksum(pk)) # Using pk here, not pub_key_hash
end

该错误似乎也出现在您链接到的页面上,我想作者一定犯了复制/粘贴错误。


顺便说一句,将所有内容都保留在十六进制字符串中并来回解码似乎是一种奇怪的方式。我本以为使用原始二进制字符串会更容易,并且只在打印出值时才将其编码为十六进制。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

正则表达式以匹配比特币地址?

来自分类Dev

如何为带有金额的比特币地址生成QR码?

来自分类Dev

从公钥哈希到php中的比特币地址

来自分类Dev

比特币地址生成

来自分类Dev

加密币地址生成

来自分类Dev

比特币地址表格验证JavaScript和PHP

来自分类Dev

Base58Check编码的比特币地址太长

来自分类Dev

确定比特币钱包地址是否“有效”

来自分类Dev

如何在Ruby中生成随机名称

来自分类Dev

如何在Ruby on Rails中生成此模型

来自分类Dev

在ruby中创建比特币地址

来自分类Dev

如何在Ubuntu中安装比特币?

来自分类Dev

比特币SegWit钱包地址计算

来自分类Dev

importxml如何获取比特币价格

来自分类Dev

如何执行和验证比特币交易?

来自分类Dev

加密币地址生成

来自分类Dev

如何为特定比特币钱包生成地址

来自分类Dev

如何创建比特币付款请求?

来自分类Dev

如何从pubkey_hash获取比特币地址?

来自分类Dev

如何在Mint 18上安装Electrum 2.6.4比特币钱包

来自分类Dev

解析比特币URL地址格式

来自分类Dev

如何设置poclbm(比特币矿工)?

来自分类Dev

了解比特币地址

来自分类Dev

在ruby中创建比特币地址

来自分类Dev

如何在30 GB的文件中恢复Windows驱动器上的比特币钱包

来自分类Dev

如何在Ubuntu中安装GreenAddress比特币钱包?

来自分类Dev

如何在ruby中生成数字的倍数

来自分类Dev

从私钥生成比特币公共地址的尝试失败

来自分类Dev

如何使比特币硬分叉