diff --git a/bin/signtx.pl b/bin/signtx.pl new file mode 100755 index 0000000..7d7a5bc --- /dev/null +++ b/bin/signtx.pl @@ -0,0 +1,90 @@ +#!/usr/bin/perl + +BEGIN { if (-e $ENV{SITE}.'/lib') { use lib $ENV{SITE}.'/lib'; } } + + +use config; +use TXPOOL qw(saveTxPool); +use CAStore qw(CASWrite); +use ECKeys qw(ecsign ecverif getPeerid loadKeys); +use YAML::Syck qw(LoadFile Dump DumpFile); + +my $keys = loadKeys(); +foreach my $id (keys %{$keys}) { + my $pub = $keys->{$id}{public}; + $keys->{$pub}{id} = $id; +} +#printf "--- keys %s...\n",Dump($keys); + +my $txf = shift; + + +my $tx = LoadFile($txf); + +my %signatures = (); +my %delta = (); +foreach my $sign (@{$tx->{signatures}}) { + my ($pub) = keys %{$sign}; + $signatures{$pub} = $sign->{$pub}; + $delta{$pub} = 0; +} +printf "--- signatures %s...\n",Dump(\%signatures); +foreach my $in (@{$tx->{inputs}}) { + my ($pub) = keys %{$in}; + my $value = $in->{$pub}; + $valuein += $value; + $delta{$pub} -= $value; + printf "in: %s from %s (%s)\n",$value,$pub,$keys->{$pub}{id}; +} +foreach my $out (@{$tx->{outputs}}) { + my ($pub) = keys %{$out}; + my $value = $out->{$pub}; + $valueout += $value; + $delta{$pub} += $value; + printf "out: %s to %s (%s)\n",$value,$pub,$keys->{$pub}{id}; +} +if ($valuein != $valueout) { + printf "error: i:%s != o:%s\n",$valuein,$valueout; +} + +foreach my $pub (keys %delta) { + my $value = -$delta{$pub}; + if (exists $signatures{$pub}) { + my $id = (exists $keys->{$pub}{id}) ? $keys->{$pub}{id} : $pub; + my $key58 = (exists $keys->{$id}{public}) ? $keys->{$id}{public} : $pub; + my $msg = qq'["$pub","$value","$tx->{payload}"]'; + printf "msg: %s\n",$msg; + if (defined $signatures{$pub}) { + my $sig = $signatures{$pub}; + my $sigok = &ecverif($key58,$sig,$msg); + printf "signature for %s (%s) ? %s\n",$id,$key58,($sigok)?'ok':'invalid'; + if (! $sigok) { + my $sig = &ecsign($id,$msg); + printf "sig: %s: %s (corrected)\n",$id,$sig; + $signatures{$pub} = $sig; + } + } else { + my $sig = &ecsign($id,$msg); + printf "sig: %s: %s\n",$id,$sig; + $signatures{$pub} = $sig; + } + } +} + +foreach my $sign (@{$tx->{signatures}}) { + my ($pub) = keys %{$sign}; + $sign->{$pub} = $signatures{$pub}; +} + +printf "--- %s.sig: %s...\n",$txf,Dump($tx); +DumpFile("$txf.sig",$tx); + +$tx->{nonce} = 3976914969180171529, +my $txaddr = CASWrite('txpool',$tx,$tx->{nonce},'txpool',5); + +push @{$TXPOOL},$txaddr; +&saveTxPool($TXPOOL); + +exit $?; + + diff --git a/bin/websocketd b/bin/websocketd new file mode 100755 index 0000000..b74da62 Binary files /dev/null and b/bin/websocketd differ diff --git a/curltest.sh b/curltest.sh index c7b8a10..5c5e51b 100644 --- a/curltest.sh +++ b/curltest.sh @@ -8,5 +8,8 @@ curl http://127.0.0.1:8089/api/0.0/getchain echo '' curl -s http://127.0.0.1:8089/api/0.0/getblock?n=30 echo '' -curl -s http://127.0.0.1:8089/api/0.0/gettx?txaddr=Z123 +curl -s http://127.0.0.1:8089/api/0.0/gettx?txaddr=ZTxB1ritiikyhjTXg28V7AjfqwkDyD8woJoz1yjC1T75 echo '' +curl -s http://127.0.0.1:8089/api/0.0/gettx?txaddr=ZtxqdiZ8wwpEN5dScJf1byU6hjfBLoSrFmCrUVNJmqPc +echo '' +cat txpool/tx.yml | sed -e "s/$/%0a/g" | curl -s -X POST http://127.0.0.1:8089/api/0.0/settx -d @- diff --git a/init.sh b/init.sh index 9885acd..234fd60 100644 --- a/init.sh +++ b/init.sh @@ -1,6 +1,6 @@ # -i="$1:-1" +i="${1:-1}" top=$(git rev-parse --show-toplevel) export SITE=$top diff --git a/lib b/lib index dd52265..108a4b5 160000 --- a/lib +++ b/lib @@ -1 +1 @@ -Subproject commit dd522659e0e9a66aef4c6b22105847df427f2dea +Subproject commit 108a4b5442111374e51ecdc66992520aad233724 diff --git a/salts/Genesis.yml b/salts/Genesis.yml new file mode 100644 index 0000000..f47e5e0 --- /dev/null +++ b/salts/Genesis.yml @@ -0,0 +1 @@ +salt: 8163726776410142252 diff --git a/tx.yml b/tx.yml deleted file mode 100644 index a51b9bb..0000000 --- a/tx.yml +++ /dev/null @@ -1,13 +0,0 @@ ---- # transaction -timestamp: 1623683269225552702 -inputs: - - pub1: 50 - - pub2: 20 -payload: "This is an example of transaction" -outputs: - - pub3: 60 - - pubfee: 10 -signatures: - - pub1: sig1 - - pub2: sig2 - - pubfee: sig3 diff --git a/txpool/ZtxqdiZ8wwpEN5dScJf1byU6hjfBLoSrFmCrUVNJmqPc.yml b/txpool/ZtxqdiZ8wwpEN5dScJf1byU6hjfBLoSrFmCrUVNJmqPc.yml new file mode 100644 index 0000000..8293448 --- /dev/null +++ b/txpool/ZtxqdiZ8wwpEN5dScJf1byU6hjfBLoSrFmCrUVNJmqPc.yml @@ -0,0 +1,14 @@ +--- +inputs: + - + coinbase: 50 +nonce: '3976914969180171529' +outputs: + - + miner: 50 +payload: This is a coinbase transaction of 50 coins for the genesis block +pow: '3976914969180292365' +signatures: + - + coinbase: Zan1RjVTw7GPVyd7aygjWSrGCtX3M8CVRu3NAyqLC8MToNPE93ju4RrFFjunnbeTYnudR2gSKCamK82xjEfWEtGzGvTRDw25MG +timestamp: '1623683269225552702' diff --git a/txpool/txgen.yml b/txpool/txgen.yml new file mode 100644 index 0000000..2baa5ae --- /dev/null +++ b/txpool/txgen.yml @@ -0,0 +1,11 @@ +--- +timestamp: '1623683269225552702' +inputs: + - coinbase: 50 +nonce: '3976914969180171529' +outputs: + - Z21GdiEggiGa7TPNaqGY8coBy97LoRNpPVu9fxig75nstq: 50 +payload: This is a coinbase transaction of 50 coins for the genesis block +pow: '3976914969180292365' +signatures: + - coinbase: Zan1RjVTw7GPVyd7aygjWSrGCtX3M8CVRu3NAyqLC8MToNPE93ju4RrFFjunnbeTYnudR2gSKCamK82xjEfWEtGzGvTRDw25MG