第一時間會想到用正規表示來驗證
正式 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.