Roy G. Cmiel
4 years ago
committed by
Brooke L. Rediker
13 changed files with 307 additions and 7 deletions
-
2.gitignore
-
16PerlWebSocketEchoServer.pl
-
2_data/timelog.yml
-
10block0.yml
-
32eckeygen.pl
-
86encode.pm
-
13misc.pm
-
9notes.md
-
50seed.pm
-
12signatures.pm
-
32t/blockaddr.t
-
37t/hashcash.t
-
13t/random.t
@ -0,0 +1,2 @@ |
|||
*~1 |
|||
.*cache |
@ -0,0 +1,16 @@ |
|||
#!/usr/bin/perl |
|||
use Net::WebSocket::Server; |
|||
|
|||
Net::WebSocket::Server->new( |
|||
listen => 8080, |
|||
on_connect => sub { |
|||
my ($serv, $conn) = @_; |
|||
$conn->on( |
|||
utf8 => sub { |
|||
my ($conn, $msg) = @_; |
|||
$conn->send_utf8($msg); |
|||
}, |
|||
); |
|||
}, |
|||
)->start; |
|||
1; |
@ -1,7 +1,7 @@ |
|||
--- # block genesis |
|||
n: 0 # blocknumber (on 32bit max block-number : 4294967296) |
|||
txroot: QmNonce+qmerkle-without-zeros |
|||
# echo -n '' | ipfs add |
|||
txprev: QmbFMke1KXqnYyBBWxB74N4c5SBnJMVAiMNRcGu6x1AwQH |
|||
ver: 0x00 |
|||
seq: 0 # blocknumber (on 32bit max block-number : 4294967296) |
|||
# ipfs object new unixfs-dir |
|||
payload: QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn |
|||
data: QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn |
|||
# echo -n '' | ipfs add |
|||
bkprev: QmbFMke1KXqnYyBBWxB74N4c5SBnJMVAiMNRcGu6x1AwQH |
@ -0,0 +1,32 @@ |
|||
#!/usr/bin/perl |
|||
# |
|||
# testing out ecdsa key generation ... |
|||
|
|||
use Crypt::PK::ECC; |
|||
use YAML::Syck qw(Dump); |
|||
|
|||
#Key generation |
|||
my $pk = Crypt::PK::ECC->new(); |
|||
$pk->generate_key('secp256k1'); |
|||
my $private_der = $pk->export_key_der('private'); |
|||
|
|||
my $public_pem = $pk->export_key_pem('public'); |
|||
|
|||
local *PK; |
|||
open PK,'>','eckey-priv.der'; binmode(PK); |
|||
print PK $private_der; |
|||
close |
|||
open PK,'>','eckey-pub.pem'; |
|||
print PK $public_pem; |
|||
close PK; |
|||
|
|||
open PK,'>','eckey.yml'; |
|||
print PK "--- # eckey\n"; |
|||
printf PK "pk: %s\n",Dump($pk->key2hash); |
|||
printf PK "...\n"; |
|||
close PK; |
|||
|
|||
|
|||
exit $?; |
|||
|
|||
1; # $Source: /my/perl/script/eckeygen.pl $ |
@ -0,0 +1,86 @@ |
|||
# |
|||
# Intent: |
|||
# provide encoding routines |
|||
# |
|||
# Note: |
|||
# This work has been done during my time at Doctor I·T |
|||
# |
|||
# -- Copyright drit, 2021 -- |
|||
# |
|||
BEGIN { if (-e $ENV{SITE}.'/lib') { use lib $ENV{SITE}.'/lib'; } } |
|||
# |
|||
package encode; |
|||
require Exporter; |
|||
@ISA = qw(Exporter); |
|||
# Subs we export by default. |
|||
@EXPORT = qw(); |
|||
# Subs we will export if asked. |
|||
#@EXPORT_OK = qw(nickname); |
|||
@EXPORT_OK = grep { $_ !~ m/^_/ && defined &$_; } keys %{__PACKAGE__ . '::'}; |
|||
|
|||
use strict; |
|||
use misc qw(version); |
|||
|
|||
# The "use vars" and "$VERSION" statements seem to be required. |
|||
use vars qw/$dbug $VERSION/; |
|||
# ---------------------------------------------------- |
|||
our $VERSION = sprintf "%d.%02d", q$Revision: 0.0 $ =~ /: (\d+)\.(\d+)/; |
|||
my ($State) = q$State: Exp $ =~ /: (\w+)/; our $dbug = ($State eq 'dbug')?1:0; |
|||
# ---------------------------------------------------- |
|||
$VERSION = &version(__FILE__) unless ($VERSION ne '0.00'); |
|||
|
|||
sub mbase58 { |
|||
my $mh = sprintf'Z%s',&encode_base58f(@_); |
|||
return $mh; |
|||
} |
|||
sub mbase36 { |
|||
my $mh = sprintf'K%s',uc&encode_base36(@_); |
|||
return $mh; |
|||
} |
|||
sub mbase16 { |
|||
my $mh = sprintf'f%s',unpack'H*',@_; |
|||
return $mh; |
|||
} |
|||
|
|||
|
|||
sub encode_base36 { |
|||
use Math::BigInt; |
|||
use Math::Base36 qw(); |
|||
my $n = Math::BigInt->from_bytes(shift); |
|||
my $k36 = Math::Base36::encode_base36($n,@_); |
|||
#$k36 =~ y,0-9A-Z,A-Z0-9,; |
|||
return $k36; |
|||
} |
|||
sub decode_base36 { |
|||
use Math::BigInt; |
|||
use Math::Base36 qw(); |
|||
#$k36 = uc($_[0]) |
|||
#$k36 =~ y,A-Z0-9,0-9A-Z; |
|||
my $n = Math::Base36::decode_base36($_[0]); |
|||
my $bin = Math::BigInt->new($n)->as_bytes(); |
|||
return $bin; |
|||
} |
|||
|
|||
sub encode_base58f { # flickr |
|||
use Math::BigInt; |
|||
use Encode::Base58::BigInt qw(); |
|||
my $bin = join'',@_; |
|||
my $bint = Math::BigInt->from_bytes($bin); |
|||
my $h58 = Encode::Base58::BigInt::encode_base58($bint); |
|||
# $h58 =~ tr/a-km-zA-HJ-NP-Z/A-HJ-NP-Za-km-z/; # btc |
|||
return $h58; |
|||
} |
|||
sub decode_base58f { |
|||
use Math::BigInt; |
|||
use Encode::Base58::BigInt qw(); |
|||
my $s = $_[0]; |
|||
#$s =~ tr/A-HJ-NP-Za-km-zIO0l/a-km-zA-HJ-NP-ZiooL/; # btc |
|||
$s =~ tr/IO0l/iooL/; # forbidden chars |
|||
my $bint = Encode::Base58::BigInt::decode_base58($s); |
|||
my $bin = Math::BigInt->new($bint)->as_bytes(); |
|||
return $bin; |
|||
} |
|||
|
|||
# ----------------------------------------------------------------------- |
|||
1; # $Source: /my/perl/modules/encode.pm $ |
|||
|
@ -1,13 +1,18 @@ |
|||
# Design Notes |
|||
|
|||
|
|||
Initial design choices |
|||
## Initial design choices |
|||
|
|||
- protocol/routing/network layer: websockets (multi nonblocking clients) |
|||
- server-side fileformat : yaml |
|||
- client-side fileformat : JSON |
|||
|
|||
Language choice: |
|||
## Language choice: |
|||
serverside: perl (or nodejs) |
|||
clienside: javascript |
|||
|
|||
## block chain structure |
|||
|
|||
minimally sized blocks : |
|||
- segreated signature, timestamp, audit etc. |
|||
- {seq number, hash, previous} |
@ -0,0 +1,50 @@ |
|||
# |
|||
# Intent: |
|||
# entropy routines grasping source intention ! |
|||
# |
|||
# Note: |
|||
# This work has been done during my time at Doctor I·T |
|||
# |
|||
# -- Copyright drit, 2021 -- |
|||
BEGIN { if (-e $ENV{SITE}.'/lib') { use lib $ENV{SITE}.'/lib'; } } |
|||
# |
|||
package seed; |
|||
require Exporter; |
|||
@ISA = qw(Exporter); |
|||
# Subs we export by default. |
|||
@EXPORT = qw(); |
|||
# Subs we will export if asked. |
|||
#@EXPORT_OK = qw(nickname); |
|||
@EXPORT_OK = grep { $_ !~ m/^_/ && defined &$_; } keys %{__PACKAGE__ . '::'}; |
|||
|
|||
use strict; |
|||
use misc qw(version); |
|||
|
|||
# The "use vars" and "$VERSION" statements seem to be required. |
|||
use vars qw/$dbug $VERSION/; |
|||
# ---------------------------------------------------- |
|||
our $VERSION = sprintf "%d.%02d", q$Revision: 0.0 $ =~ /: (\d+)\.(\d+)/; |
|||
my ($State) = q$State: Exp $ =~ /: (\w+)/; our $dbug = ($State eq 'dbug')?1:0; |
|||
# ---------------------------------------------------- |
|||
$VERSION = &version(__FILE__) unless ($VERSION ne '0.00'); |
|||
|
|||
|
|||
sub setseed { |
|||
our $seed = undef; |
|||
# ecf7fa3d : 15min |
|||
$seed = ($_[0]) ? srand($_[0]) : srand(); |
|||
printf "seed: %08x\n",$seed; |
|||
return $seed; |
|||
} |
|||
# ----------------------------------------------------------------------- |
|||
sub rand64 { # /!\ NOT Cryptographycally safe |
|||
my $i1 = int(rand(0xFFFF_FFFF)); |
|||
my $i2 = int(rand(0xFFFF_FFFF)); |
|||
my $q = $i1 <<32 | $i2; |
|||
printf "i1: %08x\n",$i1; |
|||
printf "i2: %08x\n",$i2; |
|||
printf "rnd64: %s\n",unpack'H*',pack'Q',$q; |
|||
return $q; |
|||
} |
|||
# ----------------------------------------------------------------------- |
|||
1; # $Source: /my/perl/modules/pseudorandom.pm $ |
@ -0,0 +1,12 @@ |
|||
#!/usr/bin/perl |
|||
|
|||
|
|||
use Crypt::OpenSSL::ECDSA; |
|||
$sig = Crypt::OpenSSL::ECDSA::ECDSA_do_sign( $digest, $eckey ); |
|||
$r = $sig->get_r; |
|||
$s = $sig->get_s; |
|||
|
|||
$sig = Crypt::OpenSSL::ECDSA::ECDSA_SIG->new(); |
|||
$sig->set_r($r); |
|||
$sig->set_s($s); |
|||
Crypt::OpenSSL::ECDSA::ECDSA_do_verify( $digest, $sig, $eckey ); |
@ -0,0 +1,32 @@ |
|||
#!/usr/bin/perl |
|||
|
|||
# |
|||
# Intent: |
|||
# testing it ! |
|||
# |
|||
# Note: |
|||
# This work has been done during my time at Doctor I·T |
|||
# |
|||
# -- Copyright drit, 2021 -- |
|||
# |
|||
BEGIN { if (-e $ENV{SITE}.'/lib') { use lib $ENV{SITE}.'/lib'; } } |
|||
|
|||
#use if -e $LIB, $LIB.'/seed'; |
|||
use seed qw(rand64); |
|||
use toychain qw(blockAddr); |
|||
use YAML::Syck qw(Dump); |
|||
print "testing blockaddr\n"; |
|||
printf "chain.addr: %s\n",$toychain::chain->{bkaddr}; |
|||
|
|||
# f96885aa : 21.4min |
|||
# 044ce1de : 20.5min |
|||
my $n0 = rand64(); # n < 18446744073709551616 |
|||
printf "n0:%s\n",$n0; |
|||
|
|||
my $addr = &blockAddr($toychain::genesis); |
|||
printf "genesis.addr: %s\n",$addr; |
|||
|
|||
exit $?; |
|||
|
|||
|
|||
1; |
@ -0,0 +1,37 @@ |
|||
#!/usr/bin/perl |
|||
|
|||
# |
|||
# Intent: |
|||
# testing it ! |
|||
# |
|||
# Note: |
|||
# This work has been done during my time at Doctor I·T |
|||
# |
|||
# -- Copyright drit, 2021 -- |
|||
# |
|||
BEGIN { if (-e $ENV{SITE}.'/lib') { use lib $ENV{SITE}.'/lib'; } } |
|||
|
|||
printf "// initialization $0\n"; |
|||
#use if -e $LIB, $LIB.'/seed'; |
|||
use seed qw(rand64); |
|||
use toychain qw(hashcash); |
|||
|
|||
printf "// testing $0\n"; |
|||
|
|||
&seed::setseed(0x2f392c85); |
|||
|
|||
# f96885aa : 21.4min |
|||
# 044ce1de : 20.5min |
|||
my $n0 = rand64(); # n < 18446744073709551616 |
|||
printf "n0:%s\n",$n0; |
|||
|
|||
|
|||
my ($hc,$n) = &hashcash('SHA256','hello world',$n0,5); |
|||
printf "hc: %s %x %s\n",unpack('H*',$hc),$n,unpack'H*',pack('Q',$n); |
|||
|
|||
printf "// done $0\n"; |
|||
|
|||
exit $?; |
|||
|
|||
|
|||
1; |
@ -0,0 +1,13 @@ |
|||
#!/usr/bin/perl |
|||
|
|||
BEGIN { if (-e $ENV{SITE}.'/lib') { use lib $ENV{SITE}.'/lib'; } } |
|||
use seed qw(rand64); |
|||
|
|||
&seed::setseed(0x49b1cffe || undef); |
|||
my $n0 = seed::rand64(); # n < 18446744073709551616 |
|||
printf "n0: %s\n",$n0; |
|||
|
|||
exit $?; |
|||
|
|||
|
|||
1; |
Write
Preview
Loading…
Cancel
Save
Reference in new issue