consensus: implement BLS signatures prototype

This commit is contained in:
Evgenii Stratonikov 2019-12-18 17:48:38 +03:00
parent c306d2f07c
commit c691d37f0b
14 changed files with 271 additions and 13 deletions

View file

@ -84,8 +84,12 @@ type (
// WalletConfig is a wallet info.
WalletConfig struct {
BLS string `yaml:"BLS"`
BLSPub string `yaml:"BLSPub"`
Path string `yaml:"Path"`
Password string `yaml:"Password"`
BLSValidators []string `yaml:"BLSValidators"`
}
// RPCConfig is an RPC service configuration information (to be moved to the rpc package, see #423).

View file

@ -55,5 +55,12 @@ ApplicationConfiguration:
Enabled: false
Port: 20014
UnlockWallet:
BLSValidators:
- 51856b9fe924fe1f5f91713e2ff056dab5602a88c1a72505fb8c2b749143a6788dcced6b86c1c4c25913aa7c993c0bb80dc1a21f40ca0a0c2893252bbe6bcf2b624af8f9dd97f53b4d15ed324cb01b61bf82bb7a3eb3d23f3ebfd76a6ed14bd7718d5740b4ec71486c99b234884352e73332c19ea8b11396d54cb28f3a326e3d
- 7f20fbb5a509059360aabd9e1c497b613abaa92b750d63d5c4503846e5fed3fd3d013f519ec984b110bff541b8144f7df460e4a0685fb1e6715ce1b1b68eb45a29724d614b3b46866a1e0bd5a489afa7763c2cfd598dfd476beee64a4e8554657da72d9495d7b1c982e01b40b10026b78f3d203335bc6d6be790945045b2901e
- 69906710b7bdabfd224a94b932ae0942f81f302d39bc01fc3e069bc35e298f312c9e2c0160eb6a51f1fe65c4362502b2c6572f3a49ad96b3f07de56b5b8877cf53dd2a77d747983373301a37a731208ff44da1c8a2572c0b10feaa551dabde432ebebb1c6fd7119f8f0da21ef682ba0787619bd3f091f50158543be741938bc7
- 10cf58258ee1966cfe506a1e8ba22dd5fddd5d3af2e67bcd5b835e05688ec4613a01ee8cf552715c12397f7e4b79e1fa12547d98e5df818e2f5472c54e91e8a6306dad6ee9a883d5df06e0c85e441968eff1ffcdf954b777d5312729b9049746650c416498878cd7724bfe8345f6a51b8f459d4a92630888de73b15520c011c2
BLS: 4261a32d175a79a7aeac3c5d584d1135dd72acf8bf3897556dbf4e3d9331bcc3
BLSPub: 10cf58258ee1966cfe506a1e8ba22dd5fddd5d3af2e67bcd5b835e05688ec4613a01ee8cf552715c12397f7e4b79e1fa12547d98e5df818e2f5472c54e91e8a6306dad6ee9a883d5df06e0c85e441968eff1ffcdf954b777d5312729b9049746650c416498878cd7724bfe8345f6a51b8f459d4a92630888de73b15520c011c2
Path: "6PYRXVwHSqFSukL3CuXxdQ75VmsKpjeLgQLEjt83FrtHf1gCVphHzdD4nc"
Password: "four"

View file

@ -8,6 +8,11 @@ ProtocolConfiguration:
- 02103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e
- 03d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee699
- 02a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd62
BLSValidators:
- 51856b9fe924fe1f5f91713e2ff056dab5602a88c1a72505fb8c2b749143a6788dcced6b86c1c4c25913aa7c993c0bb80dc1a21f40ca0a0c2893252bbe6bcf2b624af8f9dd97f53b4d15ed324cb01b61bf82bb7a3eb3d23f3ebfd76a6ed14bd7718d5740b4ec71486c99b234884352e73332c19ea8b11396d54cb28f3a326e3d
- 7f20fbb5a509059360aabd9e1c497b613abaa92b750d63d5c4503846e5fed3fd3d013f519ec984b110bff541b8144f7df460e4a0685fb1e6715ce1b1b68eb45a29724d614b3b46866a1e0bd5a489afa7763c2cfd598dfd476beee64a4e8554657da72d9495d7b1c982e01b40b10026b78f3d203335bc6d6be790945045b2901e
- 69906710b7bdabfd224a94b932ae0942f81f302d39bc01fc3e069bc35e298f312c9e2c0160eb6a51f1fe65c4362502b2c6572f3a49ad96b3f07de56b5b8877cf53dd2a77d747983373301a37a731208ff44da1c8a2572c0b10feaa551dabde432ebebb1c6fd7119f8f0da21ef682ba0787619bd3f091f50158543be741938bc7
- 10cf58258ee1966cfe506a1e8ba22dd5fddd5d3af2e67bcd5b835e05688ec4613a01ee8cf552715c12397f7e4b79e1fa12547d98e5df818e2f5472c54e91e8a6306dad6ee9a883d5df06e0c85e441968eff1ffcdf954b777d5312729b9049746650c416498878cd7724bfe8345f6a51b8f459d4a92630888de73b15520c011c2
SeedList:
- 172.200.0.1:20333
- 172.200.0.2:20334
@ -55,5 +60,12 @@ ApplicationConfiguration:
Enabled: false
Port: 20011
UnlockWallet:
BLSValidators:
- 51856b9fe924fe1f5f91713e2ff056dab5602a88c1a72505fb8c2b749143a6788dcced6b86c1c4c25913aa7c993c0bb80dc1a21f40ca0a0c2893252bbe6bcf2b624af8f9dd97f53b4d15ed324cb01b61bf82bb7a3eb3d23f3ebfd76a6ed14bd7718d5740b4ec71486c99b234884352e73332c19ea8b11396d54cb28f3a326e3d
- 7f20fbb5a509059360aabd9e1c497b613abaa92b750d63d5c4503846e5fed3fd3d013f519ec984b110bff541b8144f7df460e4a0685fb1e6715ce1b1b68eb45a29724d614b3b46866a1e0bd5a489afa7763c2cfd598dfd476beee64a4e8554657da72d9495d7b1c982e01b40b10026b78f3d203335bc6d6be790945045b2901e
- 69906710b7bdabfd224a94b932ae0942f81f302d39bc01fc3e069bc35e298f312c9e2c0160eb6a51f1fe65c4362502b2c6572f3a49ad96b3f07de56b5b8877cf53dd2a77d747983373301a37a731208ff44da1c8a2572c0b10feaa551dabde432ebebb1c6fd7119f8f0da21ef682ba0787619bd3f091f50158543be741938bc7
- 10cf58258ee1966cfe506a1e8ba22dd5fddd5d3af2e67bcd5b835e05688ec4613a01ee8cf552715c12397f7e4b79e1fa12547d98e5df818e2f5472c54e91e8a6306dad6ee9a883d5df06e0c85e441968eff1ffcdf954b777d5312729b9049746650c416498878cd7724bfe8345f6a51b8f459d4a92630888de73b15520c011c2
BLS: 380aa8806e10350b114b0ef2b0f7dcc3f45b4db0622ed83ef4e75f8d4a92e81b
BLSPub: 51856b9fe924fe1f5f91713e2ff056dab5602a88c1a72505fb8c2b749143a6788dcced6b86c1c4c25913aa7c993c0bb80dc1a21f40ca0a0c2893252bbe6bcf2b624af8f9dd97f53b4d15ed324cb01b61bf82bb7a3eb3d23f3ebfd76a6ed14bd7718d5740b4ec71486c99b234884352e73332c19ea8b11396d54cb28f3a326e3d
Path: "6PYLmjBYJ4wQTCEfqvnznGJwZeW9pfUcV5m5oreHxqryUgqKpTRAFt9L8Y"
Password: "one"

View file

@ -8,6 +8,11 @@ ProtocolConfiguration:
- 02103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e
- 03d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee699
- 02a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd62
BLSValidators:
- 51856b9fe924fe1f5f91713e2ff056dab5602a88c1a72505fb8c2b749143a6788dcced6b86c1c4c25913aa7c993c0bb80dc1a21f40ca0a0c2893252bbe6bcf2b624af8f9dd97f53b4d15ed324cb01b61bf82bb7a3eb3d23f3ebfd76a6ed14bd7718d5740b4ec71486c99b234884352e73332c19ea8b11396d54cb28f3a326e3d
- 7f20fbb5a509059360aabd9e1c497b613abaa92b750d63d5c4503846e5fed3fd3d013f519ec984b110bff541b8144f7df460e4a0685fb1e6715ce1b1b68eb45a29724d614b3b46866a1e0bd5a489afa7763c2cfd598dfd476beee64a4e8554657da72d9495d7b1c982e01b40b10026b78f3d203335bc6d6be790945045b2901e
- 69906710b7bdabfd224a94b932ae0942f81f302d39bc01fc3e069bc35e298f312c9e2c0160eb6a51f1fe65c4362502b2c6572f3a49ad96b3f07de56b5b8877cf53dd2a77d747983373301a37a731208ff44da1c8a2572c0b10feaa551dabde432ebebb1c6fd7119f8f0da21ef682ba0787619bd3f091f50158543be741938bc7
- 10cf58258ee1966cfe506a1e8ba22dd5fddd5d3af2e67bcd5b835e05688ec4613a01ee8cf552715c12397f7e4b79e1fa12547d98e5df818e2f5472c54e91e8a6306dad6ee9a883d5df06e0c85e441968eff1ffcdf954b777d5312729b9049746650c416498878cd7724bfe8345f6a51b8f459d4a92630888de73b15520c011c2
SeedList:
- 172.200.0.1:20333
- 172.200.0.2:20334
@ -55,5 +60,12 @@ ApplicationConfiguration:
Enabled: false
Port: 20013
UnlockWallet:
BLSValidators:
- 51856b9fe924fe1f5f91713e2ff056dab5602a88c1a72505fb8c2b749143a6788dcced6b86c1c4c25913aa7c993c0bb80dc1a21f40ca0a0c2893252bbe6bcf2b624af8f9dd97f53b4d15ed324cb01b61bf82bb7a3eb3d23f3ebfd76a6ed14bd7718d5740b4ec71486c99b234884352e73332c19ea8b11396d54cb28f3a326e3d
- 7f20fbb5a509059360aabd9e1c497b613abaa92b750d63d5c4503846e5fed3fd3d013f519ec984b110bff541b8144f7df460e4a0685fb1e6715ce1b1b68eb45a29724d614b3b46866a1e0bd5a489afa7763c2cfd598dfd476beee64a4e8554657da72d9495d7b1c982e01b40b10026b78f3d203335bc6d6be790945045b2901e
- 69906710b7bdabfd224a94b932ae0942f81f302d39bc01fc3e069bc35e298f312c9e2c0160eb6a51f1fe65c4362502b2c6572f3a49ad96b3f07de56b5b8877cf53dd2a77d747983373301a37a731208ff44da1c8a2572c0b10feaa551dabde432ebebb1c6fd7119f8f0da21ef682ba0787619bd3f091f50158543be741938bc7
- 10cf58258ee1966cfe506a1e8ba22dd5fddd5d3af2e67bcd5b835e05688ec4613a01ee8cf552715c12397f7e4b79e1fa12547d98e5df818e2f5472c54e91e8a6306dad6ee9a883d5df06e0c85e441968eff1ffcdf954b777d5312729b9049746650c416498878cd7724bfe8345f6a51b8f459d4a92630888de73b15520c011c2
BLS: 2d2c13c5018040977388792913d74f45aed99c260ec4b4fc36d2774fd56cf383
BLSPub: 69906710b7bdabfd224a94b932ae0942f81f302d39bc01fc3e069bc35e298f312c9e2c0160eb6a51f1fe65c4362502b2c6572f3a49ad96b3f07de56b5b8877cf53dd2a77d747983373301a37a731208ff44da1c8a2572c0b10feaa551dabde432ebebb1c6fd7119f8f0da21ef682ba0787619bd3f091f50158543be741938bc7
Path: "6PYX86vYiHfUbpD95hfN1xgnvcSxy5skxfWYKu3ztjecxk6ikYs2kcWbeh"
Password: "three"

View file

@ -8,6 +8,11 @@ ProtocolConfiguration:
- 02103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e
- 03d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee699
- 02a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd62
BLSValidators:
- 51856b9fe924fe1f5f91713e2ff056dab5602a88c1a72505fb8c2b749143a6788dcced6b86c1c4c25913aa7c993c0bb80dc1a21f40ca0a0c2893252bbe6bcf2b624af8f9dd97f53b4d15ed324cb01b61bf82bb7a3eb3d23f3ebfd76a6ed14bd7718d5740b4ec71486c99b234884352e73332c19ea8b11396d54cb28f3a326e3d
- 7f20fbb5a509059360aabd9e1c497b613abaa92b750d63d5c4503846e5fed3fd3d013f519ec984b110bff541b8144f7df460e4a0685fb1e6715ce1b1b68eb45a29724d614b3b46866a1e0bd5a489afa7763c2cfd598dfd476beee64a4e8554657da72d9495d7b1c982e01b40b10026b78f3d203335bc6d6be790945045b2901e
- 69906710b7bdabfd224a94b932ae0942f81f302d39bc01fc3e069bc35e298f312c9e2c0160eb6a51f1fe65c4362502b2c6572f3a49ad96b3f07de56b5b8877cf53dd2a77d747983373301a37a731208ff44da1c8a2572c0b10feaa551dabde432ebebb1c6fd7119f8f0da21ef682ba0787619bd3f091f50158543be741938bc7
- 10cf58258ee1966cfe506a1e8ba22dd5fddd5d3af2e67bcd5b835e05688ec4613a01ee8cf552715c12397f7e4b79e1fa12547d98e5df818e2f5472c54e91e8a6306dad6ee9a883d5df06e0c85e441968eff1ffcdf954b777d5312729b9049746650c416498878cd7724bfe8345f6a51b8f459d4a92630888de73b15520c011c2
SeedList:
- 172.200.0.1:20333
- 172.200.0.2:20334
@ -55,5 +60,12 @@ ApplicationConfiguration:
Enabled: false
Port: 20012
UnlockWallet:
BLSValidators:
- 51856b9fe924fe1f5f91713e2ff056dab5602a88c1a72505fb8c2b749143a6788dcced6b86c1c4c25913aa7c993c0bb80dc1a21f40ca0a0c2893252bbe6bcf2b624af8f9dd97f53b4d15ed324cb01b61bf82bb7a3eb3d23f3ebfd76a6ed14bd7718d5740b4ec71486c99b234884352e73332c19ea8b11396d54cb28f3a326e3d
- 7f20fbb5a509059360aabd9e1c497b613abaa92b750d63d5c4503846e5fed3fd3d013f519ec984b110bff541b8144f7df460e4a0685fb1e6715ce1b1b68eb45a29724d614b3b46866a1e0bd5a489afa7763c2cfd598dfd476beee64a4e8554657da72d9495d7b1c982e01b40b10026b78f3d203335bc6d6be790945045b2901e
- 69906710b7bdabfd224a94b932ae0942f81f302d39bc01fc3e069bc35e298f312c9e2c0160eb6a51f1fe65c4362502b2c6572f3a49ad96b3f07de56b5b8877cf53dd2a77d747983373301a37a731208ff44da1c8a2572c0b10feaa551dabde432ebebb1c6fd7119f8f0da21ef682ba0787619bd3f091f50158543be741938bc7
- 10cf58258ee1966cfe506a1e8ba22dd5fddd5d3af2e67bcd5b835e05688ec4613a01ee8cf552715c12397f7e4b79e1fa12547d98e5df818e2f5472c54e91e8a6306dad6ee9a883d5df06e0c85e441968eff1ffcdf954b777d5312729b9049746650c416498878cd7724bfe8345f6a51b8f459d4a92630888de73b15520c011c2
BLS: 7044746c1d9c9e043a61384a2f46fd0ada2a14b5ff377ba7474b31423c45da3c
BLSPub: 7f20fbb5a509059360aabd9e1c497b613abaa92b750d63d5c4503846e5fed3fd3d013f519ec984b110bff541b8144f7df460e4a0685fb1e6715ce1b1b68eb45a29724d614b3b46866a1e0bd5a489afa7763c2cfd598dfd476beee64a4e8554657da72d9495d7b1c982e01b40b10026b78f3d203335bc6d6be790945045b2901e
Path: "6PYXHjPaNvW8YknSXaKsTWjf9FRxo1s4naV2jdmSQEgzaqKGX368rndN3L"
Password: "two"

3
go.mod
View file

@ -7,7 +7,7 @@ require (
github.com/go-redis/redis v6.10.2+incompatible
github.com/go-yaml/yaml v2.1.0+incompatible
github.com/mr-tron/base58 v1.1.2
github.com/nspcc-dev/dbft v0.0.0-20191213082456-c81c7a796775
github.com/nspcc-dev/dbft v0.0.0-20191218095856-a0151004c0e6
github.com/nspcc-dev/rfc6979 v0.1.0
github.com/pkg/errors v0.8.1
github.com/prometheus/client_golang v1.2.1
@ -15,6 +15,7 @@ require (
github.com/stretchr/testify v1.4.0
github.com/syndtr/goleveldb v0.0.0-20180307113352-169b1b37be73
github.com/urfave/cli v1.20.0
go.dedis.ch/kyber/v4 v4.0.0-pre2
go.uber.org/atomic v1.4.0
go.uber.org/zap v1.10.0
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4

15
go.sum
View file

@ -94,8 +94,8 @@ github.com/nspcc-dev/dbft v0.0.0-20191205084618-dacb1a30c254 h1:A4OkQDQOSPsJF8qU
github.com/nspcc-dev/dbft v0.0.0-20191205084618-dacb1a30c254/go.mod h1:w1Ln2aT+dBlPhLnuZhBV+DfPEdS2CHWWLp5JTScY3bw=
github.com/nspcc-dev/dbft v0.0.0-20191209120240-0d6b7568d9ae h1:T5V1QANlNMKun0EPB3eqg2PTXG4rmLhzDyEiV63kdB0=
github.com/nspcc-dev/dbft v0.0.0-20191209120240-0d6b7568d9ae/go.mod h1:3FjXOoHmA51EGfb5GS/HOv7VdmngNRTssSeQ729dvGY=
github.com/nspcc-dev/dbft v0.0.0-20191213082456-c81c7a796775 h1:iqRxuEBrT2QbSdgmvGCwgn+lnOKmx1L5EiVTcOXUYt8=
github.com/nspcc-dev/dbft v0.0.0-20191213082456-c81c7a796775/go.mod h1:IyIyVYKfi41kAlGWqicz9G8Iyni71Resuhtd9Y5ujJM=
github.com/nspcc-dev/dbft v0.0.0-20191218095856-a0151004c0e6 h1:x6dNWn3ifNesdN5bW7dQadeZWFNLAaEsQ5L5phCy5Ek=
github.com/nspcc-dev/dbft v0.0.0-20191218095856-a0151004c0e6/go.mod h1:yEPpS/iA3ZN6yJwq9EbRLVVMK36YR3TuevCjOht+34U=
github.com/nspcc-dev/neofs-crypto v0.2.0 h1:ftN+59WqxSWz/RCgXYOfhmltOOqU+udsNQSvN6wkFck=
github.com/nspcc-dev/neofs-crypto v0.2.0/go.mod h1:F/96fUzPM3wR+UGsPi3faVNmFlA9KAEAUQR7dMxZmNA=
github.com/nspcc-dev/rfc6979 v0.1.0 h1:Lwg7esRRoyK1Up/IN1vAef1EmvrBeMHeeEkek2fAJ6c=
@ -149,6 +149,15 @@ github.com/yuin/gopher-lua v0.0.0-20190514113301-1cd887cd7036 h1:1b6PAtenNyhsmo/
github.com/yuin/gopher-lua v0.0.0-20190514113301-1cd887cd7036/go.mod h1:gqRgreBUhTSL0GeU64rtZ3Uq3wtjOa/TB2YfrtkCbVQ=
github.com/yuin/gopher-lua v0.0.0-20191128022950-c6266f4fe8d7 h1:Y17pEjKgx2X0A69WQPGa8hx/Myzu+4NdUxlkZpbAYio=
github.com/yuin/gopher-lua v0.0.0-20191128022950-c6266f4fe8d7/go.mod h1:gqRgreBUhTSL0GeU64rtZ3Uq3wtjOa/TB2YfrtkCbVQ=
go.dedis.ch/fixbuf v1.0.3 h1:hGcV9Cd/znUxlusJ64eAlExS+5cJDIyTyEG+otu5wQs=
go.dedis.ch/fixbuf v1.0.3/go.mod h1:yzJMt34Wa5xD37V5RTdmp38cz3QhMagdGoem9anUalw=
go.dedis.ch/kyber/v3 v3.0.4 h1:FDuC/S3STkvwxZ0ooo3gcp56QkUKsN7Jy7cpzBxL+vQ=
go.dedis.ch/kyber/v3 v3.0.4/go.mod h1:OzvaEnPvKlyrWyp3kGXlFdp7ap1VC6RkZDTaPikqhsQ=
go.dedis.ch/kyber/v4 v4.0.0-pre2 h1:+KMfT7P/+KOfeYge3tY3JrnJXka8NwQacaL+BFkRts8=
go.dedis.ch/kyber/v4 v4.0.0-pre2/go.mod h1:+e66qaKOPauwNsLgvFyoU4n2vj6BMxdvNc/suD72H9g=
go.dedis.ch/protobuf v1.0.5/go.mod h1:eIV4wicvi6JK0q/QnfIEGeSFNG0ZeB24kzut5+HaRLo=
go.dedis.ch/protobuf v1.0.7 h1:wRUEiq3u0/vBhLjcw9CmAVrol+BnDyq2M0XLukdphyI=
go.dedis.ch/protobuf v1.0.7/go.mod h1:pv5ysfkDX/EawiPqcW3ikOxsL5t+BqnV6xHSmE79KI4=
go.etcd.io/bbolt v1.3.3 h1:MUGmc65QhB3pIlaQ5bB4LwqSj6GIonVJXpZiaKNyaKk=
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU=
@ -158,6 +167,7 @@ go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/
go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM=
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190123085648-057139ce5d2b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc=
@ -176,6 +186,7 @@ golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5h
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e h1:o3PsSEY8E4eXWkXrIP9YJALUkVZqzHJT5DOasTyn8Vs=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190124100055-b90733256f2e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=

View file

@ -20,7 +20,7 @@ var _ block.Block = (*neoBlock)(nil)
// Sign implements block.Block interface.
func (n *neoBlock) Sign(key crypto.PrivateKey) error {
data := n.BlockBase.GetHashableData()
data := n.BlockBase.VerificationHash()
sig, err := key.Sign(data[:])
if err != nil {
return err
@ -33,8 +33,8 @@ func (n *neoBlock) Sign(key crypto.PrivateKey) error {
// Verify implements block.Block interface.
func (n *neoBlock) Verify(key crypto.PublicKey, sign []byte) error {
data := n.BlockBase.GetHashableData()
return key.Verify(data, sign)
data := n.BlockBase.VerificationHash()
return key.Verify(data[:], sign)
}
// Transactions implements block.Block interface.

View file

@ -1,7 +1,10 @@
package consensus
import (
"bytes"
"encoding/hex"
"errors"
"math/big"
"math/rand"
"sort"
"time"
@ -19,6 +22,8 @@ import (
"github.com/nspcc-dev/dbft/block"
"github.com/nspcc-dev/dbft/crypto"
"github.com/nspcc-dev/dbft/payload"
"go.dedis.ch/kyber/v4"
"go.dedis.ch/kyber/v4/pairing"
"go.uber.org/zap"
)
@ -56,6 +61,7 @@ type service struct {
// everything in single thread.
messages chan Payload
transactions chan *transaction.Transaction
validators []crypto.PublicKey
}
// Config is a configuration for consensus services.
@ -103,7 +109,17 @@ func NewService(cfg Config) (Service, error) {
return srv, nil
}
priv, pub := getKeyPair(cfg.Wallet)
priv, pub := getBLSKeyPair(cfg.Wallet)
for _, s := range cfg.Wallet.BLSValidators {
srv.validators = append(srv.validators, crypto.NewBLSPublicKey(getBLSPub(s)))
}
sort.Slice(srv.validators, func(i, j int) bool {
pi, _ := srv.validators[i].MarshalBinary()
pj, _ := srv.validators[j].MarshalBinary()
return bytes.Compare(pi, pj) == -1
})
srv.dbft = dbft.New(
dbft.WithLogger(srv.log.Desugar()),
@ -177,6 +193,45 @@ func (s *service) validatePayload(p *Payload) bool {
return p.Verify(h)
}
var blsSuite = pairing.NewSuiteBn256()
func getBLSPub(s string) kyber.Point {
data, err := hex.DecodeString(s)
if err != nil {
return nil
}
pub := blsSuite.Point()
err = pub.UnmarshalBinary(data)
if err != nil {
return nil
}
return pub
}
func getBLSPriv(s string) kyber.Scalar {
data, err := hex.DecodeString(s)
if err != nil {
return nil
}
priv := blsSuite.Scalar()
err = priv.UnmarshalBinary(data)
if err != nil {
return nil
}
return priv
}
func getBLSKeyPair(cfg *config.WalletConfig) (crypto.PrivateKey, crypto.PublicKey) {
priv := getBLSPriv(cfg.BLS)
pub := getBLSPub(cfg.BLSPub)
return crypto.NewBLSPrivateKey(priv), crypto.NewBLSPublicKey(pub)
}
func getKeyPair(cfg *config.WalletConfig) (crypto.PrivateKey, crypto.PublicKey) {
acc, err := wallet.DecryptAccount(cfg.Path, cfg.Password)
if err != nil {
@ -238,9 +293,9 @@ func (s *service) broadcast(p payload.ConsensusPayload) {
pr.minerTx = *s.txx.Get(pr.transactionHashes[0]).(*transaction.Transaction)
}
if err := p.(*Payload).Sign(s.dbft.Priv.(*privateKey)); err != nil {
s.log.Warnf("can't sign consensus payload: %v", err)
}
// if err := p.(*Payload).Sign(s.dbft.Priv.(*privateKey)); err != nil {
// s.log.Warnf("can't sign consensus payload: %v", err)
// }
s.cache.Add(p)
s.Config.Broadcast(p.(*Payload))
@ -269,7 +324,7 @@ func (s *service) verifyBlock(b block.Block) bool {
func (s *service) processBlock(b block.Block) {
bb := &b.(*neoBlock).Block
bb.Script = *(s.getBlockWitness(bb))
bb.Script = *(s.getBlockWitnessBLS(bb))
if err := s.Chain.AddBlock(bb); err != nil {
s.log.Warnf("error on add block: %v", err)
@ -278,6 +333,68 @@ func (s *service) processBlock(b block.Block) {
}
}
func (s *service) getBlockWitnessBLS(b *core.Block) *transaction.Witness {
dctx := s.dbft.Context
pubs := dctx.Validators
sigs := make(map[crypto.PublicKey][]byte)
for i := range dctx.Validators {
if p := dctx.CommitPayloads[i]; p != nil && p.ViewNumber() == dctx.ViewNumber {
sigs[pubs[i]] = p.GetCommit().Signature()
}
}
pubKeys := make([][]byte, len(pubs))
for i := range pubs {
pubKeys[i], _ = pubs[i].MarshalBinary()
}
m := s.dbft.Context.M()
verif, err := smartcontract.CreateBLSMultisigScript(m, pubKeys)
if err != nil {
s.log.Warnf("can't create multisig redeem script: %v", err)
return nil
}
var indices []int
var sigSlice [][]byte
for i := range pubs {
if s := sigs[pubs[i]]; s != nil {
indices = append(indices, i)
sigSlice = append(sigSlice, s)
}
}
sig, err := crypto.AggregateBLSSignatures(sigSlice...)
if err != nil {
return nil
}
pk := make([]crypto.PublicKey, len(sigSlice))
mask := big.NewInt(0)
for i, j := range indices {
pk[i] = pubs[j]
// keys will be pushed in reverse order
t := new(big.Int).Lsh(big.NewInt(1), uint(len(pubs)-j-1))
mask.Or(mask, t)
}
var invoc []byte
invoc = append(invoc, byte(opcode.PUSHBYTES64))
invoc = append(invoc, sig...)
buf := mask.Bytes()
invoc = append(invoc, byte(opcode.PUSHBYTES1)+byte(len(buf)-1))
invoc = append(invoc, buf...)
return &transaction.Witness{
InvocationScript: invoc,
VerificationScript: verif,
}
}
func (s *service) getBlockWitness(b *core.Block) *transaction.Witness {
dctx := s.dbft.Context
pubs := convertKeys(dctx.Validators)
@ -355,6 +472,8 @@ func (s *service) getVerifiedTx(count int) []block.Transaction {
}
func (s *service) getValidators(txx ...block.Transaction) []crypto.PublicKey {
return s.validators
var pKeys []*keys.PublicKey
if len(txx) == 0 {
pKeys, _ = s.Chain.GetValidators()
@ -376,9 +495,12 @@ func (s *service) getValidators(txx ...block.Transaction) []crypto.PublicKey {
}
func (s *service) getConsensusAddress(validators ...crypto.PublicKey) (h util.Uint160) {
pubs := convertKeys(validators)
pubKeys := make([][]byte, len(validators))
for i := range validators {
pubKeys[i], _ = validators[i].MarshalBinary()
}
script, err := smartcontract.CreateMultiSigRedeemScript(s.dbft.M(), pubs)
script, err := smartcontract.CreateBLSMultisigScript(s.dbft.M(), pubKeys)
if err != nil {
return
}

View file

@ -1,6 +1,10 @@
package consensus
import (
"crypto/rand"
"encoding/hex"
"fmt"
"github.com/nspcc-dev/dbft/crypto"
"testing"
"github.com/CityOfZion/neo-go/pkg/crypto/keys"
@ -41,3 +45,14 @@ func TestCrypt(t *testing.T) {
sign[0] = ^sign[0]
require.Error(t, pub.Verify(data, sign))
}
func Test1(t *testing.T) {
for i := 0; i < 4; i++ {
priv, pub := crypto.GenerateWith(crypto.SuiteBLS, rand.Reader)
data, _ := priv.MarshalBinary()
fmt.Printf("pri %d: %s\n", i, hex.EncodeToString(data))
data, _ = pub.MarshalBinary()
fmt.Printf("pub %d: %s\n", i, hex.EncodeToString(data))
}
}

View file

@ -1467,6 +1467,7 @@ func (bc *Blockchain) verifyBlockWitnesses(block *Block, prevHeader *Header) err
hash = prevHeader.NextConsensus
}
interopCtx := newInteropContext(trigger.Verification, bc, bc.dao.store, nil, nil)
return bc.verifyHashAgainstScript(block.Script.ScriptHash(), &block.Script, block.VerificationHash(), interopCtx, true)
return bc.verifyHashAgainstScript(hash, &block.Script, block.VerificationHash(), interopCtx, true)
}

View file

@ -41,3 +41,26 @@ func CreateMultiSigRedeemScript(m int, publicKeys keys.PublicKeys) ([]byte, erro
return buf.Bytes(), nil
}
func CreateBLSMultisigScript(m int, pubs [][]byte) ([]byte, error) {
sort.Slice(pubs, func(i, j int) bool { return bytes.Compare(pubs[i], pubs[j]) == -1 })
buf := new(bytes.Buffer)
if err := vm.EmitInt(buf, int64(m)); err != nil {
return nil, err
}
for i := range pubs {
if err := vm.EmitBytes(buf, pubs[i]); err != nil {
return nil, err
}
}
if err := vm.EmitInt(buf, int64(len(pubs))); err != nil {
return nil, err
}
if err := vm.EmitOpcode(buf, opcode.CHECKBLS); err != nil {
return nil, err
}
return buf.Bytes(), nil
}

View file

@ -185,6 +185,7 @@ const (
CHECKSIG Opcode = 0xAC
VERIFY Opcode = 0xAD
CHECKMULTISIG Opcode = 0xAE
CHECKBLS Opcode = 0xAF
// Advanced data structures (arrays, structures, maps)
ARRAYSIZE Opcode = 0xC0

View file

@ -16,6 +16,9 @@ import (
"github.com/CityOfZion/neo-go/pkg/util"
"github.com/CityOfZion/neo-go/pkg/vm/opcode"
"github.com/pkg/errors"
"go.dedis.ch/kyber/v4"
"go.dedis.ch/kyber/v4/pairing"
"go.dedis.ch/kyber/v4/sign/bls"
)
type errorAtInstruct struct {
@ -1174,6 +1177,40 @@ func (v *VM) execute(ctx *Context, op opcode.Opcode, parameter []byte) (err erro
res := pkey.Verify(signature, hashToCheck)
v.estack.PushVal(res)
case opcode.CHECKBLS:
pkeys, err := v.estack.popSigElements()
if err != nil {
panic(fmt.Sprintf("wrong parameters: %s", err.Error()))
}
m := v.estack.Pop().BigInt().Int64()
mask := v.estack.Pop().BigInt()
sig := v.estack.Pop().Bytes()
s := pairing.NewSuiteBn256()
var pubs []kyber.Point
for i := range pkeys {
if mask.Bit(i) == 1 {
m--
pub := s.Point()
err := pub.UnmarshalBinary(pkeys[i])
if err != nil {
panic(err)
}
pubs = append(pubs, pub)
}
}
if m != 0 {
panic("wrong number of signatures")
}
pub := bls.AggregatePublicKeys(s, pubs...)
err = bls.Verify(s, pub, v.checkhash, sig)
v.estack.PushVal(err == nil)
case opcode.CHECKMULTISIG:
pkeys, err := v.estack.popSigElements()
if err != nil {