【问题标题】:Check if bitcoin address is valid?检查比特币地址是否有效?
【发布时间】:2014-04-03 08:28:45
【问题描述】:

我想知道有没有办法检查比特币地址是否有效?

我正在使用 ruby​​ on rails。或许我可以通过 coinbase api 向账户发送一个 satoshi,看看它是否可以解决?

【问题讨论】:

    标签: ruby-on-rails ruby bitcoin coinbase-api


    【解决方案1】:

    来自 github 的 bitcoin_address_validator.rb 检查比特币地址是否有效:

    require 'digest'
    
    class BitcoinAddressValidator < ActiveModel::EachValidator
      def validate(record, field, value)
        unless valid_bitcoin_address?(value)
          record.errors[field] << "Bitcoin address is invalid"
        end
      end
    
      private
    
      B58Chars = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
      B58Base = B58Chars.length
    
      def self.valid_bitcoin_address?(address)
        (address =~ /^[a-zA-Z1-9]{33,35}$/) and version(address)
      end
    
      def self.version(address)
        decoded = b58_decode(address, 25)
    
        version = decoded[0, 1]
        checksum = decoded[-4, decoded.length]
        vh160 = decoded[0, decoded.length - 4]
    
        hashed = (Digest::SHA2.new << (Digest::SHA2.new << vh160).digest).digest
    
        hashed[0, 4] == checksum ? version[0] : nil
      end
    
      def self.b58_decode(value, length)
        long_value = 0
        index = 0
        result = ""
    
        value.reverse.each_char do |c|
          long_value += B58Chars.index(c) * (B58Base ** index)
          index += 1
        end
    
        while long_value >= 256 do
          div, mod = long_value.divmod 256
          result = mod.chr + result
          long_value = div
        end
    
        result = long_value.chr + result
    
        if result.length < length
          result = 0.chr * (length - result.length) + result
        end
    
        result
      end
    end
    

    通过单元测试(参见http://github.com/davout/bitcoin-bank

    并检查格式

    class User < ActiveRecord::Base
      validates :bitcoin_address, format: { with: /\A(1|3)[a-zA-Z1-9]{26,33}\z/,
      message: "invalid bitcoin address" }
      # This is NOT  calculate checksum 
    end
    

    【讨论】:

      【解决方案2】:

      如果您不想维护自己的实现,可以使用the bitcoin-ruby gem

      具体:Bitcoin.valid_address? "your_address_here"

      【讨论】:

        猜你喜欢
        • 2014-10-10
        • 2018-10-09
        • 2019-05-16
        • 2014-01-17
        • 2019-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-30
        相关资源
        最近更新 更多