Bitcoin/address validation: Difference between revisions

Update Seed7 example to define the function validBitcoinAddress
(Update Seed7 example)
(Update Seed7 example to define the function validBitcoinAddress)
Line 1,982:
include "encoding.s7i";
 
const procfunc boolean: assertBitcoinvalidBitcoinAddress (in string: stri, in string: expectedaddress) is func
result
var stringboolean: stateisValid is "okay"FALSE;
local
var string: decoded is "";
var string: state is "okay";
begin
if not succeeds(decoded := fromBase58(striaddress)) thenand
elsif length(decoded) = 25 and decoded[1] <>= '\0;' thenand
state := "bad char";
elsif length sha256(sha256(decoded[.. 21]))[.. <>4] = decoded[22 25..] then
stateisValid := "wrong length"TRUE;
elsif decoded[1] <> '\0;' then
state := "not version 0";
elsif sha256(sha256(decoded[.. 21]))[.. 4] <> decoded[22 ..] then
state := "bad digest";
end if;
end func;
writeln((stri <& ": ") rpad 37 <& state);
 
if state <> expected then
const proc: checkValidationFunction (in string: address, in boolean: expected) is func
writeln(" *** Expected " <& literal(expected) <& " for " <& stri <& ", but got " <& literal(state) <& ".");
local
var boolean: isValid is FALSE;
begin
isValid := validBitcoinAddress(address);
writeln((striaddress <& ": ") rpad 37 <& stateisValid);
if stateisValid <> expected then
writeln(" *** Expected " <& literal(expected) <& " for " <& striaddress <& ", but got " <& literal(state)isValid <& ".");
end if;
end func;
Line 2,004 ⟶ 2,008:
const proc: main is func
begin
assertBitcoincheckValidationFunction("1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nK9", "okay"TRUE); # okay
assertBitcoincheckValidationFunction("1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nJ9", "FALSE); # bad digest");
assertBitcoincheckValidationFunction("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i", "okay"TRUE); # okay
assertBitcoincheckValidationFunction("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62j", "FALSE); # bad digest");
assertBitcoincheckValidationFunction("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62X", "FALSE); # bad digest");
assertBitcoincheckValidationFunction("1ANNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i", "FALSE); # bad digest");
assertBitcoincheckValidationFunction("oMRDCDfyQhEerkaSmwCfSPqf3MLgBwNvs", "FALSE); # not version 0");
assertBitcoincheckValidationFunction("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62iz", "FALSE); # wrong length");
assertBitcoincheckValidationFunction("1BGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i", "FALSE); # bad digest");
assertBitcoincheckValidationFunction("1A Na15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i", "FALSE); # bad char");
assertBitcoincheckValidationFunction("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62I", "FALSE); # bad char");
assertBitcoincheckValidationFunction("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62!", "FALSE); # bad char");
assertBitcoincheckValidationFunction("1AGNa15ZQXAZUgFiqJ3i7Z2DPU2J6hW62i", "FALSE); # bad digest");
assertBitcoincheckValidationFunction("1111111111111111111114oLvT2", "okay"TRUE); # okay
assertBitcoincheckValidationFunction("17NdbrSGoUotzeGCcMMCqnFkEvLymoou9j", "okay"TRUE); # okay
assertBitcoincheckValidationFunction("1badbadbadbadbadbadbadbadbadbadbad", "FALSE); # wrong length");
assertBitcoincheckValidationFunction("BZbvjr", "FALSE); # wrong length");
assertBitcoincheckValidationFunction("i55j", "FALSE); # wrong length");
assertBitcoincheckValidationFunction("16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM", "okay"TRUE); # okay
end func;</lang>
 
{{out}}
<pre>
1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nK9: okayTRUE
1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nJ9: bad digestFALSE
1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i: okayTRUE
1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62j: bad digestFALSE
1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62X: bad digestFALSE
1ANNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i: bad digestFALSE
oMRDCDfyQhEerkaSmwCfSPqf3MLgBwNvs: not version 0FALSE
1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62iz: wrong lengthFALSE
1BGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i: bad digestFALSE
1A Na15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i: bad charFALSE
1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62I: bad charFALSE
1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62!: bad charFALSE
1AGNa15ZQXAZUgFiqJ3i7Z2DPU2J6hW62i: bad digestFALSE
1111111111111111111114oLvT2: okayTRUE
17NdbrSGoUotzeGCcMMCqnFkEvLymoou9j: okayTRUE
1badbadbadbadbadbadbadbadbadbadbad: wrong lengthFALSE
BZbvjr: wrong lengthFALSE
i55j: wrong lengthFALSE
16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM: okayTRUE
</pre>