You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

90 lines
2.3 KiB

  1. #!/usr/bin/perl
  2. BEGIN { if (-e $ENV{SITE}.'/lib') { use lib $ENV{SITE}.'/lib'; } }
  3. use config;
  4. use TXPOOL qw(saveTxPool);
  5. use CAStore qw(CASWrite);
  6. use ECKeys qw(ecsign ecverif getPeerid loadKeys);
  7. use YAML::Syck qw(LoadFile Dump DumpFile);
  8. my $keys = loadKeys();
  9. foreach my $id (keys %{$keys}) {
  10. my $pub = $keys->{$id}{public};
  11. $keys->{$pub}{id} = $id;
  12. }
  13. #printf "--- keys %s...\n",Dump($keys);
  14. my $txf = shift;
  15. my $tx = LoadFile($txf);
  16. my %signatures = ();
  17. my %delta = ();
  18. foreach my $sign (@{$tx->{signatures}}) {
  19. my ($pub) = keys %{$sign};
  20. $signatures{$pub} = $sign->{$pub};
  21. $delta{$pub} = 0;
  22. }
  23. printf "--- signatures %s...\n",Dump(\%signatures);
  24. foreach my $in (@{$tx->{inputs}}) {
  25. my ($pub) = keys %{$in};
  26. my $value = $in->{$pub};
  27. $valuein += $value;
  28. $delta{$pub} -= $value;
  29. printf "in: %s from %s (%s)\n",$value,$pub,$keys->{$pub}{id};
  30. }
  31. foreach my $out (@{$tx->{outputs}}) {
  32. my ($pub) = keys %{$out};
  33. my $value = $out->{$pub};
  34. $valueout += $value;
  35. $delta{$pub} += $value;
  36. printf "out: %s to %s (%s)\n",$value,$pub,$keys->{$pub}{id};
  37. }
  38. if ($valuein != $valueout) {
  39. printf "error: i:%s != o:%s\n",$valuein,$valueout;
  40. }
  41. foreach my $pub (keys %delta) {
  42. my $value = -$delta{$pub};
  43. if (exists $signatures{$pub}) {
  44. my $id = (exists $keys->{$pub}{id}) ? $keys->{$pub}{id} : $pub;
  45. my $key58 = (exists $keys->{$id}{public}) ? $keys->{$id}{public} : $pub;
  46. my $msg = qq'["$pub","$value","$tx->{payload}"]';
  47. printf "msg: %s\n",$msg;
  48. if (defined $signatures{$pub}) {
  49. my $sig = $signatures{$pub};
  50. my $sigok = &ecverif($key58,$sig,$msg);
  51. printf "signature for %s (%s) ? %s\n",$id,$key58,($sigok)?'ok':'invalid';
  52. if (! $sigok) {
  53. my $sig = &ecsign($id,$msg);
  54. printf "sig: %s: %s (corrected)\n",$id,$sig;
  55. $signatures{$pub} = $sig;
  56. }
  57. } else {
  58. my $sig = &ecsign($id,$msg);
  59. printf "sig: %s: %s\n",$id,$sig;
  60. $signatures{$pub} = $sig;
  61. }
  62. }
  63. }
  64. foreach my $sign (@{$tx->{signatures}}) {
  65. my ($pub) = keys %{$sign};
  66. $sign->{$pub} = $signatures{$pub};
  67. }
  68. printf "--- %s.sig: %s...\n",$txf,Dump($tx);
  69. DumpFile("$txf.sig",$tx);
  70. $tx->{nonce} = 3976914969180171529,
  71. my $txaddr = CASWrite('txpool',$tx,$tx->{nonce},'txpool',5);
  72. push @{$TXPOOL},$txaddr;
  73. &saveTxPool($TXPOOL);
  74. exit $?;