shachain: complete shachain implementation
This commit is contained in:
1 parent
3a647869b6
commit
b40afeaa08
9 files changed
+1279
-182
No files matched your search
@@ -0,0 +1,466 @@
|
||||
package shachain
|
||||
|
||||
import (
|
||||
"github.com/roasbeef/btcd/chaincfg/chainhash"
|
||||
"testing"
|
||||
)
|
||||
|
||||
type testInsert struct {
|
||||
index index
|
||||
secret string
|
||||
successful bool
|
||||
}
|
||||
|
||||
var tests = []struct {
|
||||
name string
|
||||
inserts []testInsert
|
||||
}{
|
||||
{
|
||||
name: "insert_secret correct sequence",
|
||||
inserts: []testInsert{
|
||||
{
|
||||
index: 281474976710655,
|
||||
secret: "7cc854b54e3e0dcdb010d7a3fee464a9687b" +
|
||||
"e6e8db3be6854c475621e007a5dc",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710654,
|
||||
secret: "c7518c8ae4660ed02894df8976fa1a3659c1" +
|
||||
"a8b4b5bec0c4b872abeba4cb8964",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710653,
|
||||
secret: "2273e227a5b7449b6e70f1fb4652864038b1" +
|
||||
"cbf9cd7c043a7d6456b7fc275ad8",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710652,
|
||||
secret: "27cddaa5624534cb6cb9d7da077cf2b22ab2" +
|
||||
"1e9b506fd4998a51d54502e99116",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710651,
|
||||
secret: "c65716add7aa98ba7acb236352d665cab173" +
|
||||
"45fe45b55fb879ff80e6bd0c41dd",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710650,
|
||||
secret: "969660042a28f32d9be17344e09374b37996" +
|
||||
"2d03db1574df5a8a5a47e19ce3f2",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710649,
|
||||
secret: "a5a64476122ca0925fb344bdc1854c1c0a59" +
|
||||
"fc614298e50a33e331980a220f32",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710648,
|
||||
secret: "05cde6323d949933f7f7b78776bcc1ea6d9b" +
|
||||
"31447732e3802e1f7ac44b650e17",
|
||||
successful: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "insert_secret #1 incorrect",
|
||||
inserts: []testInsert{
|
||||
{
|
||||
index: 281474976710655,
|
||||
secret: "02a40c85b6f28da08dfdbe0926c53fab2d" +
|
||||
"e6d28c10301f8f7c4073d5e42e3148",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710654,
|
||||
secret: "c7518c8ae4660ed02894df8976fa1a3659" +
|
||||
"c1a8b4b5bec0c4b872abeba4cb8964",
|
||||
successful: false,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "insert_secret #2 incorrect (#1 derived from incorrect)",
|
||||
inserts: []testInsert{
|
||||
{
|
||||
index: 281474976710655,
|
||||
secret: "02a40c85b6f28da08dfdbe0926c53fab2de6" +
|
||||
"d28c10301f8f7c4073d5e42e3148",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710654,
|
||||
secret: "dddc3a8d14fddf2b68fa8c7fbad274827493" +
|
||||
"7479dd0f8930d5ebb4ab6bd866a3",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710653,
|
||||
secret: "2273e227a5b7449b6e70f1fb4652864038b1" +
|
||||
"cbf9cd7c043a7d6456b7fc275ad8",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710652,
|
||||
secret: "27cddaa5624534cb6cb9d7da077cf2b22a" +
|
||||
"b21e9b506fd4998a51d54502e99116",
|
||||
successful: false,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "insert_secret #3 incorrect",
|
||||
inserts: []testInsert{
|
||||
{
|
||||
index: 281474976710655,
|
||||
secret: "7cc854b54e3e0dcdb010d7a3fee464a9687b" +
|
||||
"e6e8db3be6854c475621e007a5dc",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710654,
|
||||
secret: "c7518c8ae4660ed02894df8976fa1a3659c1" +
|
||||
"a8b4b5bec0c4b872abeba4cb8964",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710653,
|
||||
secret: "c51a18b13e8527e579ec56365482c62f180b" +
|
||||
"7d5760b46e9477dae59e87ed423a",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710652,
|
||||
secret: "27cddaa5624534cb6cb9d7da077cf2b22ab2" +
|
||||
"1e9b506fd4998a51d54502e99116",
|
||||
successful: false,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "insert_secret #4 incorrect (1,2,3 derived from incorrect)",
|
||||
inserts: []testInsert{
|
||||
{
|
||||
index: 281474976710655,
|
||||
secret: "02a40c85b6f28da08dfdbe0926c53fab2de6" +
|
||||
"d28c10301f8f7c4073d5e42e3148",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710654,
|
||||
secret: "dddc3a8d14fddf2b68fa8c7fbad274827493" +
|
||||
"7479dd0f8930d5ebb4ab6bd866a3",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710653,
|
||||
secret: "c51a18b13e8527e579ec56365482c62f18" +
|
||||
"0b7d5760b46e9477dae59e87ed423a",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710652,
|
||||
secret: "ba65d7b0ef55a3ba300d4e87af29868f39" +
|
||||
"4f8f138d78a7011669c79b37b936f4",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710651,
|
||||
secret: "c65716add7aa98ba7acb236352d665cab1" +
|
||||
"7345fe45b55fb879ff80e6bd0c41dd",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710650,
|
||||
secret: "969660042a28f32d9be17344e09374b379" +
|
||||
"962d03db1574df5a8a5a47e19ce3f2",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710649,
|
||||
secret: "a5a64476122ca0925fb344bdc1854c1c0a" +
|
||||
"59fc614298e50a33e331980a220f32",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710649,
|
||||
secret: "05cde6323d949933f7f7b78776bcc1ea6d9b" +
|
||||
"31447732e3802e1f7ac44b650e17",
|
||||
successful: false,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "insert_secret #5 incorrect",
|
||||
inserts: []testInsert{
|
||||
{
|
||||
index: 281474976710655,
|
||||
secret: "7cc854b54e3e0dcdb010d7a3fee464a9687b" +
|
||||
"e6e8db3be6854c475621e007a5dc",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710654,
|
||||
secret: "c7518c8ae4660ed02894df8976fa1a3659c1a" +
|
||||
"8b4b5bec0c4b872abeba4cb8964",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710653,
|
||||
secret: "2273e227a5b7449b6e70f1fb4652864038b1" +
|
||||
"cbf9cd7c043a7d6456b7fc275ad8",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710652,
|
||||
secret: "27cddaa5624534cb6cb9d7da077cf2b22ab21" +
|
||||
"e9b506fd4998a51d54502e99116",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710651,
|
||||
secret: "631373ad5f9ef654bb3dade742d09504c567" +
|
||||
"edd24320d2fcd68e3cc47e2ff6a6",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710650,
|
||||
secret: "969660042a28f32d9be17344e09374b37996" +
|
||||
"2d03db1574df5a8a5a47e19ce3f2",
|
||||
successful: false,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "insert_secret #6 incorrect (5 derived from incorrect)",
|
||||
inserts: []testInsert{
|
||||
{
|
||||
index: 281474976710655,
|
||||
secret: "7cc854b54e3e0dcdb010d7a3fee464a9687b" +
|
||||
"e6e8db3be6854c475621e007a5dc",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710654,
|
||||
secret: "c7518c8ae4660ed02894df8976fa1a3659c1a" +
|
||||
"8b4b5bec0c4b872abeba4cb8964",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710653,
|
||||
secret: "2273e227a5b7449b6e70f1fb4652864038b1" +
|
||||
"cbf9cd7c043a7d6456b7fc275ad8",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710652,
|
||||
secret: "27cddaa5624534cb6cb9d7da077cf2b22ab21" +
|
||||
"e9b506fd4998a51d54502e99116",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710651,
|
||||
secret: "631373ad5f9ef654bb3dade742d09504c567" +
|
||||
"edd24320d2fcd68e3cc47e2ff6a6",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710650,
|
||||
secret: "b7e76a83668bde38b373970155c868a65330" +
|
||||
"4308f9896692f904a23731224bb1",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710649,
|
||||
secret: "a5a64476122ca0925fb344bdc1854c1c0a59f" +
|
||||
"c614298e50a33e331980a220f32",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710648,
|
||||
secret: "05cde6323d949933f7f7b78776bcc1ea6d9b" +
|
||||
"31447732e3802e1f7ac44b650e17",
|
||||
successful: false,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "insert_secret #7 incorrect",
|
||||
inserts: []testInsert{
|
||||
{
|
||||
index: 281474976710655,
|
||||
secret: "7cc854b54e3e0dcdb010d7a3fee464a9687b" +
|
||||
"e6e8db3be6854c475621e007a5dc",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710654,
|
||||
secret: "c7518c8ae4660ed02894df8976fa1a3659c1a" +
|
||||
"8b4b5bec0c4b872abeba4cb8964",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710653,
|
||||
secret: "2273e227a5b7449b6e70f1fb4652864038b1" +
|
||||
"cbf9cd7c043a7d6456b7fc275ad8",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710652,
|
||||
secret: "27cddaa5624534cb6cb9d7da077cf2b22ab21" +
|
||||
"e9b506fd4998a51d54502e99116",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710651,
|
||||
secret: "c65716add7aa98ba7acb236352d665cab173" +
|
||||
"45fe45b55fb879ff80e6bd0c41dd",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710650,
|
||||
secret: "969660042a28f32d9be17344e09374b37996" +
|
||||
"2d03db1574df5a8a5a47e19ce3f2",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710649,
|
||||
secret: "e7971de736e01da8ed58b94c2fc216cb1d" +
|
||||
"ca9e326f3a96e7194fe8ea8af6c0a3",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710648,
|
||||
secret: "05cde6323d949933f7f7b78776bcc1ea6d" +
|
||||
"9b31447732e3802e1f7ac44b650e17",
|
||||
successful: false,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "insert_secret #8 incorrect",
|
||||
inserts: []testInsert{
|
||||
{
|
||||
index: 281474976710655,
|
||||
secret: "7cc854b54e3e0dcdb010d7a3fee464a9687b" +
|
||||
"e6e8db3be6854c475621e007a5dc",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710654,
|
||||
secret: "c7518c8ae4660ed02894df8976fa1a3659c1a" +
|
||||
"8b4b5bec0c4b872abeba4cb8964",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710653,
|
||||
secret: "2273e227a5b7449b6e70f1fb4652864038b1" +
|
||||
"cbf9cd7c043a7d6456b7fc275ad8",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710652,
|
||||
secret: "27cddaa5624534cb6cb9d7da077cf2b22ab21" +
|
||||
"e9b506fd4998a51d54502e99116",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710651,
|
||||
secret: "c65716add7aa98ba7acb236352d665cab173" +
|
||||
"45fe45b55fb879ff80e6bd0c41dd",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710650,
|
||||
secret: "969660042a28f32d9be17344e09374b37996" +
|
||||
"2d03db1574df5a8a5a47e19ce3f2",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710649,
|
||||
secret: "a5a64476122ca0925fb344bdc1854c1c0a" +
|
||||
"59fc614298e50a33e331980a220f32",
|
||||
successful: true,
|
||||
},
|
||||
{
|
||||
index: 281474976710648,
|
||||
secret: "a7efbc61aac46d34f77778bac22c8a20c6" +
|
||||
"a46ca460addc49009bda875ec88fa4",
|
||||
successful: false,
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
// TestSpecificationShaChainInsert is used to check the consistence with
|
||||
// specification hash insert function.
|
||||
func TestSpecificationShaChainInsert(t *testing.T) {
|
||||
for _, test := range tests {
|
||||
receiver := NewRevocationStore()
|
||||
|
||||
for _, insert := range test.inserts {
|
||||
secret, err := hashFromString(insert.secret)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if err := receiver.Store(secret); err != nil {
|
||||
if insert.successful {
|
||||
t.Fatalf("Failed (%v): error was "+
|
||||
"received but it shouldn't: "+
|
||||
"%v", test.name, err)
|
||||
}
|
||||
} else {
|
||||
if !insert.successful {
|
||||
t.Fatalf("Failed (%v): error wasn't "+
|
||||
"received", test.name)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
t.Logf("Passed (%v)", test.name)
|
||||
}
|
||||
}
|
||||
|
||||
// TestShaChainStore checks the ability of shachain store to hold the produces
|
||||
// secrets after recovering from bytes data.
|
||||
func TestShaChainStore(t *testing.T) {
|
||||
hash := chainhash.DoubleHashH([]byte("shachaintest"))
|
||||
seed := &hash
|
||||
|
||||
sender := NewRevocationProducer(seed)
|
||||
receiver := NewRevocationStore()
|
||||
|
||||
for n := uint64(0); n < 10000; n++ {
|
||||
sha, err := sender.AtIndex(n)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if err = receiver.Store(sha); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
data, err := receiver.ToBytes()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
receiver, err = NewRevocationStoreFromBytes(data)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
for n := uint64(0); n < 10000; n++ {
|
||||
if _, err := receiver.LookUp(n); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user