{{omit from|Brlcad}}
{{omit from|GUISS}}


;Task:
Write a program that takes a [[wp:bitcoin|bitcoin address]] as argument,
and checks whether or not this address is valid.

A bitcoin address uses a base58 encoding, which uses an alphabet of the characters 0 .. 9, A ..Z, a .. z, but without the four characters:
:::* &nbsp; 0 &nbsp; zero
:::* &nbsp; O &nbsp; uppercase oh
:::* &nbsp; I &nbsp; uppercase eye
:::* &nbsp; l &nbsp; lowercase ell


With this encoding, a bitcoin address encodes 25 bytes:
* the first byte is the version number, which will be zero for this task ;
* the next twenty bytes are a [[RIPEMD-160]] digest, but you don't have to know that for this task:  you can consider them a pure arbitrary data ;
* the last four bytes are a checksum check.  They are the first four bytes of a double [[SHA-256]] digest of the previous 21 bytes.


To check the bitcoin address, you must read the first twenty-one bytes, compute the checksum, and check that it corresponds to the last four bytes.

The program can either return a boolean value or throw an exception when not valid.

You can use a digest library for [[SHA-256]].


;Example of a bitcoin address:
<big>
 1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i
</big>

It doesn't belong to anyone and is part of the test suite of the bitcoin software.
<br>You can change a few characters in this string and check that it'll fail the test.
<br><br>
