2017年9月6日 星期三

bitcoin address validation

第一時間會想到用正規表示來驗證

正式 chain 的 regex
```
\A[13][a-km-zA-HJ-NP-Z1-9]{25,34}\z
```

Test net 的 regex
```
\A[2mn][1-9A-HJ-NP-Za-km-z]{26,35}\z
```

但是這樣只檢查表面 (可以通過大部分的檢查),沒有檢查算法,所以更嚴謹的做法是要再檢查 checksum

實作概念:
https://bitcointalk.org/index.php?topic=1026.0

概念就是使用 Base58 編碼 deocde 想要檢查的 address 做檢查

from wiki:

```
Base58是用於Bitcoin中使用的一種獨特的編碼方式,主要用於產生Bitcoin的錢包地址。相比Base64,Base58不使用數字"0",字母大寫"O",字母大寫"I",和字母小寫"l",以及"+"和"/"符號。
```

也就是說只要使用 Base58 逆向 decode 回去 checksum 就可以知道是不是正確的 address

找工具:
Bitcoin Ruby 的 Gem 有提供 `valid_address?(address)` 的方法可以用

https://github.com/lian/bitcoin-ruby#library-usage

Source code 可以看:
https://github.com/lian/bitcoin-ruby/blob/master/lib/bitcoin.rb#L59

Bitcoin Ruby gem 驗證了

* version byte
* length (bytesize)
* checksum

所以如果要驗證 testnet 或是其他 network 的地址,可以先設定

```
Bitcoin.network = :testnet
```
就行



相較於以太坊

Ethereum addresses are plain 20 bytes, anything can be in them. Since it's hard to reason about them, programs represent them as 40 character long hex strings. So every 0x<40 hex character> is a valid Ethereum address.

沒有留言:

張貼留言