gpt4 book ai didi

ruby-on-rails - 检查比特币地址是否有效?

转载 作者:数据小太阳 更新时间:2023-10-29 08:18:27 25 4
gpt4 key购买 nike

我想知道有什么方法可以检查比特币地址是否有效?

我在 Rails 上使用 ruby​​。或许我可以使用 coinbase api 向帐户发送一个 satoshi,看看它是否解析?

最佳答案

来自 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

关于ruby-on-rails - 检查比特币地址是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22127317/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com