From 56f28145dd19105a023fd54d6a7f24c3181fae95 Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Fri, 30 Mar 2018 22:36:04 +0200 Subject: [PATCH 01/50] working on it --- Gopkg.lock | 2 +- store/iavlstore.go | 19 ++++++++++++++- store/iavlstore_test.go | 52 +++++++++++++++++++++++++++++++++++++++-- 3 files changed, 69 insertions(+), 4 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index 267acf32b0..3773902977 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -458,6 +458,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "cce90fda84a63ae5b41b40f0edc357eec4020d17fdd61585960ad537418749ea" + inputs-digest = "ed1f3f7f1728cd02945f90ca780e9bdc982573a36a5cc8d7e9f19fb40ba2ca19" solver-name = "gps-cdcl" solver-version = 1 diff --git a/store/iavlstore.go b/store/iavlstore.go index 96110c59c9..5f1917e2c2 100644 --- a/store/iavlstore.go +++ b/store/iavlstore.go @@ -122,7 +122,24 @@ func (st *iavlStore) Iterator(start, end []byte) Iterator { func (st *iavlStore) Subspace(prefix []byte) Iterator { end := make([]byte, len(prefix)) copy(end, prefix) - end[len(end)-1]++ + finished := false + i := 1 + + for !finished { + fmt.Printf("%v %v \n", len(end), i) + fmt.Printf("%v \n", end) + if end[len(end)-i] != byte(255) { + end[len(end)-i]++ + finished = true + } else { + end[len(end)-i]++ + i++ + if i > len(end) { + end = []byte{} + finished = true + } + } + } return st.Iterator(prefix, end) } diff --git a/store/iavlstore_test.go b/store/iavlstore_test.go index 7adae625ea..85e02ba258 100644 --- a/store/iavlstore_test.go +++ b/store/iavlstore_test.go @@ -73,13 +73,26 @@ func TestIAVLIterator(t *testing.T) { iavlStore := newIAVLStore(tree, numHistory) iter := iavlStore.Iterator([]byte("aloha"), []byte("hellz")) expected := []string{"aloha", "hello"} - for i := 0; iter.Valid(); iter.Next() { + i := 0 + for i = 0; iter.Valid(); iter.Next() { expectedKey := expected[i] key, value := iter.Key(), iter.Value() assert.EqualValues(t, key, expectedKey) assert.EqualValues(t, value, treeData[expectedKey]) i += 1 } + assert.Equal(t, i, len(expected)) + + iter = iavlStore.Iterator([]byte("golang"), []byte("rocks")) + expected = []string{"hello"} + for i = 0; iter.Valid(); iter.Next() { + expectedKey := expected[i] + key, value := iter.Key(), iter.Value() + assert.EqualValues(t, key, expectedKey) + assert.EqualValues(t, value, treeData[expectedKey]) + i += 1 + } + assert.Equal(t, i, len(expected)) } func TestIAVLSubspace(t *testing.T) { @@ -90,16 +103,51 @@ func TestIAVLSubspace(t *testing.T) { iavlStore.Set([]byte("test1"), []byte("test1")) iavlStore.Set([]byte("test2"), []byte("test2")) iavlStore.Set([]byte("test3"), []byte("test3")) + iavlStore.Set([]byte{byte(55), byte(255), byte(255), byte(0)}, []byte("test4")) + iavlStore.Set([]byte{byte(55), byte(255), byte(255), byte(1)}, []byte("test4")) + iavlStore.Set([]byte{byte(55), byte(255), byte(255), byte(255)}, []byte("test4")) + i := 0 iter := iavlStore.Subspace([]byte("test")) expected := []string{"test1", "test2", "test3"} - for i := 0; iter.Valid(); iter.Next() { + for i = 0; iter.Valid(); iter.Next() { expectedKey := expected[i] key, value := iter.Key(), iter.Value() assert.EqualValues(t, key, expectedKey) assert.EqualValues(t, value, expectedKey) i += 1 } + assert.Equal(t, i, len(expected)) + + iter = iavlStore.Subspace([]byte{byte(55), byte(255), byte(255)}) + expected2 := [][]byte{ + []byte{byte(55), byte(255), byte(255), byte(0)}, + []byte{byte(55), byte(255), byte(255), byte(1)}, + []byte{byte(55), byte(255), byte(255), byte(255)}, + } + for i = 0; iter.Valid(); iter.Next() { + expectedKey := expected2[i] + key, value := iter.Key(), iter.Value() + assert.EqualValues(t, key, expectedKey) + assert.EqualValues(t, value, []byte("test4")) + i += 1 + } + assert.Equal(t, i, len(expected)) + + iter = iavlStore.Subspace([]byte{byte(255), byte(255)}) + expected2 = [][]byte{ + []byte{byte(255), byte(255), byte(0)}, + []byte{byte(255), byte(255), byte(1)}, + []byte{byte(255), byte(255), byte(255)}, + } + for i = 0; iter.Valid(); iter.Next() { + expectedKey := expected2[i] + key, value := iter.Key(), iter.Value() + assert.EqualValues(t, key, expectedKey) + assert.EqualValues(t, value, []byte("test4")) + i += 1 + } + assert.Equal(t, i, len(expected)) } func TestIAVLStoreQuery(t *testing.T) { From 271d240897a6826074125eb29fd754692dad3984 Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Sat, 31 Mar 2018 19:30:25 +0200 Subject: [PATCH 02/50] trying to figure it out --- store/iavlstore.go | 6 +++--- store/iavlstore_test.go | 21 ++++++++++++++++----- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/store/iavlstore.go b/store/iavlstore.go index 5f1917e2c2..a1a48722cb 100644 --- a/store/iavlstore.go +++ b/store/iavlstore.go @@ -126,8 +126,6 @@ func (st *iavlStore) Subspace(prefix []byte) Iterator { i := 1 for !finished { - fmt.Printf("%v %v \n", len(end), i) - fmt.Printf("%v \n", end) if end[len(end)-i] != byte(255) { end[len(end)-i]++ finished = true @@ -135,11 +133,12 @@ func (st *iavlStore) Subspace(prefix []byte) Iterator { end[len(end)-i]++ i++ if i > len(end) { - end = []byte{} + end = nil finished = true } } } + fmt.Printf("%v \n", end) return st.Iterator(prefix, end) } @@ -243,6 +242,7 @@ func newIAVLIterator(tree *iavl.Tree, start, end []byte, ascending bool) *iavlIt quitCh: make(chan struct{}), initCh: make(chan struct{}), } + fmt.Printf("%v %v \n", iter.start, iter.end) go iter.iterateRoutine() go iter.initRoutine() return iter diff --git a/store/iavlstore_test.go b/store/iavlstore_test.go index 85e02ba258..6e276c3d22 100644 --- a/store/iavlstore_test.go +++ b/store/iavlstore_test.go @@ -81,7 +81,7 @@ func TestIAVLIterator(t *testing.T) { assert.EqualValues(t, value, treeData[expectedKey]) i += 1 } - assert.Equal(t, i, len(expected)) + assert.Equal(t, len(expected), i) iter = iavlStore.Iterator([]byte("golang"), []byte("rocks")) expected = []string{"hello"} @@ -92,7 +92,18 @@ func TestIAVLIterator(t *testing.T) { assert.EqualValues(t, value, treeData[expectedKey]) i += 1 } - assert.Equal(t, i, len(expected)) + assert.Equal(t, len(expected), i) + + iter = iavlStore.Iterator([]byte("golang"), nil) + expected = []string{"hello"} + for i = 0; iter.Valid(); iter.Next() { + expectedKey := expected[i] + key, value := iter.Key(), iter.Value() + assert.EqualValues(t, key, expectedKey) + assert.EqualValues(t, value, treeData[expectedKey]) + i += 1 + } + assert.Equal(t, len(expected), i) } func TestIAVLSubspace(t *testing.T) { @@ -117,7 +128,7 @@ func TestIAVLSubspace(t *testing.T) { assert.EqualValues(t, value, expectedKey) i += 1 } - assert.Equal(t, i, len(expected)) + assert.Equal(t, len(expected), i) iter = iavlStore.Subspace([]byte{byte(55), byte(255), byte(255)}) expected2 := [][]byte{ @@ -132,7 +143,7 @@ func TestIAVLSubspace(t *testing.T) { assert.EqualValues(t, value, []byte("test4")) i += 1 } - assert.Equal(t, i, len(expected)) + assert.Equal(t, len(expected), i) iter = iavlStore.Subspace([]byte{byte(255), byte(255)}) expected2 = [][]byte{ @@ -147,7 +158,7 @@ func TestIAVLSubspace(t *testing.T) { assert.EqualValues(t, value, []byte("test4")) i += 1 } - assert.Equal(t, i, len(expected)) + assert.Equal(t, len(expected), i) } func TestIAVLStoreQuery(t *testing.T) { From 3f1362f838c22fcb71ecfcb7217f27992e2b6c63 Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Sun, 1 Apr 2018 00:02:29 +0200 Subject: [PATCH 03/50] why u no work --- store/iavlstore_test.go | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/store/iavlstore_test.go b/store/iavlstore_test.go index 6e276c3d22..02b0d58bbb 100644 --- a/store/iavlstore_test.go +++ b/store/iavlstore_test.go @@ -94,6 +94,39 @@ func TestIAVLIterator(t *testing.T) { } assert.Equal(t, len(expected), i) + iter = iavlStore.Iterator(nil, []byte("golang")) + expected = []string{"aloha"} + for i = 0; iter.Valid(); iter.Next() { + expectedKey := expected[i] + key, value := iter.Key(), iter.Value() + assert.EqualValues(t, key, expectedKey) + assert.EqualValues(t, value, treeData[expectedKey]) + i += 1 + } + assert.Equal(t, len(expected), i) + + iter = iavlStore.Iterator(nil, []byte("shalom")) + expected = []string{"aloha", "hello"} + for i = 0; iter.Valid(); iter.Next() { + expectedKey := expected[i] + key, value := iter.Key(), iter.Value() + assert.EqualValues(t, key, expectedKey) + assert.EqualValues(t, value, treeData[expectedKey]) + i += 1 + } + assert.Equal(t, len(expected), i) + + iter = iavlStore.Iterator(nil, nil) + expected = []string{"aloha", "hello"} + for i = 0; iter.Valid(); iter.Next() { + expectedKey := expected[i] + key, value := iter.Key(), iter.Value() + assert.EqualValues(t, key, expectedKey) + assert.EqualValues(t, value, treeData[expectedKey]) + i += 1 + } + assert.Equal(t, len(expected), i) + iter = iavlStore.Iterator([]byte("golang"), nil) expected = []string{"hello"} for i = 0; iter.Valid(); iter.Next() { From d98ea3764f2d654570c9310a68bbb1c39655e1c8 Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Sun, 1 Apr 2018 00:26:00 +0200 Subject: [PATCH 04/50] it works --- store/iavlstore.go | 5 +++-- store/iavlstore_test.go | 4 ++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/store/iavlstore.go b/store/iavlstore.go index a1a48722cb..330358d8d7 100644 --- a/store/iavlstore.go +++ b/store/iavlstore.go @@ -138,7 +138,6 @@ func (st *iavlStore) Subspace(prefix []byte) Iterator { } } } - fmt.Printf("%v \n", end) return st.Iterator(prefix, end) } @@ -242,7 +241,6 @@ func newIAVLIterator(tree *iavl.Tree, start, end []byte, ascending bool) *iavlIt quitCh: make(chan struct{}), initCh: make(chan struct{}), } - fmt.Printf("%v %v \n", iter.start, iter.end) go iter.iterateRoutine() go iter.initRoutine() return iter @@ -356,6 +354,9 @@ func (iter *iavlIterator) assertIsValid() { //---------------------------------------- func cp(bz []byte) (ret []byte) { + if bz == nil { + return nil + } ret = make([]byte, len(bz)) copy(ret, bz) return ret diff --git a/store/iavlstore_test.go b/store/iavlstore_test.go index 02b0d58bbb..406d269263 100644 --- a/store/iavlstore_test.go +++ b/store/iavlstore_test.go @@ -150,6 +150,10 @@ func TestIAVLSubspace(t *testing.T) { iavlStore.Set([]byte{byte(55), byte(255), byte(255), byte(0)}, []byte("test4")) iavlStore.Set([]byte{byte(55), byte(255), byte(255), byte(1)}, []byte("test4")) iavlStore.Set([]byte{byte(55), byte(255), byte(255), byte(255)}, []byte("test4")) + iavlStore.Set([]byte{byte(255), byte(255), byte(0)}, []byte("test4")) + iavlStore.Set([]byte{byte(255), byte(255), byte(1)}, []byte("test4")) + iavlStore.Set([]byte{byte(255), byte(255), byte(255)}, []byte("test4")) + i := 0 iter := iavlStore.Subspace([]byte("test")) From c441ccdf01efdbbb11ea5116b58dc76672558e06 Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Sun, 1 Apr 2018 18:00:28 +0200 Subject: [PATCH 05/50] added more test --- store/cachekvstore.go | 11 ++++++++ store/dbstoreadapter.go | 8 ++++++ store/iavlstore.go | 34 ++++++++---------------- store/iavlstore_test.go | 59 +++++++++++++++++++++++++++++++++++++++++ types/store.go | 33 +++++++++++++++++++++++ 5 files changed, 122 insertions(+), 23 deletions(-) diff --git a/store/cachekvstore.go b/store/cachekvstore.go index e075e7847b..f6b0e7a5e0 100644 --- a/store/cachekvstore.go +++ b/store/cachekvstore.go @@ -5,6 +5,7 @@ import ( "sort" "sync" + sdk "github.com/cosmos/cosmos-sdk/types" cmn "github.com/tendermint/tmlibs/common" ) @@ -134,6 +135,16 @@ func (ci *cacheKVStore) ReverseIterator(start, end []byte) Iterator { return ci.iterator(start, end, false) } +// Implements KVStore. +func (ci *cacheKVStore) Subspace(prefix []byte) Iterator { + return ci.iterator(prefix, sdk.PrefixEndBytes(prefix), true) +} + +// Implements KVStore. +func (ci *cacheKVStore) ReverseSubspace(prefix []byte) Iterator { + return ci.iterator(prefix, sdk.PrefixEndBytes(prefix), false) +} + func (ci *cacheKVStore) iterator(start, end []byte, ascending bool) Iterator { var parent, cache Iterator if ascending { diff --git a/store/dbstoreadapter.go b/store/dbstoreadapter.go index a1b580fd47..39309aaf22 100644 --- a/store/dbstoreadapter.go +++ b/store/dbstoreadapter.go @@ -19,5 +19,13 @@ func (dsa dbStoreAdapter) CacheWrap() CacheWrap { return NewCacheKVStore(dsa) } +func (dsa dbStoreAdapter) Subspace(prefix []byte) Iterator { + return dsa.Iterator(prefix, sdk.PrefixEndBytes(prefix)) +} + +func (dsa dbStoreAdapter) ReverseSubspace(prefix []byte) Iterator { + return dsa.ReverseIterator(prefix, sdk.PrefixEndBytes(prefix)) +} + // dbm.DB implements KVStore so we can CacheKVStore it. var _ KVStore = dbStoreAdapter{dbm.DB(nil)} diff --git a/store/iavlstore.go b/store/iavlstore.go index 330358d8d7..b27aacb2bf 100644 --- a/store/iavlstore.go +++ b/store/iavlstore.go @@ -119,33 +119,21 @@ func (st *iavlStore) Iterator(start, end []byte) Iterator { return newIAVLIterator(st.tree.Tree(), start, end, true) } -func (st *iavlStore) Subspace(prefix []byte) Iterator { - end := make([]byte, len(prefix)) - copy(end, prefix) - finished := false - i := 1 - - for !finished { - if end[len(end)-i] != byte(255) { - end[len(end)-i]++ - finished = true - } else { - end[len(end)-i]++ - i++ - if i > len(end) { - end = nil - finished = true - } - } - } - return st.Iterator(prefix, end) -} - -// Implements IterKVStore. +// Implements KVStore. func (st *iavlStore) ReverseIterator(start, end []byte) Iterator { return newIAVLIterator(st.tree.Tree(), start, end, false) } +// Implements KVStore. +func (st *iavlStore) Subspace(prefix []byte) Iterator { + return st.Iterator(prefix, sdk.PrefixEndBytes(prefix)) +} + +// Implements KVStore. +func (st *iavlStore) ReverseSubspace(prefix []byte) Iterator { + return st.ReverseIterator(prefix, sdk.PrefixEndBytes(prefix)) +} + // Query implements ABCI interface, allows queries // // by default we will return from (latest height -1), diff --git a/store/iavlstore_test.go b/store/iavlstore_test.go index 406d269263..2c4c0ea002 100644 --- a/store/iavlstore_test.go +++ b/store/iavlstore_test.go @@ -198,6 +198,65 @@ func TestIAVLSubspace(t *testing.T) { assert.Equal(t, len(expected), i) } +func TestIAVLReverseSubspace(t *testing.T) { + db := dbm.NewMemDB() + tree, _ := newTree(t, db) + iavlStore := newIAVLStore(tree, numHistory) + + iavlStore.Set([]byte("test1"), []byte("test1")) + iavlStore.Set([]byte("test2"), []byte("test2")) + iavlStore.Set([]byte("test3"), []byte("test3")) + iavlStore.Set([]byte{byte(55), byte(255), byte(255), byte(0)}, []byte("test4")) + iavlStore.Set([]byte{byte(55), byte(255), byte(255), byte(1)}, []byte("test4")) + iavlStore.Set([]byte{byte(55), byte(255), byte(255), byte(255)}, []byte("test4")) + iavlStore.Set([]byte{byte(255), byte(255), byte(0)}, []byte("test4")) + iavlStore.Set([]byte{byte(255), byte(255), byte(1)}, []byte("test4")) + iavlStore.Set([]byte{byte(255), byte(255), byte(255)}, []byte("test4")) + + i := 0 + + iter := iavlStore.ReverseSubspace([]byte("test")) + expected := []string{"test3", "test2", "test1"} + for i = 0; iter.Valid(); iter.Next() { + expectedKey := expected[i] + key, value := iter.Key(), iter.Value() + assert.EqualValues(t, key, expectedKey) + assert.EqualValues(t, value, expectedKey) + i += 1 + } + assert.Equal(t, len(expected), i) + + iter = iavlStore.ReverseSubspace([]byte{byte(55), byte(255), byte(255)}) + expected2 := [][]byte{ + []byte{byte(55), byte(255), byte(255), byte(255)}, + []byte{byte(55), byte(255), byte(255), byte(1)}, + []byte{byte(55), byte(255), byte(255), byte(0)}, + } + for i = 0; iter.Valid(); iter.Next() { + expectedKey := expected2[i] + key, value := iter.Key(), iter.Value() + assert.EqualValues(t, key, expectedKey) + assert.EqualValues(t, value, []byte("test4")) + i += 1 + } + assert.Equal(t, len(expected), i) + + iter = iavlStore.ReverseSubspace([]byte{byte(255), byte(255)}) + expected2 = [][]byte{ + []byte{byte(255), byte(255), byte(255)}, + []byte{byte(255), byte(255), byte(1)}, + []byte{byte(255), byte(255), byte(0)}, + } + for i = 0; iter.Valid(); iter.Next() { + expectedKey := expected2[i] + key, value := iter.Key(), iter.Value() + assert.EqualValues(t, key, expectedKey) + assert.EqualValues(t, value, []byte("test4")) + i += 1 + } + assert.Equal(t, len(expected), i) +} + func TestIAVLStoreQuery(t *testing.T) { db := dbm.NewMemDB() tree := iavl.NewVersionedTree(db, cacheSize) diff --git a/types/store.go b/types/store.go index ef2e9154b6..9034ea6f36 100644 --- a/types/store.go +++ b/types/store.go @@ -111,6 +111,14 @@ type KVStore interface { // CONTRACT: No writes may happen within a domain while an iterator exists over it. ReverseIterator(start, end []byte) Iterator + // Iterator over all the keys with a certain prefix in ascending order. + // CONTRACT: No writes may happen within a domain while an iterator exists over it. + Subspace(prefix []byte) Iterator + + // Iterator over all the keys with a certain prefix in descending order. + // CONTRACT: No writes may happen within a domain while an iterator exists over it. + ReverseSubspace(prefix []byte) Iterator + // TODO Not yet implemented. // CreateSubKVStore(key *storeKey) (KVStore, error) @@ -222,3 +230,28 @@ func (key *KVStoreKey) Name() string { func (key *KVStoreKey) String() string { return fmt.Sprintf("KVStoreKey{%p, %s}", key, key.name) } + +// TODO: Move to TmLibs +func PrefixEndBytes(prefix []byte) []byte { + if prefix == nil { + return nil + } + + end := make([]byte, len(prefix)) + copy(end, prefix) + finished := false + + for !finished { + if end[len(end)-1] != byte(255) { + end[len(end)-1]++ + finished = true + } else { + end = end[:len(end)-1] + if len(end) == 0 { + end = nil + finished = true + } + } + } + return end +} From f10983ba06e0ed5aded8d473b6c42100c91b1371 Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Thu, 5 Apr 2018 21:54:30 +0200 Subject: [PATCH 06/50] address review --- store/cachekvstore.go | 4 ++-- store/dbstoreadapter.go | 4 ++-- store/iavlstore.go | 4 ++-- store/iavlstore_test.go | 19 ++++++++++--------- types/store.go | 4 ++-- 5 files changed, 18 insertions(+), 17 deletions(-) diff --git a/store/cachekvstore.go b/store/cachekvstore.go index f6b0e7a5e0..6c5cc95422 100644 --- a/store/cachekvstore.go +++ b/store/cachekvstore.go @@ -136,12 +136,12 @@ func (ci *cacheKVStore) ReverseIterator(start, end []byte) Iterator { } // Implements KVStore. -func (ci *cacheKVStore) Subspace(prefix []byte) Iterator { +func (ci *cacheKVStore) SubspaceIterator(prefix []byte) Iterator { return ci.iterator(prefix, sdk.PrefixEndBytes(prefix), true) } // Implements KVStore. -func (ci *cacheKVStore) ReverseSubspace(prefix []byte) Iterator { +func (ci *cacheKVStore) ReverseSubspaceIterator(prefix []byte) Iterator { return ci.iterator(prefix, sdk.PrefixEndBytes(prefix), false) } diff --git a/store/dbstoreadapter.go b/store/dbstoreadapter.go index 39309aaf22..10c175a995 100644 --- a/store/dbstoreadapter.go +++ b/store/dbstoreadapter.go @@ -19,11 +19,11 @@ func (dsa dbStoreAdapter) CacheWrap() CacheWrap { return NewCacheKVStore(dsa) } -func (dsa dbStoreAdapter) Subspace(prefix []byte) Iterator { +func (dsa dbStoreAdapter) SubspaceIterator(prefix []byte) Iterator { return dsa.Iterator(prefix, sdk.PrefixEndBytes(prefix)) } -func (dsa dbStoreAdapter) ReverseSubspace(prefix []byte) Iterator { +func (dsa dbStoreAdapter) ReverseSubspaceIterator(prefix []byte) Iterator { return dsa.ReverseIterator(prefix, sdk.PrefixEndBytes(prefix)) } diff --git a/store/iavlstore.go b/store/iavlstore.go index b27aacb2bf..e0b93a1ab9 100644 --- a/store/iavlstore.go +++ b/store/iavlstore.go @@ -125,12 +125,12 @@ func (st *iavlStore) ReverseIterator(start, end []byte) Iterator { } // Implements KVStore. -func (st *iavlStore) Subspace(prefix []byte) Iterator { +func (st *iavlStore) SubspaceIterator(prefix []byte) Iterator { return st.Iterator(prefix, sdk.PrefixEndBytes(prefix)) } // Implements KVStore. -func (st *iavlStore) ReverseSubspace(prefix []byte) Iterator { +func (st *iavlStore) ReverseSubspaceIterator(prefix []byte) Iterator { return st.ReverseIterator(prefix, sdk.PrefixEndBytes(prefix)) } diff --git a/store/iavlstore_test.go b/store/iavlstore_test.go index 2c4c0ea002..824617c26d 100644 --- a/store/iavlstore_test.go +++ b/store/iavlstore_test.go @@ -73,7 +73,8 @@ func TestIAVLIterator(t *testing.T) { iavlStore := newIAVLStore(tree, numHistory) iter := iavlStore.Iterator([]byte("aloha"), []byte("hellz")) expected := []string{"aloha", "hello"} - i := 0 + var i int + for i = 0; iter.Valid(); iter.Next() { expectedKey := expected[i] key, value := iter.Key(), iter.Value() @@ -139,7 +140,7 @@ func TestIAVLIterator(t *testing.T) { assert.Equal(t, len(expected), i) } -func TestIAVLSubspace(t *testing.T) { +func TestIAVLSubspaceIterator(t *testing.T) { db := dbm.NewMemDB() tree, _ := newTree(t, db) iavlStore := newIAVLStore(tree, numHistory) @@ -156,7 +157,7 @@ func TestIAVLSubspace(t *testing.T) { i := 0 - iter := iavlStore.Subspace([]byte("test")) + iter := iavlStore.SubspaceIterator([]byte("test")) expected := []string{"test1", "test2", "test3"} for i = 0; iter.Valid(); iter.Next() { expectedKey := expected[i] @@ -167,7 +168,7 @@ func TestIAVLSubspace(t *testing.T) { } assert.Equal(t, len(expected), i) - iter = iavlStore.Subspace([]byte{byte(55), byte(255), byte(255)}) + iter = iavlStore.SubspaceIterator([]byte{byte(55), byte(255), byte(255)}) expected2 := [][]byte{ []byte{byte(55), byte(255), byte(255), byte(0)}, []byte{byte(55), byte(255), byte(255), byte(1)}, @@ -182,7 +183,7 @@ func TestIAVLSubspace(t *testing.T) { } assert.Equal(t, len(expected), i) - iter = iavlStore.Subspace([]byte{byte(255), byte(255)}) + iter = iavlStore.SubspaceIterator([]byte{byte(255), byte(255)}) expected2 = [][]byte{ []byte{byte(255), byte(255), byte(0)}, []byte{byte(255), byte(255), byte(1)}, @@ -198,7 +199,7 @@ func TestIAVLSubspace(t *testing.T) { assert.Equal(t, len(expected), i) } -func TestIAVLReverseSubspace(t *testing.T) { +func TestIAVLReverseSubspaceIterator(t *testing.T) { db := dbm.NewMemDB() tree, _ := newTree(t, db) iavlStore := newIAVLStore(tree, numHistory) @@ -215,7 +216,7 @@ func TestIAVLReverseSubspace(t *testing.T) { i := 0 - iter := iavlStore.ReverseSubspace([]byte("test")) + iter := iavlStore.ReverseSubspaceIterator([]byte("test")) expected := []string{"test3", "test2", "test1"} for i = 0; iter.Valid(); iter.Next() { expectedKey := expected[i] @@ -226,7 +227,7 @@ func TestIAVLReverseSubspace(t *testing.T) { } assert.Equal(t, len(expected), i) - iter = iavlStore.ReverseSubspace([]byte{byte(55), byte(255), byte(255)}) + iter = iavlStore.ReverseSubspaceIterator([]byte{byte(55), byte(255), byte(255)}) expected2 := [][]byte{ []byte{byte(55), byte(255), byte(255), byte(255)}, []byte{byte(55), byte(255), byte(255), byte(1)}, @@ -241,7 +242,7 @@ func TestIAVLReverseSubspace(t *testing.T) { } assert.Equal(t, len(expected), i) - iter = iavlStore.ReverseSubspace([]byte{byte(255), byte(255)}) + iter = iavlStore.ReverseSubspaceIterator([]byte{byte(255), byte(255)}) expected2 = [][]byte{ []byte{byte(255), byte(255), byte(255)}, []byte{byte(255), byte(255), byte(1)}, diff --git a/types/store.go b/types/store.go index 9034ea6f36..9034e79307 100644 --- a/types/store.go +++ b/types/store.go @@ -113,11 +113,11 @@ type KVStore interface { // Iterator over all the keys with a certain prefix in ascending order. // CONTRACT: No writes may happen within a domain while an iterator exists over it. - Subspace(prefix []byte) Iterator + SubspaceIterator(prefix []byte) Iterator // Iterator over all the keys with a certain prefix in descending order. // CONTRACT: No writes may happen within a domain while an iterator exists over it. - ReverseSubspace(prefix []byte) Iterator + ReverseSubspaceIterator(prefix []byte) Iterator // TODO Not yet implemented. // CreateSubKVStore(key *storeKey) (KVStore, error) From 4bcfcd5cc8972b723e006e7ebc8c13cb6f4373fe Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Fri, 6 Apr 2018 11:29:25 +0200 Subject: [PATCH 07/50] added comments and got rid of fixed variable --- Gopkg.lock | 2 +- types/store.go | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index 50a17e1fb9..2de9e117ef 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -458,6 +458,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "ed1f3f7f1728cd02945f90ca780e9bdc982573a36a5cc8d7e9f19fb40ba2ca19" + inputs-digest = "67298e1f8058b85f082dbd32123f2779b11bda282616e595141dba41a8675c39" solver-name = "gps-cdcl" solver-version = 1 diff --git a/types/store.go b/types/store.go index 9034e79307..7b73570cac 100644 --- a/types/store.go +++ b/types/store.go @@ -231,7 +231,9 @@ func (key *KVStoreKey) String() string { return fmt.Sprintf("KVStoreKey{%p, %s}", key, key.name) } -// TODO: Move to TmLibs +// PrefixEndBytes returns the []byte that would end a +// range query for all []byte with a certain prefix +// Deals with last byte of prefix being FF without overflowing func PrefixEndBytes(prefix []byte) []byte { if prefix == nil { return nil @@ -239,17 +241,16 @@ func PrefixEndBytes(prefix []byte) []byte { end := make([]byte, len(prefix)) copy(end, prefix) - finished := false - for !finished { + for { if end[len(end)-1] != byte(255) { end[len(end)-1]++ - finished = true + break } else { end = end[:len(end)-1] if len(end) == 0 { end = nil - finished = true + break } } } From a44e871dc7724eb18ee3c9868655ba26c02665ef Mon Sep 17 00:00:00 2001 From: Jae Kwon Date: Fri, 6 Apr 2018 16:20:14 -0700 Subject: [PATCH 08/50] WIP, aminoification --- Gopkg.toml | 15 ++++++----- examples/basecoin/app/app.go | 44 +++++++++++--------------------- wire/wire.go | 49 ++++-------------------------------- x/stake/test_common.go | 40 +++++++++-------------------- 4 files changed, 38 insertions(+), 110 deletions(-) diff --git a/Gopkg.toml b/Gopkg.toml index e9774e1c15..1431c8b153 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -53,29 +53,28 @@ version = "~1.2.1" [[constraint]] - version = "~0.10.2" name = "github.com/tendermint/abci" + version = "~0.10.2" [[constraint]] - version = "~0.5.0" name = "github.com/tendermint/go-crypto" + version = "0.6.1" [[constraint]] - version = "~0.7.3" - source = "github.com/tendermint/go-amino" - name = "github.com/tendermint/go-wire" + name = "github.com/tendermint/go-amino" + version = "0.9.6" [[constraint]] - version = "~0.7.0" name = "github.com/tendermint/iavl" + version = "~0.7.0" [[constraint]] - version = "~0.18.0-rc1" name = "github.com/tendermint/tendermint" + version = "~0.18.0-rc1" [[override]] - version = "~0.8.1" name = "github.com/tendermint/tmlibs" + version = "~0.8.1" [prune] go-tests = true diff --git a/examples/basecoin/app/app.go b/examples/basecoin/app/app.go index caae168466..e6623329d8 100644 --- a/examples/basecoin/app/app.go +++ b/examples/basecoin/app/app.go @@ -4,7 +4,6 @@ import ( "encoding/json" abci "github.com/tendermint/abci/types" - oldwire "github.com/tendermint/go-wire" cmn "github.com/tendermint/tmlibs/common" dbm "github.com/tendermint/tmlibs/db" "github.com/tendermint/tmlibs/log" @@ -84,37 +83,22 @@ func NewBasecoinApp(logger log.Logger, dbs map[string]dbm.DB) *BasecoinApp { } // custom tx codec -// TODO: use new go-wire func MakeCodec() *wire.Codec { - const msgTypeSend = 0x1 - const msgTypeIssue = 0x2 - const msgTypeQuiz = 0x3 - const msgTypeSetTrend = 0x4 - const msgTypeIBCTransferMsg = 0x5 - const msgTypeIBCReceiveMsg = 0x6 - const msgTypeBondMsg = 0x7 - const msgTypeUnbondMsg = 0x8 - var _ = oldwire.RegisterInterface( - struct{ sdk.Msg }{}, - oldwire.ConcreteType{bank.SendMsg{}, msgTypeSend}, - oldwire.ConcreteType{bank.IssueMsg{}, msgTypeIssue}, - oldwire.ConcreteType{ibc.IBCTransferMsg{}, msgTypeIBCTransferMsg}, - oldwire.ConcreteType{ibc.IBCReceiveMsg{}, msgTypeIBCReceiveMsg}, - oldwire.ConcreteType{simplestake.BondMsg{}, msgTypeBondMsg}, - oldwire.ConcreteType{simplestake.UnbondMsg{}, msgTypeUnbondMsg}, - ) + var cdc = wire.NewCodec() - const accTypeApp = 0x1 - var _ = oldwire.RegisterInterface( - struct{ sdk.Account }{}, - oldwire.ConcreteType{&types.AppAccount{}, accTypeApp}, - ) - cdc := wire.NewCodec() + // Register Msgs + cdc.RegisterInterface((*sdk.Msg)(nil), nil) + cdc.RegisterConcrete(bank.SendMsg{}, "basecoin/Send", nil) + cdc.RegisterConcrete(bank.IssueMsg{}, "basecoin/Issue", nil) + cdc.RegisterConcrete(ibc.IBCTransferMsg{}, "basecoin/IBCTransferMsg", nil) + cdc.RegisterConcrete(ibc.IBCReceiveMsg{}, "basecoin/IBCReceiveMsg", nil) + cdc.RegisterConcrete(simplestake.BondMsg{}, "basecoin/BondMsg", nil) + cdc.RegisterConcrete(simplestake.UnbondMsg{}, "basecoin/UnbondMsg", nil) + + // Register AppAccount + cdc.RegisterInterface((*sdk.Account)(nil), nil) + cdc.RegisterConcrete(&types.AppAccount{}, "basecoin/Account", nil) - // cdc.RegisterInterface((*sdk.Msg)(nil), nil) - // bank.RegisterWire(cdc) // Register bank.[SendMsg,IssueMsg] types. - // crypto.RegisterWire(cdc) // Register crypto.[PubKey,PrivKey,Signature] types. - // ibc.RegisterWire(cdc) // Register ibc.[IBCTransferMsg, IBCReceiveMsg] types. return cdc } @@ -127,7 +111,7 @@ func (app *BasecoinApp) txDecoder(txBytes []byte) (sdk.Tx, sdk.Error) { } // StdTx.Msg is an interface. The concrete types - // are registered by MakeTxCodec in bank.RegisterWire. + // are registered by MakeTxCodec in bank.RegisterAmino. err := app.cdc.UnmarshalBinary(txBytes, &tx) if err != nil { return nil, sdk.ErrTxDecode("").TraceCause(err, "") diff --git a/wire/wire.go b/wire/wire.go index e53d5e195b..6db81687f6 100644 --- a/wire/wire.go +++ b/wire/wire.go @@ -4,52 +4,13 @@ import ( "bytes" "reflect" - "github.com/tendermint/go-wire" + "github.com/tendermint/go-amino" ) -type Codec struct{} +type Codec = amino.Codec func NewCodec() *Codec { - return &Codec{} -} - -func (cdc *Codec) MarshalBinary(o interface{}) ([]byte, error) { - w, n, err := new(bytes.Buffer), new(int), new(error) - wire.WriteBinary(o, w, n, err) - return w.Bytes(), *err -} - -func (cdc *Codec) UnmarshalBinary(bz []byte, o interface{}) error { - r, n, err := bytes.NewBuffer(bz), new(int), new(error) - - rv := reflect.ValueOf(o) - if rv.Kind() == reflect.Ptr { - wire.ReadBinaryPtr(o, r, len(bz), n, err) - } else { - wire.ReadBinary(o, r, len(bz), n, err) - } - return *err -} - -func (cdc *Codec) MarshalJSON(o interface{}) ([]byte, error) { - w, n, err := new(bytes.Buffer), new(int), new(error) - wire.WriteJSON(o, w, n, err) - return w.Bytes(), *err -} - -func (cdc *Codec) UnmarshalJSON(bz []byte, o interface{}) (err error) { - - rv := reflect.ValueOf(o) - if rv.Kind() == reflect.Ptr { - wire.ReadJSONPtr(o, bz, &err) - } else { - wire.ReadJSON(o, bz, &err) - } - return err -} - -//---------------------------------------------- - -func RegisterCrypto(cdc *Codec) { - // TODO + cdc := amino.NewCodec() + RegisterAmino(cdc) + return cdc } diff --git a/x/stake/test_common.go b/x/stake/test_common.go index 285364a5d9..ceb2addb4f 100644 --- a/x/stake/test_common.go +++ b/x/stake/test_common.go @@ -8,7 +8,6 @@ import ( abci "github.com/tendermint/abci/types" crypto "github.com/tendermint/go-crypto" - oldwire "github.com/tendermint/go-wire" dbm "github.com/tendermint/tmlibs/db" "github.com/cosmos/cosmos-sdk/store" @@ -84,36 +83,21 @@ func subspace(prefix []byte) (start, end []byte) { return prefix, end } -// custom tx codec -// TODO: use new go-wire -func makeTestCodec() *wire.Codec { +func MakeCodec() *wire.Codec { + var cdc = wire.NewCodec() - const msgTypeSend = 0x1 - const msgTypeIssue = 0x2 - const msgTypeDeclareCandidacy = 0x3 - const msgTypeEditCandidacy = 0x4 - const msgTypeDelegate = 0x5 - const msgTypeUnbond = 0x6 - var _ = oldwire.RegisterInterface( - struct{ sdk.Msg }{}, - oldwire.ConcreteType{bank.SendMsg{}, msgTypeSend}, - oldwire.ConcreteType{bank.IssueMsg{}, msgTypeIssue}, - oldwire.ConcreteType{MsgDeclareCandidacy{}, msgTypeDeclareCandidacy}, - oldwire.ConcreteType{MsgEditCandidacy{}, msgTypeEditCandidacy}, - oldwire.ConcreteType{MsgDelegate{}, msgTypeDelegate}, - oldwire.ConcreteType{MsgUnbond{}, msgTypeUnbond}, - ) + // Register Msgs + cdc.RegisterInterface((*sdk.Msg)(nil), nil) + cdc.RegisterConcrete(bank.SendMsg{}, "test/stake/Send", nil) + cdc.RegisterConcrete(bank.IssueMsg{}, "test/stake/Issue", nil) + cdc.RegisterConcrete(MsgDeclareCandidacy{}, "test/stake/DeclareCandidacy", nil) + cdc.RegisterConcrete(MsgEditCandidacy{}, "test/stake/EditCandidacy", nil) + cdc.RegisterConcrete(MsgUnbond{}, "test/stake/Unbond", nil) - const accTypeApp = 0x1 - var _ = oldwire.RegisterInterface( - struct{ sdk.Account }{}, - oldwire.ConcreteType{&auth.BaseAccount{}, accTypeApp}, - ) - cdc := wire.NewCodec() + // Register AppAccount + cdc.RegisterInterface((*sdk.Account)(nil), nil) + cdc.RegisterConcrete(&auth.BaseAccount{}, "test/stake/Account", nil) - // cdc.RegisterInterface((*sdk.Msg)(nil), nil) - // bank.RegisterWire(cdc) // Register bank.[SendMsg,IssueMsg] types. - // crypto.RegisterWire(cdc) // Register crypto.[PubKey,PrivKey,Signature] types. return cdc } From 49fdf80d9d8d5f51c8f6c1b7ef662ff7c16e4e20 Mon Sep 17 00:00:00 2001 From: Jae Kwon Date: Fri, 6 Apr 2018 17:25:08 -0700 Subject: [PATCH 09/50] WIP commit --- Gopkg.lock | 39 ++++++++++++------------ Gopkg.toml | 2 +- baseapp/baseapp_test.go | 2 +- client/lcd/lcd_test.go | 5 +-- client/rpc/status.go | 5 ++- client/rpc/wire.go | 17 +++++++++++ examples/democoin/app/app.go | 49 ++++++++++-------------------- examples/democoin/types/account.go | 2 +- server/init.go | 7 +++-- server/start.go | 4 +-- server/tm_cmds.go | 7 ++--- server/wire.go | 12 ++++++++ wire/wire.go | 9 +++--- x/auth/ante.go | 4 +-- x/auth/ante_test.go | 8 ++--- x/auth/baseaccount.go | 3 +- x/auth/baseaccount_test.go | 4 +-- x/auth/mapper.go | 40 ++++++------------------ x/auth/mapper_test.go | 6 ++-- x/ibc/ibc_test.go | 36 ++++++---------------- x/simplestake/commands/commands.go | 2 +- x/simplestake/keeper.go | 4 +-- x/simplestake/msgs.go | 2 +- x/stake/commands/tx.go | 2 +- x/stake/test_common.go | 4 +-- 25 files changed, 126 insertions(+), 149 deletions(-) create mode 100644 client/rpc/wire.go create mode 100644 server/wire.go diff --git a/Gopkg.lock b/Gopkg.lock index 2de9e117ef..7d61f6f1b7 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -183,7 +183,7 @@ branch = "master" name = "github.com/rcrowley/go-metrics" packages = ["."] - revision = "8732c616f52954686704c8645fe1a9d59e9df7c1" + revision = "d932a24a8ccb8fcadc993e5c6c58f93dac168294" [[projects]] name = "github.com/spf13/afero" @@ -261,8 +261,8 @@ "server", "types" ] - revision = "46686763ba8ea595ede16530ed4a40fb38f49f94" - version = "v0.10.2" + revision = "c62aed95f2ce399ec815b0cafe478af002cdc4e6" + version = "v0.10.3-dev" [[projects]] branch = "master" @@ -274,6 +274,12 @@ ] revision = "d8387025d2b9d158cf4efb07e7ebf814bcce2057" +[[projects]] + name = "github.com/tendermint/go-amino" + packages = ["."] + revision = "42246108ff925a457fb709475070a03dfd3e2b5c" + version = "0.9.6" + [[projects]] name = "github.com/tendermint/go-crypto" packages = [ @@ -283,17 +289,13 @@ "keys/words", "keys/words/wordlist" ] - revision = "c3e19f3ea26f5c3357e0bcbb799b0761ef923755" - version = "v0.5.0" + revision = "5d5f580f49ca66c13400938c64334186068c8b7c" + version = "v0.6.1" [[projects]] name = "github.com/tendermint/go-wire" - packages = [ - ".", - "data" - ] + packages = ["."] revision = "fa721242b042ecd4c6ed1a934ee740db4f74e45c" - source = "github.com/tendermint/go-amino" version = "v0.7.3" [[projects]] @@ -338,13 +340,13 @@ "state/txindex/null", "types", "types/priv_validator", - "version", - "wire" + "version" ] - revision = "a1dd329d72e78d4770e602359bad5b7b1e8b72a3" - version = "v0.18.0-rc1" + revision = "02531ca5a3a3d521e33bffa528583ff5b78d0594" + version = "0.19.0-rc1" [[projects]] + branch = "develop" name = "github.com/tendermint/tmlibs" packages = [ "autofile", @@ -360,7 +362,6 @@ "pubsub/query" ] revision = "2e24b64fc121dcdf1cabceab8dc2f7257675483c" - version = "0.8.1" [[projects]] branch = "master" @@ -390,13 +391,13 @@ "lex/httplex", "trace" ] - revision = "b3c676e531a6dc479fa1b35ac961c13f5e2b4d2e" + revision = "61147c48b25b599e5b561d2e9c4f3e1ef489ca41" [[projects]] branch = "master" name = "golang.org/x/sys" packages = ["unix"] - revision = "1d206c9fa8975fb4cf00df1dc8bf3283dc24ba0e" + revision = "3b87a42e500a6dc65dae1a55d0b641295971163e" [[projects]] name = "golang.org/x/text" @@ -423,7 +424,7 @@ branch = "master" name = "google.golang.org/genproto" packages = ["googleapis/rpc/status"] - revision = "35de2414665fc36f56b72d982c5af480d86de5ab" + revision = "ce84044298496ef4b54b4a0a0909ba593cc60e30" [[projects]] name = "google.golang.org/grpc" @@ -458,6 +459,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "67298e1f8058b85f082dbd32123f2779b11bda282616e595141dba41a8675c39" + inputs-digest = "2d266cd1c87ae063451b8c6cbce64d24463fd6edc61aa391be618c0447b7cd57" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 1431c8b153..b3517e9701 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -70,7 +70,7 @@ [[constraint]] name = "github.com/tendermint/tendermint" - version = "~0.18.0-rc1" + version = "0.19.0-rc1" [[override]] name = "github.com/tendermint/tmlibs" diff --git a/baseapp/baseapp_test.go b/baseapp/baseapp_test.go index 1658c591d6..29b224c468 100644 --- a/baseapp/baseapp_test.go +++ b/baseapp/baseapp_test.go @@ -432,7 +432,7 @@ func makePubKey(secret string) crypto.PubKey { func makePrivKey(secret string) crypto.PrivKey { privKey := crypto.GenPrivKeyEd25519FromSecret([]byte(secret)) - return privKey.Wrap() + return privKey } func secret(index int) string { diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 48cc35a8e6..585d1570ed 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -25,6 +25,7 @@ import ( ctypes "github.com/tendermint/tendermint/rpc/core/types" tmrpc "github.com/tendermint/tendermint/rpc/lib/server" tmtypes "github.com/tendermint/tendermint/types" + pvm "github.com/tendermint/tendermint/types/priv_validator" "github.com/tendermint/tmlibs/cli" dbm "github.com/tendermint/tmlibs/db" "github.com/tendermint/tmlibs/log" @@ -341,7 +342,7 @@ func startTMAndLCD() (*nm.Node, net.Listener, error) { logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)) logger = log.NewFilter(logger, log.AllowError()) privValidatorFile := config.PrivValidatorFile() - privVal := tmtypes.LoadOrGenPrivValidatorFS(privValidatorFile) + privVal := pvm.LoadOrGenFilePV(privValidatorFile) dbs := map[string]dbm.DB{ "main": dbm.NewMemDB(), "acc": dbm.NewMemDB(), @@ -370,7 +371,7 @@ func startTMAndLCD() (*nm.Node, net.Listener, error) { if err != nil { return nil, nil, err } - genDoc.AppStateJSON = stateBytes + genDoc.AppState = stateBytes cdc := wire.NewCodec() diff --git a/client/rpc/status.go b/client/rpc/status.go index 8ea8a5ad6a..0339a355bc 100644 --- a/client/rpc/status.go +++ b/client/rpc/status.go @@ -7,7 +7,6 @@ import ( "strconv" "github.com/spf13/cobra" - wire "github.com/tendermint/go-wire" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/context" @@ -41,8 +40,8 @@ func printNodeStatus(cmd *cobra.Command, args []string) error { return err } - output, err := wire.MarshalJSON(status) - // output, err := json.MarshalIndent(res, " ", "") + output, err := cdc.MarshalJSON(status) + // output, err := cdc.MarshalJSONIndent(res, " ", "") if err != nil { return err } diff --git a/client/rpc/wire.go b/client/rpc/wire.go new file mode 100644 index 0000000000..f454decb37 --- /dev/null +++ b/client/rpc/wire.go @@ -0,0 +1,17 @@ +package rpc + +import ( + "github.com/cosmos/cosmos-sdk/wire" + ctypes "github.com/tendermint/tendermint/rpc/core/types" +) + +var cdc *wire.Codec + +func init() { + cdc = wire.NewCodec() + RegisterWire(cdc) +} + +func RegisterWire(cdc *wire.Codec) { + ctypes.RegisterAmino(cdc) +} diff --git a/examples/democoin/app/app.go b/examples/democoin/app/app.go index 2ee79bd5bf..efa1236fa1 100644 --- a/examples/democoin/app/app.go +++ b/examples/democoin/app/app.go @@ -4,7 +4,6 @@ import ( "encoding/json" abci "github.com/tendermint/abci/types" - oldwire "github.com/tendermint/go-wire" cmn "github.com/tendermint/tmlibs/common" dbm "github.com/tendermint/tmlibs/db" "github.com/tendermint/tmlibs/log" @@ -95,41 +94,25 @@ func NewDemocoinApp(logger log.Logger, dbs map[string]dbm.DB) *DemocoinApp { } // custom tx codec -// TODO: use new go-wire func MakeCodec() *wire.Codec { - const msgTypeSend = 0x1 - const msgTypeIssue = 0x2 - const msgTypeQuiz = 0x3 - const msgTypeSetTrend = 0x4 - const msgTypeMine = 0x5 - const msgTypeIBCTransferMsg = 0x6 - const msgTypeIBCReceiveMsg = 0x7 - const msgTypeBondMsg = 0x8 - const msgTypeUnbondMsg = 0x9 - var _ = oldwire.RegisterInterface( - struct{ sdk.Msg }{}, - oldwire.ConcreteType{bank.SendMsg{}, msgTypeSend}, - oldwire.ConcreteType{bank.IssueMsg{}, msgTypeIssue}, - oldwire.ConcreteType{cool.QuizMsg{}, msgTypeQuiz}, - oldwire.ConcreteType{cool.SetTrendMsg{}, msgTypeSetTrend}, - oldwire.ConcreteType{pow.MineMsg{}, msgTypeMine}, - oldwire.ConcreteType{ibc.IBCTransferMsg{}, msgTypeIBCTransferMsg}, - oldwire.ConcreteType{ibc.IBCReceiveMsg{}, msgTypeIBCReceiveMsg}, - oldwire.ConcreteType{simplestake.BondMsg{}, msgTypeBondMsg}, - oldwire.ConcreteType{simplestake.UnbondMsg{}, msgTypeUnbondMsg}, - ) + var cdc = wire.NewCodec() - const accTypeApp = 0x1 - var _ = oldwire.RegisterInterface( - struct{ sdk.Account }{}, - oldwire.ConcreteType{&types.AppAccount{}, accTypeApp}, - ) - cdc := wire.NewCodec() + // Register Msgs + cdc.RegisterInterface((*sdk.Msg)(nil), nil) + cdc.RegisterConcrete(bank.SendMsg{}, "democoin/Send", nil) + cdc.RegisterConcrete(bank.IssueMsg{}, "democoin/Issue", nil) + cdc.RegisterConcrete(cool.QuizMsg{}, "democoin/Quiz", nil) + cdc.RegisterConcrete(cool.SetTrendMsg{}, "democoin/SetTrend", nil) + cdc.RegisterConcrete(pow.MineMsg{}, "democoin/Mine", nil) + cdc.RegisterConcrete(ibc.IBCTransferMsg{}, "democoin/IBCTransferMsg", nil) + cdc.RegisterConcrete(ibc.IBCReceiveMsg{}, "democoin/IBCReceiveMsg", nil) + cdc.RegisterConcrete(simplestake.BondMsg{}, "democoin/BondMsg", nil) + cdc.RegisterConcrete(simplestake.UnbondMsg{}, "democoin/UnbondMsg", nil) + + // Register AppAccount + cdc.RegisterInterface((*sdk.Account)(nil), nil) + cdc.RegisterConcrete(&types.AppAccount{}, "democoin/Account", nil) - // cdc.RegisterInterface((*sdk.Msg)(nil), nil) - // bank.RegisterWire(cdc) // Register bank.[SendMsg,IssueMsg] types. - // crypto.RegisterWire(cdc) // Register crypto.[PubKey,PrivKey,Signature] types. - // ibc.RegisterWire(cdc) // Register ibc.[IBCTransferMsg, IBCReceiveMsg] types. return cdc } diff --git a/examples/democoin/types/account.go b/examples/democoin/types/account.go index b5d5a0d034..d90525f1dd 100644 --- a/examples/democoin/types/account.go +++ b/examples/democoin/types/account.go @@ -15,7 +15,7 @@ var _ sdk.Account = (*AppAccount)(nil) // extending auth.BaseAccount with custom fields. // // This is compatible with the stock auth.AccountStore, since -// auth.AccountStore uses the flexible go-wire library. +// auth.AccountStore uses the flexible go-amino library. type AppAccount struct { auth.BaseAccount Name string `json:"name"` diff --git a/server/init.go b/server/init.go index 688bc38e37..09d97338e8 100644 --- a/server/init.go +++ b/server/init.go @@ -13,6 +13,7 @@ import ( cfg "github.com/tendermint/tendermint/config" "github.com/tendermint/tendermint/p2p" tmtypes "github.com/tendermint/tendermint/types" + pvm "github.com/tendermint/tendermint/types/priv_validator" cmn "github.com/tendermint/tmlibs/common" dbm "github.com/tendermint/tmlibs/db" ) @@ -109,12 +110,12 @@ func (c initCmd) run(cmd *cobra.Command, args []string) error { func (c initCmd) initTendermintFiles(config *cfg.Config, info *testnetInformation) error { // private validator privValFile := config.PrivValidatorFile() - var privValidator *tmtypes.PrivValidatorFS + var privValidator *pvm.FilePV if cmn.FileExists(privValFile) { - privValidator = tmtypes.LoadPrivValidatorFS(privValFile) + privValidator = pvm.LoadFilePV(privValFile) c.context.Logger.Info("Found private validator", "path", privValFile) } else { - privValidator = tmtypes.GenPrivValidatorFS(privValFile) + privValidator = pvm.GenFilePV(privValFile) privValidator.Save() c.context.Logger.Info("Generated private validator", "path", privValFile) } diff --git a/server/start.go b/server/start.go index 6aee5d316c..a4ff9852e5 100644 --- a/server/start.go +++ b/server/start.go @@ -11,7 +11,7 @@ import ( tcmd "github.com/tendermint/tendermint/cmd/tendermint/commands" "github.com/tendermint/tendermint/node" "github.com/tendermint/tendermint/proxy" - "github.com/tendermint/tendermint/types" + pvm "github.com/tendermint/tendermint/types/priv_validator" cmn "github.com/tendermint/tmlibs/common" "github.com/tendermint/tmlibs/log" ) @@ -95,7 +95,7 @@ func (s startCmd) startInProcess() error { // Create & start tendermint node n, err := node.NewNode(cfg, - types.LoadOrGenPrivValidatorFS(cfg.PrivValidatorFile()), + pvm.LoadOrGenFilePV(cfg.PrivValidatorFile()), proxy.NewLocalClientCreator(app), node.DefaultGenesisDocProviderFunc(cfg), node.DefaultDBProvider, diff --git a/server/tm_cmds.go b/server/tm_cmds.go index 3e0aefa941..2a9b680e56 100644 --- a/server/tm_cmds.go +++ b/server/tm_cmds.go @@ -5,10 +5,9 @@ import ( "github.com/spf13/cobra" - "github.com/tendermint/go-wire/data" tcmd "github.com/tendermint/tendermint/cmd/tendermint/commands" "github.com/tendermint/tendermint/p2p" - "github.com/tendermint/tendermint/types" + pvm "github.com/tendermint/tendermint/types/priv_validator" ) // ShowNodeIDCmd - ported from Tendermint, dump node ID to stdout @@ -53,8 +52,8 @@ type showValidator struct { func (s showValidator) run(cmd *cobra.Command, args []string) error { cfg := s.context.Config - privValidator := types.LoadOrGenPrivValidatorFS(cfg.PrivValidatorFile()) - pubKeyJSONBytes, err := data.ToJSON(privValidator.PubKey) + privValidator := pvm.LoadOrGenFilePV(cfg.PrivValidatorFile()) + pubKeyJSONBytes, err := cdc.MarshalJSON(privValidator.PubKey) if err != nil { return err } diff --git a/server/wire.go b/server/wire.go new file mode 100644 index 0000000000..261e7cfe1e --- /dev/null +++ b/server/wire.go @@ -0,0 +1,12 @@ +package server + +import ( + "github.com/cosmos/cosmos-sdk/wire" +) + +var cdc *wire.Codec + +func init() { + cdc = wire.NewCodec() + wire.RegisterCrypto(cdc) +} diff --git a/wire/wire.go b/wire/wire.go index 6db81687f6..9c366b6fb8 100644 --- a/wire/wire.go +++ b/wire/wire.go @@ -1,16 +1,17 @@ package wire import ( - "bytes" - "reflect" - "github.com/tendermint/go-amino" + "github.com/tendermint/go-crypto" ) type Codec = amino.Codec func NewCodec() *Codec { cdc := amino.NewCodec() - RegisterAmino(cdc) return cdc } + +func RegisterCrypto(cdc *Codec) { + crypto.RegisterAmino(cdc) +} diff --git a/x/auth/ante.go b/x/auth/ante.go index a5ab83bcbe..6801769a45 100644 --- a/x/auth/ante.go +++ b/x/auth/ante.go @@ -118,9 +118,9 @@ func processSig( // If pubkey is not known for account, // set it from the StdSignature. pubKey := acc.GetPubKey() - if pubKey.Empty() { + if pubKey == nil { pubKey = sig.PubKey - if pubKey.Empty() { + if pubKey == nil { return nil, sdk.ErrInvalidPubKey("PubKey not found").Result() } if !bytes.Equal(pubKey.Address(), addr) { diff --git a/x/auth/ante_test.go b/x/auth/ante_test.go index fd94145dde..fa545e32bd 100644 --- a/x/auth/ante_test.go +++ b/x/auth/ante_test.go @@ -31,7 +31,7 @@ func newCoins() sdk.Coins { func privAndAddr() (crypto.PrivKey, sdk.Address) { priv := crypto.GenPrivKeyEd25519() addr := priv.PubKey().Address() - return priv.Wrap(), addr + return priv, addr } // run the tx through the anteHandler and ensure its valid @@ -310,16 +310,16 @@ func TestAnteHandlerSetPubKey(t *testing.T) { msg = newTestMsg(addr2) tx = newTestTx(ctx, msg, privs, seqs, fee) sigs := tx.GetSignatures() - sigs[0].PubKey = crypto.PubKey{} + sigs[0].PubKey = nil checkInvalidTx(t, anteHandler, ctx, tx, sdk.CodeInvalidPubKey) acc2 = mapper.GetAccount(ctx, addr2) - assert.True(t, acc2.GetPubKey().Empty()) + assert.Nil(t, acc2.GetPubKey()) // test invalid signature and public key tx = newTestTx(ctx, msg, privs, seqs, fee) checkInvalidTx(t, anteHandler, ctx, tx, sdk.CodeInvalidPubKey) acc2 = mapper.GetAccount(ctx, addr2) - assert.True(t, acc2.GetPubKey().Empty()) + assert.Nil(t, acc2.GetPubKey()) } diff --git a/x/auth/baseaccount.go b/x/auth/baseaccount.go index 23123f9949..74d8625f08 100644 --- a/x/auth/baseaccount.go +++ b/x/auth/baseaccount.go @@ -61,7 +61,7 @@ func (acc BaseAccount) GetPubKey() crypto.PubKey { // Implements sdk.Account. func (acc *BaseAccount) SetPubKey(pubKey crypto.PubKey) error { - if !acc.PubKey.Empty() { + if acc.PubKey != nil { return errors.New("cannot override BaseAccount pubkey") } acc.PubKey = pubKey @@ -94,6 +94,5 @@ func (acc *BaseAccount) SetSequence(seq int64) error { // Wire func RegisterWireBaseAccount(cdc *wire.Codec) { - // Register crypto.[PubKey,PrivKey,Signature] types. wire.RegisterCrypto(cdc) } diff --git a/x/auth/baseaccount_test.go b/x/auth/baseaccount_test.go index b2f5b54ae2..24b3e3673c 100644 --- a/x/auth/baseaccount_test.go +++ b/x/auth/baseaccount_test.go @@ -15,7 +15,7 @@ func keyPubAddr() (crypto.PrivKey, crypto.PubKey, sdk.Address) { key := crypto.GenPrivKeyEd25519() pub := key.PubKey() addr := pub.Address() - return key.Wrap(), pub, addr + return key, pub, addr } func TestBaseAccountAddressPubKey(t *testing.T) { @@ -25,7 +25,7 @@ func TestBaseAccountAddressPubKey(t *testing.T) { // check the address (set) and pubkey (not set) assert.EqualValues(t, addr1, acc.GetAddress()) - assert.EqualValues(t, crypto.PubKey{}, acc.GetPubKey()) + assert.EqualValues(t, nil, acc.GetPubKey()) // can't override address err := acc.SetAddress(addr2) diff --git a/x/auth/mapper.go b/x/auth/mapper.go index 13fe9a8445..e07e8fbaad 100644 --- a/x/auth/mapper.go +++ b/x/auth/mapper.go @@ -1,12 +1,9 @@ package auth import ( - "bytes" "fmt" "reflect" - oldwire "github.com/tendermint/go-wire" - sdk "github.com/cosmos/cosmos-sdk/types" wire "github.com/cosmos/cosmos-sdk/wire" ) @@ -16,7 +13,7 @@ var _ sdk.AccountMapper = (*sealedAccountMapper)(nil) // Implements sdk.AccountMapper. // This AccountMapper encodes/decodes accounts using the -// go-wire (binary) encoding/decoding library. +// go-amino (binary) encoding/decoding library. type accountMapper struct { // The (unexposed) key used to access the store from the Context. @@ -30,7 +27,7 @@ type accountMapper struct { } // NewAccountMapper returns a new sdk.AccountMapper that -// uses go-wire to (binary) encode and decode concrete sdk.Accounts. +// uses go-amino to (binary) encode and decode concrete sdk.Accounts. func NewAccountMapper(key sdk.StoreKey, proto sdk.Account) accountMapper { cdc := wire.NewCodec() return accountMapper{ @@ -54,7 +51,7 @@ func NewAccountMapperSealed(key sdk.StoreKey, proto sdk.Account) sealedAccountMa return am.Seal() } -// Returns the go-wire codec. You may need to register interfaces +// Returns the go-amino codec. You may need to register interfaces // and concrete types here, if your app's sdk.Account // implementation includes interface fields. // NOTE: It is not secure to expose the codec, so check out @@ -103,7 +100,7 @@ type sealedAccountMapper struct { } // There's no way for external modules to mutate the -// sam.accountMapper.ctx from here, even with reflection. +// sam.accountMapper.cdc from here, even with reflection. func (sam sealedAccountMapper) WireCodec() *wire.Codec { panic("accountMapper is sealed") } @@ -152,34 +149,17 @@ func (am accountMapper) clonePrototype() sdk.Account { } func (am accountMapper) encodeAccount(acc sdk.Account) []byte { - bz, err := am.cdc.MarshalBinary(acc) + bz, err := am.cdc.MarshalBinaryBare(acc) if err != nil { panic(err) } return bz } -func (am accountMapper) decodeAccount(bz []byte) sdk.Account { - // ... old go-wire ... - r, n, err := bytes.NewBuffer(bz), new(int), new(error) - accI := oldwire.ReadBinary(struct{ sdk.Account }{}, r, len(bz), n, err) - if *err != nil { - panic(*err) +func (am accountMapper) decodeAccount(bz []byte) (acc sdk.Account) { + err := am.cdc.UnmarshalBinaryBare(bz, &acc) + if err != nil { + panic(err) } - - acc := accI.(struct{ sdk.Account }).Account - return acc - - /* - accPtr := am.clonePrototypePtr() - err := am.cdc.UnmarshalBinary(bz, accPtr) - if err != nil { - panic(err) - } - if reflect.ValueOf(am.proto).Kind() == reflect.Ptr { - return reflect.ValueOf(accPtr).Interface().(sdk.Account) - } else { - return reflect.ValueOf(accPtr).Elem().Interface().(sdk.Account) - } - */ + return } diff --git a/x/auth/mapper_test.go b/x/auth/mapper_test.go index 4ac96c3810..752c933cce 100644 --- a/x/auth/mapper_test.go +++ b/x/auth/mapper_test.go @@ -6,8 +6,6 @@ import ( "github.com/stretchr/testify/assert" abci "github.com/tendermint/abci/types" - crypto "github.com/tendermint/go-crypto" - oldwire "github.com/tendermint/go-wire" dbm "github.com/tendermint/tmlibs/db" "github.com/cosmos/cosmos-sdk/store" @@ -21,11 +19,13 @@ func setupMultiStore() (sdk.MultiStore, *sdk.KVStoreKey) { ms.MountStoreWithDB(capKey, sdk.StoreTypeIAVL, db) ms.LoadLatestVersion() + /* XXX // wire registration while we're at it ... TODO var _ = oldwire.RegisterInterface( struct{ sdk.Account }{}, oldwire.ConcreteType{&BaseAccount{}, 0x1}, ) + */ return ms, capKey } @@ -47,7 +47,7 @@ func TestAccountMapperGetSet(t *testing.T) { acc = mapper.NewAccountWithAddress(ctx, addr) assert.NotNil(t, acc) assert.Equal(t, addr, acc.GetAddress()) - assert.EqualValues(t, crypto.PubKey{}, acc.GetPubKey()) + assert.EqualValues(t, nil, acc.GetPubKey()) assert.EqualValues(t, 0, acc.GetSequence()) // NewAccount doesn't call Set, so it's still nil diff --git a/x/ibc/ibc_test.go b/x/ibc/ibc_test.go index 1e04311479..34f4f6678e 100644 --- a/x/ibc/ibc_test.go +++ b/x/ibc/ibc_test.go @@ -7,7 +7,6 @@ import ( abci "github.com/tendermint/abci/types" "github.com/tendermint/go-crypto" - oldwire "github.com/tendermint/go-wire" dbm "github.com/tendermint/tmlibs/db" "github.com/cosmos/cosmos-sdk/store" @@ -37,35 +36,20 @@ func getCoins(ck bank.CoinKeeper, ctx sdk.Context, addr crypto.Address) (sdk.Coi return ck.AddCoins(ctx, addr, zero) } -// custom tx codec -// TODO: use new go-wire func makeCodec() *wire.Codec { + var cdc = wire.NewCodec() - const msgTypeSend = 0x1 - const msgTypeIssue = 0x2 - const msgTypeQuiz = 0x3 - const msgTypeSetTrend = 0x4 - const msgTypeIBCTransferMsg = 0x5 - const msgTypeIBCReceiveMsg = 0x6 - var _ = oldwire.RegisterInterface( - struct{ sdk.Msg }{}, - oldwire.ConcreteType{bank.SendMsg{}, msgTypeSend}, - oldwire.ConcreteType{bank.IssueMsg{}, msgTypeIssue}, - oldwire.ConcreteType{IBCTransferMsg{}, msgTypeIBCTransferMsg}, - oldwire.ConcreteType{IBCReceiveMsg{}, msgTypeIBCReceiveMsg}, - ) + // Register Msgs + cdc.RegisterInterface((*sdk.Msg)(nil), nil) + cdc.RegisterConcrete(bank.SendMsg{}, "test/ibc/Send", nil) + cdc.RegisterConcrete(bank.IssueMsg{}, "test/ibc/Issue", nil) + cdc.RegisterConcrete(IBCTransferMsg{}, "test/ibc/IBCTransferMsg", nil) + cdc.RegisterConcrete(IBCReceiveMsg{}, "test/ibc/IBCReceiveMsg", nil) - const accTypeApp = 0x1 - var _ = oldwire.RegisterInterface( - struct{ sdk.Account }{}, - oldwire.ConcreteType{&auth.BaseAccount{}, accTypeApp}, - ) - cdc := wire.NewCodec() + // Register AppAccount + cdc.RegisterInterface((*sdk.Account)(nil), nil) + cdc.RegisterConcrete(&auth.BaseAccount{}, "test/ibc/Account", nil) - // cdc.RegisterInterface((*sdk.Msg)(nil), nil) - // bank.RegisterWire(cdc) // Register bank.[SendMsg,IssueMsg] types. - // crypto.RegisterWire(cdc) // Register crypto.[PubKey,PrivKey,Signature] types. - // ibc.RegisterWire(cdc) // Register ibc.[IBCTransferMsg, IBCReceiveMsg] types. return cdc } diff --git a/x/simplestake/commands/commands.go b/x/simplestake/commands/commands.go index ce89801d88..b2a057beed 100644 --- a/x/simplestake/commands/commands.go +++ b/x/simplestake/commands/commands.go @@ -77,7 +77,7 @@ func (co commander) bondTxCmd(cmd *cobra.Command, args []string) error { var pubKeyEd crypto.PubKeyEd25519 copy(pubKeyEd[:], rawPubKey) - msg := simplestake.NewBondMsg(from, stake, pubKeyEd.Wrap()) + msg := simplestake.NewBondMsg(from, stake, pubKeyEd) return co.sendMsg(msg) } diff --git a/x/simplestake/keeper.go b/x/simplestake/keeper.go index e5892f3e23..2370a8db38 100644 --- a/x/simplestake/keeper.go +++ b/x/simplestake/keeper.go @@ -83,7 +83,7 @@ func (k Keeper) Bond(ctx sdk.Context, addr sdk.Address, pubKey crypto.PubKey, st func (k Keeper) Unbond(ctx sdk.Context, addr sdk.Address) (crypto.PubKey, int64, sdk.Error) { bi := k.getBondInfo(ctx, addr) if bi.isEmpty() { - return crypto.PubKey{}, 0, ErrInvalidUnbond() + return nil, 0, ErrInvalidUnbond() } k.deleteBondInfo(ctx, addr) @@ -121,7 +121,7 @@ func (k Keeper) bondWithoutCoins(ctx sdk.Context, addr sdk.Address, pubKey crypt func (k Keeper) unbondWithoutCoins(ctx sdk.Context, addr sdk.Address) (crypto.PubKey, int64, sdk.Error) { bi := k.getBondInfo(ctx, addr) if bi.isEmpty() { - return crypto.PubKey{}, 0, ErrInvalidUnbond() + return nil, 0, ErrInvalidUnbond() } k.deleteBondInfo(ctx, addr) diff --git a/x/simplestake/msgs.go b/x/simplestake/msgs.go index 2ab0e1bad2..9f41334842 100644 --- a/x/simplestake/msgs.go +++ b/x/simplestake/msgs.go @@ -34,7 +34,7 @@ func (msg BondMsg) ValidateBasic() sdk.Error { return ErrEmptyStake() } - if msg.PubKey.Empty() { + if msg.PubKey == nil { return sdk.ErrInvalidPubKey("BondMsg.PubKey must not be empty") } diff --git a/x/stake/commands/tx.go b/x/stake/commands/tx.go index d1dec6dce9..d1a399e19c 100644 --- a/x/stake/commands/tx.go +++ b/x/stake/commands/tx.go @@ -250,6 +250,6 @@ func GetPubKey(pubKeyStr string) (pk crypto.PubKey, err error) { } var pkEd crypto.PubKeyEd25519 copy(pkEd[:], pkBytes[:]) - pk = pkEd.Wrap() + pk = pkEd return } diff --git a/x/stake/test_common.go b/x/stake/test_common.go index ceb2addb4f..e116bf705b 100644 --- a/x/stake/test_common.go +++ b/x/stake/test_common.go @@ -83,7 +83,7 @@ func subspace(prefix []byte) (start, end []byte) { return prefix, end } -func MakeCodec() *wire.Codec { +func makeTestCodec() *wire.Codec { var cdc = wire.NewCodec() // Register Msgs @@ -152,7 +152,7 @@ func newPubKey(pk string) (res crypto.PubKey) { //res, err = crypto.PubKeyFromBytes(pkBytes) var pkEd crypto.PubKeyEd25519 copy(pkEd[:], pkBytes[:]) - return pkEd.Wrap() + return pkEd } // for incode address generation From 6c845e4ecd46bbb9f0533fa237a38e6d0daf0e82 Mon Sep 17 00:00:00 2001 From: Jae Kwon Date: Fri, 6 Apr 2018 21:48:54 -0700 Subject: [PATCH 10/50] Comment Capitalization. --- examples/democoin/app/app.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/examples/democoin/app/app.go b/examples/democoin/app/app.go index efa1236fa1..8e7c205150 100644 --- a/examples/democoin/app/app.go +++ b/examples/democoin/app/app.go @@ -43,7 +43,8 @@ type DemocoinApp struct { } func NewDemocoinApp(logger log.Logger, dbs map[string]dbm.DB) *DemocoinApp { - // create your application object + + // Create your application object. var app = &DemocoinApp{ BaseApp: bam.NewBaseApp(appName, logger, dbs["main"]), cdc: MakeCodec(), @@ -54,13 +55,13 @@ func NewDemocoinApp(logger log.Logger, dbs map[string]dbm.DB) *DemocoinApp { capKeyStakingStore: sdk.NewKVStoreKey("stake"), } - // define the accountMapper + // Define the accountMapper. app.accountMapper = auth.NewAccountMapperSealed( app.capKeyMainStore, // target store &types.AppAccount{}, // prototype ) - // add handlers + // Add handlers. coinKeeper := bank.NewCoinKeeper(app.accountMapper) coolKeeper := cool.NewKeeper(app.capKeyMainStore, coinKeeper) powKeeper := pow.NewKeeper(app.capKeyPowStore, pow.NewPowConfig("pow", int64(1)), coinKeeper) @@ -74,7 +75,7 @@ func NewDemocoinApp(logger log.Logger, dbs map[string]dbm.DB) *DemocoinApp { AddRoute("ibc", ibc.NewHandler(ibcMapper, coinKeeper)). AddRoute("simplestake", simplestake.NewHandler(stakeKeeper)) - // initialize BaseApp + // Initialize BaseApp. app.SetTxDecoder(app.txDecoder) app.SetInitChainer(app.initChainerFn(coolKeeper, powKeeper)) app.MountStoreWithDB(app.capKeyMainStore, sdk.StoreTypeIAVL, dbs["main"]) From c4bc88837584804c012070da708ff9e282ec47d7 Mon Sep 17 00:00:00 2001 From: Jae Kwon Date: Sat, 7 Apr 2018 00:02:00 -0700 Subject: [PATCH 11/50] Fix almost all tests --- Makefile | 2 +- examples/basecoin/app/app.go | 28 +++++++++++++-------- examples/basecoin/app/app_test.go | 3 +-- examples/democoin/app/app.go | 13 +++++++--- examples/democoin/app/app_test.go | 9 +++---- examples/democoin/x/pow/handler_test.go | 5 +++- examples/democoin/x/pow/keeper_test.go | 5 +++- types/coin.go | 2 +- types/coin_test.go | 4 +-- x/auth/ante_test.go | 24 +++++++++++++----- x/auth/baseaccount.go | 5 +++- x/auth/mapper.go | 33 +------------------------ x/auth/mapper_test.go | 22 ++++++----------- x/ibc/ibc_test.go | 7 +++--- x/simplestake/keeper.go | 1 + x/simplestake/keeper_test.go | 5 +++- x/stake/test_common.go | 6 +++-- 17 files changed, 87 insertions(+), 87 deletions(-) diff --git a/Makefile b/Makefile index b5177621aa..8d6fb9952d 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -PACKAGES=$(shell go list ./... | grep -v '/vendor/') +PACKAGES=$(shell go list ./... | grep -v '/vendor/' | grep -v 'client/lcd') # XXX COMMIT_HASH := $(shell git rev-parse --short HEAD) BUILD_FLAGS = -ldflags "-X github.com/cosmos/cosmos-sdk/version.GitCommit=${COMMIT_HASH}" diff --git a/examples/basecoin/app/app.go b/examples/basecoin/app/app.go index e6623329d8..15a4f1f193 100644 --- a/examples/basecoin/app/app.go +++ b/examples/basecoin/app/app.go @@ -39,23 +39,28 @@ type BasecoinApp struct { } func NewBasecoinApp(logger log.Logger, dbs map[string]dbm.DB) *BasecoinApp { - // create your application object + + // Create app-level codec for txs and accounts. + var cdc = MakeCodec() + + // Create your application object. var app = &BasecoinApp{ BaseApp: bam.NewBaseApp(appName, logger, dbs["main"]), - cdc: MakeCodec(), + cdc: cdc, capKeyMainStore: sdk.NewKVStoreKey("main"), capKeyAccountStore: sdk.NewKVStoreKey("acc"), capKeyIBCStore: sdk.NewKVStoreKey("ibc"), capKeyStakingStore: sdk.NewKVStoreKey("stake"), } - // define the accountMapper - app.accountMapper = auth.NewAccountMapperSealed( + // Define the accountMapper. + app.accountMapper = auth.NewAccountMapper( + cdc, app.capKeyMainStore, // target store &types.AppAccount{}, // prototype - ) + ).Seal() - // add handlers + // Add handlers. coinKeeper := bank.NewCoinKeeper(app.accountMapper) ibcMapper := ibc.NewIBCMapper(app.cdc, app.capKeyIBCStore) stakeKeeper := simplestake.NewKeeper(app.capKeyStakingStore, coinKeeper) @@ -64,7 +69,7 @@ func NewBasecoinApp(logger log.Logger, dbs map[string]dbm.DB) *BasecoinApp { AddRoute("ibc", ibc.NewHandler(ibcMapper, coinKeeper)). AddRoute("simplestake", simplestake.NewHandler(stakeKeeper)) - // initialize BaseApp + // Initialize BaseApp. app.SetTxDecoder(app.txDecoder) app.SetInitChainer(app.initChainer) app.MountStoreWithDB(app.capKeyMainStore, sdk.StoreTypeIAVL, dbs["main"]) @@ -82,7 +87,7 @@ func NewBasecoinApp(logger log.Logger, dbs map[string]dbm.DB) *BasecoinApp { return app } -// custom tx codec +// Custom tx codec func MakeCodec() *wire.Codec { var cdc = wire.NewCodec() @@ -99,10 +104,13 @@ func MakeCodec() *wire.Codec { cdc.RegisterInterface((*sdk.Account)(nil), nil) cdc.RegisterConcrete(&types.AppAccount{}, "basecoin/Account", nil) + // Register crypto. + wire.RegisterCrypto(cdc) + return cdc } -// custom logic for transaction decoding +// Custom logic for transaction decoding func (app *BasecoinApp) txDecoder(txBytes []byte) (sdk.Tx, sdk.Error) { var tx = sdk.StdTx{} @@ -119,7 +127,7 @@ func (app *BasecoinApp) txDecoder(txBytes []byte) (sdk.Tx, sdk.Error) { return tx, nil } -// custom logic for basecoin initialization +// Custom logic for basecoin initialization func (app *BasecoinApp) initChainer(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain { stateJSON := req.AppStateBytes diff --git a/examples/basecoin/app/app_test.go b/examples/basecoin/app/app_test.go index 65aff3af99..41c1a6f171 100644 --- a/examples/basecoin/app/app_test.go +++ b/examples/basecoin/app/app_test.go @@ -349,10 +349,9 @@ func TestQuizMsg(t *testing.T) { // Construct genesis state // Construct some genesis bytes to reflect basecoin/types/AppAccount - coins := sdk.Coins{} baseAcc := auth.BaseAccount{ Address: addr1, - Coins: coins, + Coins: nil, } acc1 := &types.AppAccount{baseAcc, "foobart"} diff --git a/examples/democoin/app/app.go b/examples/democoin/app/app.go index 8e7c205150..ad6fd7865d 100644 --- a/examples/democoin/app/app.go +++ b/examples/democoin/app/app.go @@ -44,10 +44,13 @@ type DemocoinApp struct { func NewDemocoinApp(logger log.Logger, dbs map[string]dbm.DB) *DemocoinApp { + // Create app-level codec for txs and accounts. + var cdc = MakeCodec() + // Create your application object. var app = &DemocoinApp{ BaseApp: bam.NewBaseApp(appName, logger, dbs["main"]), - cdc: MakeCodec(), + cdc: cdc, capKeyMainStore: sdk.NewKVStoreKey("main"), capKeyAccountStore: sdk.NewKVStoreKey("acc"), capKeyPowStore: sdk.NewKVStoreKey("pow"), @@ -56,10 +59,11 @@ func NewDemocoinApp(logger log.Logger, dbs map[string]dbm.DB) *DemocoinApp { } // Define the accountMapper. - app.accountMapper = auth.NewAccountMapperSealed( + app.accountMapper = auth.NewAccountMapper( + cdc, app.capKeyMainStore, // target store &types.AppAccount{}, // prototype - ) + ).Seal() // Add handlers. coinKeeper := bank.NewCoinKeeper(app.accountMapper) @@ -114,6 +118,9 @@ func MakeCodec() *wire.Codec { cdc.RegisterInterface((*sdk.Account)(nil), nil) cdc.RegisterConcrete(&types.AppAccount{}, "democoin/Account", nil) + // Register crypto. + wire.RegisterCrypto(cdc) + return cdc } diff --git a/examples/democoin/app/app_test.go b/examples/democoin/app/app_test.go index 1cc56bd6bf..7047f5d28b 100644 --- a/examples/democoin/app/app_test.go +++ b/examples/democoin/app/app_test.go @@ -106,8 +106,7 @@ func TestMsgs(t *testing.T) { }}) // just marshal/unmarshal! - cdc := MakeCodec() - txBytes, err := cdc.MarshalBinary(tx) + txBytes, err := bapp.cdc.MarshalBinary(tx) require.NoError(t, err, "i: %v", i) // Run a Check @@ -245,10 +244,9 @@ func TestMineMsg(t *testing.T) { // Construct genesis state // Construct some genesis bytes to reflect democoin/types/AppAccount - coins := sdk.Coins{} baseAcc := auth.BaseAccount{ Address: addr1, - Coins: coins, + Coins: nil, } acc1 := &types.AppAccount{baseAcc, "foobart"} @@ -297,10 +295,9 @@ func TestQuizMsg(t *testing.T) { // Construct genesis state // Construct some genesis bytes to reflect democoin/types/AppAccount - coins := sdk.Coins{} baseAcc := auth.BaseAccount{ Address: addr1, - Coins: coins, + Coins: nil, } acc1 := &types.AppAccount{baseAcc, "foobart"} diff --git a/examples/democoin/x/pow/handler_test.go b/examples/democoin/x/pow/handler_test.go index 2de2853713..a059327801 100644 --- a/examples/democoin/x/pow/handler_test.go +++ b/examples/democoin/x/pow/handler_test.go @@ -8,14 +8,17 @@ import ( abci "github.com/tendermint/abci/types" sdk "github.com/cosmos/cosmos-sdk/types" + wire "github.com/cosmos/cosmos-sdk/wire" auth "github.com/cosmos/cosmos-sdk/x/auth" bank "github.com/cosmos/cosmos-sdk/x/bank" ) func TestPowHandler(t *testing.T) { ms, capKey := setupMultiStore() + cdc := wire.NewCodec() + auth.RegisterBaseAccount(cdc) - am := auth.NewAccountMapper(capKey, &auth.BaseAccount{}) + am := auth.NewAccountMapper(cdc, capKey, &auth.BaseAccount{}) ctx := sdk.NewContext(ms, abci.Header{}, false, nil) config := NewPowConfig("pow", int64(1)) ck := bank.NewCoinKeeper(am) diff --git a/examples/democoin/x/pow/keeper_test.go b/examples/democoin/x/pow/keeper_test.go index 6e0d526496..cb3492a862 100644 --- a/examples/democoin/x/pow/keeper_test.go +++ b/examples/democoin/x/pow/keeper_test.go @@ -10,6 +10,7 @@ import ( "github.com/cosmos/cosmos-sdk/store" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/wire" auth "github.com/cosmos/cosmos-sdk/x/auth" bank "github.com/cosmos/cosmos-sdk/x/bank" ) @@ -27,8 +28,10 @@ func setupMultiStore() (sdk.MultiStore, *sdk.KVStoreKey) { func TestPowKeeperGetSet(t *testing.T) { ms, capKey := setupMultiStore() + cdc := wire.NewCodec() + auth.RegisterBaseAccount(cdc) - am := auth.NewAccountMapper(capKey, &auth.BaseAccount{}) + am := auth.NewAccountMapper(cdc, capKey, &auth.BaseAccount{}) ctx := sdk.NewContext(ms, abci.Header{}, false, nil) config := NewPowConfig("pow", int64(1)) ck := bank.NewCoinKeeper(am) diff --git a/types/coin.go b/types/coin.go index ab7d863c15..8a80bee226 100644 --- a/types/coin.go +++ b/types/coin.go @@ -110,7 +110,7 @@ func (coins Coins) IsValid() bool { // Plus combines two sets of coins // CONTRACT: Plus will never return Coins where one Coin has a 0 amount. func (coins Coins) Plus(coinsB Coins) Coins { - sum := []Coin{} + sum := ([]Coin)(nil) indexA, indexB := 0, 0 lenA, lenB := len(coins), len(coinsB) for { diff --git a/types/coin_test.go b/types/coin_test.go index 19929e8c79..eb9f5e087e 100644 --- a/types/coin_test.go +++ b/types/coin_test.go @@ -201,8 +201,8 @@ func TestPlusCoins(t *testing.T) { }{ {Coins{{"A", 1}, {"B", 1}}, Coins{{"A", 1}, {"B", 1}}, Coins{{"A", 2}, {"B", 2}}}, {Coins{{"A", 0}, {"B", 1}}, Coins{{"A", 0}, {"B", 0}}, Coins{{"B", 1}}}, - {Coins{{"A", 0}, {"B", 0}}, Coins{{"A", 0}, {"B", 0}}, Coins{}}, - {Coins{{"A", 1}, {"B", 0}}, Coins{{"A", -1}, {"B", 0}}, Coins{}}, + {Coins{{"A", 0}, {"B", 0}}, Coins{{"A", 0}, {"B", 0}}, Coins(nil)}, + {Coins{{"A", 1}, {"B", 0}}, Coins{{"A", -1}, {"B", 0}}, Coins(nil)}, {Coins{{"A", -1}, {"B", 0}}, Coins{{"A", 0}, {"B", 0}}, Coins{{"A", -1}}}, } diff --git a/x/auth/ante_test.go b/x/auth/ante_test.go index fa545e32bd..2f90701e65 100644 --- a/x/auth/ante_test.go +++ b/x/auth/ante_test.go @@ -3,11 +3,13 @@ package auth import ( "testing" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" abci "github.com/tendermint/abci/types" crypto "github.com/tendermint/go-crypto" + + sdk "github.com/cosmos/cosmos-sdk/types" + wire "github.com/cosmos/cosmos-sdk/wire" ) func newTestMsg(addrs ...sdk.Address) *sdk.TestMsg { @@ -67,7 +69,9 @@ func newTestTxWithSignBytes(msg sdk.Msg, privs []crypto.PrivKey, seqs []int64, f func TestAnteHandlerSigErrors(t *testing.T) { // setup ms, capKey := setupMultiStore() - mapper := NewAccountMapper(capKey, &BaseAccount{}) + cdc := wire.NewCodec() + RegisterBaseAccount(cdc) + mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) anteHandler := NewAnteHandler(mapper) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil) @@ -106,7 +110,9 @@ func TestAnteHandlerSigErrors(t *testing.T) { func TestAnteHandlerSequences(t *testing.T) { // setup ms, capKey := setupMultiStore() - mapper := NewAccountMapper(capKey, &BaseAccount{}) + cdc := wire.NewCodec() + RegisterBaseAccount(cdc) + mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) anteHandler := NewAnteHandler(mapper) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil) @@ -170,7 +176,9 @@ func TestAnteHandlerSequences(t *testing.T) { func TestAnteHandlerFees(t *testing.T) { // setup ms, capKey := setupMultiStore() - mapper := NewAccountMapper(capKey, &BaseAccount{}) + cdc := wire.NewCodec() + RegisterBaseAccount(cdc) + mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) anteHandler := NewAnteHandler(mapper) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil) @@ -205,7 +213,9 @@ func TestAnteHandlerFees(t *testing.T) { func TestAnteHandlerBadSignBytes(t *testing.T) { // setup ms, capKey := setupMultiStore() - mapper := NewAccountMapper(capKey, &BaseAccount{}) + cdc := wire.NewCodec() + RegisterBaseAccount(cdc) + mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) anteHandler := NewAnteHandler(mapper) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil) @@ -278,7 +288,9 @@ func TestAnteHandlerBadSignBytes(t *testing.T) { func TestAnteHandlerSetPubKey(t *testing.T) { // setup ms, capKey := setupMultiStore() - mapper := NewAccountMapper(capKey, &BaseAccount{}) + cdc := wire.NewCodec() + RegisterBaseAccount(cdc) + mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) anteHandler := NewAnteHandler(mapper) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil) diff --git a/x/auth/baseaccount.go b/x/auth/baseaccount.go index 74d8625f08..a5f33c81d1 100644 --- a/x/auth/baseaccount.go +++ b/x/auth/baseaccount.go @@ -93,6 +93,9 @@ func (acc *BaseAccount) SetSequence(seq int64) error { //---------------------------------------- // Wire -func RegisterWireBaseAccount(cdc *wire.Codec) { +// Most users shouldn't use this, but this comes handy for tests. +func RegisterBaseAccount(cdc *wire.Codec) { + cdc.RegisterInterface((*sdk.Account)(nil), nil) + cdc.RegisterConcrete(&BaseAccount{}, "cosmos-sdk/BaseAccount", nil) wire.RegisterCrypto(cdc) } diff --git a/x/auth/mapper.go b/x/auth/mapper.go index e07e8fbaad..7bc23aee10 100644 --- a/x/auth/mapper.go +++ b/x/auth/mapper.go @@ -28,8 +28,7 @@ type accountMapper struct { // NewAccountMapper returns a new sdk.AccountMapper that // uses go-amino to (binary) encode and decode concrete sdk.Accounts. -func NewAccountMapper(key sdk.StoreKey, proto sdk.Account) accountMapper { - cdc := wire.NewCodec() +func NewAccountMapper(cdc *wire.Codec, key sdk.StoreKey, proto sdk.Account) accountMapper { return accountMapper{ key: key, proto: proto, @@ -37,20 +36,6 @@ func NewAccountMapper(key sdk.StoreKey, proto sdk.Account) accountMapper { } } -// Create and return a sealed account mapper -func NewAccountMapperSealed(key sdk.StoreKey, proto sdk.Account) sealedAccountMapper { - cdc := wire.NewCodec() - am := accountMapper{ - key: key, - proto: proto, - cdc: cdc, - } - RegisterWireBaseAccount(cdc) - - // make accountMapper's WireCodec() inaccessible, return - return am.Seal() -} - // Returns the go-amino codec. You may need to register interfaces // and concrete types here, if your app's sdk.Account // implementation includes interface fields. @@ -108,22 +93,6 @@ func (sam sealedAccountMapper) WireCodec() *wire.Codec { //---------------------------------------- // misc. -// NOTE: currently unused -func (am accountMapper) clonePrototypePtr() interface{} { - protoRt := reflect.TypeOf(am.proto) - if protoRt.Kind() == reflect.Ptr { - protoErt := protoRt.Elem() - if protoErt.Kind() != reflect.Struct { - panic("accountMapper requires a struct proto sdk.Account, or a pointer to one") - } - protoRv := reflect.New(protoErt) - return protoRv.Interface() - } else { - protoRv := reflect.New(protoRt) - return protoRv.Interface() - } -} - // Creates a new struct (or pointer to struct) from am.proto. func (am accountMapper) clonePrototype() sdk.Account { protoRt := reflect.TypeOf(am.proto) diff --git a/x/auth/mapper_test.go b/x/auth/mapper_test.go index 752c933cce..030207db2c 100644 --- a/x/auth/mapper_test.go +++ b/x/auth/mapper_test.go @@ -10,6 +10,7 @@ import ( "github.com/cosmos/cosmos-sdk/store" sdk "github.com/cosmos/cosmos-sdk/types" + wire "github.com/cosmos/cosmos-sdk/wire" ) func setupMultiStore() (sdk.MultiStore, *sdk.KVStoreKey) { @@ -18,24 +19,17 @@ func setupMultiStore() (sdk.MultiStore, *sdk.KVStoreKey) { ms := store.NewCommitMultiStore(db) ms.MountStoreWithDB(capKey, sdk.StoreTypeIAVL, db) ms.LoadLatestVersion() - - /* XXX - // wire registration while we're at it ... TODO - var _ = oldwire.RegisterInterface( - struct{ sdk.Account }{}, - oldwire.ConcreteType{&BaseAccount{}, 0x1}, - ) - */ - return ms, capKey } func TestAccountMapperGetSet(t *testing.T) { ms, capKey := setupMultiStore() + cdc := wire.NewCodec() + RegisterBaseAccount(cdc) // make context and mapper ctx := sdk.NewContext(ms, abci.Header{}, false, nil) - mapper := NewAccountMapper(capKey, &BaseAccount{}) + mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) addr := sdk.Address([]byte("some-address")) @@ -66,16 +60,14 @@ func TestAccountMapperGetSet(t *testing.T) { func TestAccountMapperSealed(t *testing.T) { _, capKey := setupMultiStore() + cdc := wire.NewCodec() + RegisterBaseAccount(cdc) // normal mapper exposes the wire codec - mapper := NewAccountMapper(capKey, &BaseAccount{}) + mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) assert.NotNil(t, mapper.WireCodec()) // seal mapper, should panic when we try to get the codec mapperSealed := mapper.Seal() assert.Panics(t, func() { mapperSealed.WireCodec() }) - - // another way to get a sealed mapper - mapperSealed = NewAccountMapperSealed(capKey, &BaseAccount{}) - assert.Panics(t, func() { mapperSealed.WireCodec() }) } diff --git a/x/ibc/ibc_test.go b/x/ibc/ibc_test.go index 34f4f6678e..db172a5caf 100644 --- a/x/ibc/ibc_test.go +++ b/x/ibc/ibc_test.go @@ -32,7 +32,7 @@ func newAddress() crypto.Address { } func getCoins(ck bank.CoinKeeper, ctx sdk.Context, addr crypto.Address) (sdk.Coins, sdk.Error) { - zero := sdk.Coins{} + zero := sdk.Coins(nil) return ck.AddCoins(ctx, addr, zero) } @@ -49,6 +49,7 @@ func makeCodec() *wire.Codec { // Register AppAccount cdc.RegisterInterface((*sdk.Account)(nil), nil) cdc.RegisterConcrete(&auth.BaseAccount{}, "test/ibc/Account", nil) + wire.RegisterCrypto(cdc) return cdc } @@ -59,13 +60,13 @@ func TestIBC(t *testing.T) { key := sdk.NewKVStoreKey("ibc") ctx := defaultContext(key) - am := auth.NewAccountMapper(key, &auth.BaseAccount{}) + am := auth.NewAccountMapper(cdc, key, &auth.BaseAccount{}) ck := bank.NewCoinKeeper(am) src := newAddress() dest := newAddress() chainid := "ibcchain" - zero := sdk.Coins{} + zero := sdk.Coins(nil) mycoins := sdk.Coins{sdk.Coin{"mycoin", 10}} coins, err := ck.AddCoins(ctx, src, mycoins) diff --git a/x/simplestake/keeper.go b/x/simplestake/keeper.go index 2370a8db38..7dcdbc20fd 100644 --- a/x/simplestake/keeper.go +++ b/x/simplestake/keeper.go @@ -21,6 +21,7 @@ type Keeper struct { func NewKeeper(key sdk.StoreKey, coinKeeper bank.CoinKeeper) Keeper { cdc := wire.NewCodec() + wire.RegisterCrypto(cdc) return Keeper{ key: key, cdc: cdc, diff --git a/x/simplestake/keeper_test.go b/x/simplestake/keeper_test.go index 9f26155901..7f9a120b96 100644 --- a/x/simplestake/keeper_test.go +++ b/x/simplestake/keeper_test.go @@ -13,6 +13,7 @@ import ( "github.com/cosmos/cosmos-sdk/store" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/wire" "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/bank" ) @@ -55,10 +56,12 @@ func TestKeeperGetSet(t *testing.T) { func TestBonding(t *testing.T) { ms, authKey, capKey := setupMultiStore() + cdc := wire.NewCodec() + auth.RegisterBaseAccount(cdc) ctx := sdk.NewContext(ms, abci.Header{}, false, nil) - accountMapper := auth.NewAccountMapper(authKey, &auth.BaseAccount{}) + accountMapper := auth.NewAccountMapper(cdc, authKey, &auth.BaseAccount{}) coinKeeper := bank.NewCoinKeeper(accountMapper) stakeKeeper := NewKeeper(capKey, coinKeeper) addr := sdk.Address([]byte("some-address")) diff --git a/x/stake/test_common.go b/x/stake/test_common.go index e116bf705b..395a5bce01 100644 --- a/x/stake/test_common.go +++ b/x/stake/test_common.go @@ -97,6 +97,7 @@ func makeTestCodec() *wire.Codec { // Register AppAccount cdc.RegisterInterface((*sdk.Account)(nil), nil) cdc.RegisterConcrete(&auth.BaseAccount{}, "test/stake/Account", nil) + wire.RegisterCrypto(cdc) return cdc } @@ -125,10 +126,11 @@ func createTestInput(t *testing.T, isCheckTx bool, initCoins int64) (sdk.Context ctx := sdk.NewContext(ms, abci.Header{ChainID: "foochainid"}, isCheckTx, nil) cdc := makeTestCodec() - accountMapper := auth.NewAccountMapperSealed( + accountMapper := auth.NewAccountMapper( + cdc, // amino codec keyMain, // target store &auth.BaseAccount{}, // prototype - ) + ).Seal() ck := bank.NewCoinKeeper(accountMapper) keeper := NewKeeper(ctx, cdc, keyStake, ck) keeper.setPool(ctx, initialPool()) From 923742622a8cb9bb9b9723836caba08fb857aa5f Mon Sep 17 00:00:00 2001 From: Jae Kwon Date: Sat, 7 Apr 2018 00:08:53 -0700 Subject: [PATCH 12/50] Fix docs; Bump version; Fix makefile --- CHANGELOG.md | 6 ++++++ Gopkg.lock | 4 ++-- Makefile | 2 +- docs/apps.md | 4 ++-- docs/guide.md | 6 +++--- docs/sdk/glossary.rst | 7 +++---- docs/sdk/overview.rst | 6 +++--- examples/basecoin/types/account.go | 2 +- version/version.go | 6 +++--- 9 files changed, 24 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ced59c5ff..a37bb46187 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 0.14.0 (April 7, 2018) + +BREAKING CHANGES + +* Remove go-wire, use go-amino + ## 0.13.1 (April 3, 2018) BUG FIXES diff --git a/Gopkg.lock b/Gopkg.lock index 7d61f6f1b7..ec3d458e5d 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -346,7 +346,6 @@ version = "0.19.0-rc1" [[projects]] - branch = "develop" name = "github.com/tendermint/tmlibs" packages = [ "autofile", @@ -362,6 +361,7 @@ "pubsub/query" ] revision = "2e24b64fc121dcdf1cabceab8dc2f7257675483c" + version = "0.8.1" [[projects]] branch = "master" @@ -459,6 +459,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "2d266cd1c87ae063451b8c6cbce64d24463fd6edc61aa391be618c0447b7cd57" + inputs-digest = "14adc8fa3c1dd74dc5245e876158600265f86051b6d03f08f8a2d9f26dc347c2" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Makefile b/Makefile index 8d6fb9952d..b5177621aa 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -PACKAGES=$(shell go list ./... | grep -v '/vendor/' | grep -v 'client/lcd') # XXX +PACKAGES=$(shell go list ./... | grep -v '/vendor/') COMMIT_HASH := $(shell git rev-parse --short HEAD) BUILD_FLAGS = -ldflags "-X github.com/cosmos/cosmos-sdk/version.GitCommit=${COMMIT_HASH}" diff --git a/docs/apps.md b/docs/apps.md index 76434791c2..29fb905cba 100644 --- a/docs/apps.md +++ b/docs/apps.md @@ -40,7 +40,7 @@ Basecoin implements a `BaseApp` state machine using the `x/auth` and `x/bank` ex which define how transaction signers are authenticated and how coins are transferred. It should also use `x/ibc` and probably a simple staking extension. -Basecoin and the native `x` extensions use go-wire for all serialization needs, +Basecoin and the native `x` extensions use go-amino for all serialization needs, including for transactions and accounts. ## Your Cosmos App @@ -62,7 +62,7 @@ Ethermint is a new implementation of `BaseApp` that does not depend on Basecoin. Instead of `cosmos-sdk/x/` it has its own `ethermint/x` based on `go-ethereum`. Ethermint uses a Patricia store for its accounts, and an IAVL store for IBC. -It has `x/ante`, which is quite similar to Basecoin's but uses RLP instead of go-wire. +It has `x/ante`, which is quite similar to Basecoin's but uses RLP instead of go-amino. Instead of `x/bank`, it has `x/eth`, which defines the single Ethereum transaction type and all the semantics of the Ethereum state machine. diff --git a/docs/guide.md b/docs/guide.md index 5c31d2e271..12a9b534cb 100644 --- a/docs/guide.md +++ b/docs/guide.md @@ -168,8 +168,8 @@ into a `Tx`: type TxDecoder func(txBytes []byte) (Tx, error) ``` -In `Basecoin`, we use the Tendermint wire format and the `go-wire` library for -encoding and decoding all message types. The `go-wire` library has the nice +In `Basecoin`, we use the Tendermint wire format and the `go-amino` library for +encoding and decoding all message types. The `go-amino` library has the nice property that it can unmarshal into interface types, but it requires the relevant types to be registered ahead of type. Registration happens on a `Codec` object, so as not to taint the global name space. @@ -186,7 +186,7 @@ cdc.RegisterConcrete(bank.IssueMsg{}, "cosmos-sdk/IssueMsg", nil) Note how each concrete type is given a name - these name determine the type's unique "prefix bytes" during encoding. A registered type will always use the same prefix-bytes, regardless of what interface it is satisfying. For more -details, see the [go-wire documentation](https://github.com/tendermint/go-wire/blob/develop). +details, see the [go-amino documentation](https://github.com/tendermint/go-amino/blob/develop). ## MultiStore diff --git a/docs/sdk/glossary.rst b/docs/sdk/glossary.rst index 1480e7b38c..faf682da45 100644 --- a/docs/sdk/glossary.rst +++ b/docs/sdk/glossary.rst @@ -18,8 +18,7 @@ store), and it must have a deterministic action. The transaction is the main piece of one request. We currently make heavy use of -`go-wire `__ and -`data `__ to +`go-amino `__ to provide binary and json encodings and decodings for ``struct`` or interface\ ``objects. Here, encoding and decoding operations are designed to operate with interfaces nested any amount times (like an onion!). There is one public``\ TxMapper\` in the basecoin root package, and all modules can register their own @@ -162,13 +161,13 @@ also implements the ``Handler`` interface. We then register a list of modules with the dispatcher. Every module has a unique ``Name()``, which is used for isolating its state space. We use this same name for routing transactions. Each transaction implementation must be registed with -go-wire via ``TxMapper``, so we just look at the registered name of this +go-amino via ``TxMapper``, so we just look at the registered name of this transaction, which should be of the form ``/xxx``. The dispatcher grabs the appropriate module name from the tx name and routes it if the module is present. This all seems like a bit of magic, but really we're just making use of -go-wire magic that we are already using, rather than add another layer. +go-amino magic that we are already using, rather than add another layer. For all the transactions to be properly routed, the only thing you need to remember is to use the following pattern: diff --git a/docs/sdk/overview.rst b/docs/sdk/overview.rst index 9e79dd04ff..1356d7dc1d 100644 --- a/docs/sdk/overview.rst +++ b/docs/sdk/overview.rst @@ -278,8 +278,8 @@ into a ``Tx``: type TxDecoder func(txBytes []byte) (Tx, error) -In ``Basecoin``, we use the Tendermint wire format and the ``go-wire`` library for -encoding and decoding all message types. The ``go-wire`` library has the nice +In ``Basecoin``, we use the Tendermint wire format and the ``go-amino`` library for +encoding and decoding all message types. The ``go-amino`` library has the nice property that it can unmarshal into interface types, but it requires the relevant types to be registered ahead of type. Registration happens on a ``Codec`` object, so as not to taint the global name space. @@ -296,7 +296,7 @@ types: Note how each concrete type is given a name - these name determine the type's unique "prefix bytes" during encoding. A registered type will always use the same prefix-bytes, regardless of what interface it is satisfying. For more -details, see the `go-wire documentation `__. +details, see the `go-amino documentation `__. MultiStore diff --git a/examples/basecoin/types/account.go b/examples/basecoin/types/account.go index 35b37c7b2f..b9b735a27f 100644 --- a/examples/basecoin/types/account.go +++ b/examples/basecoin/types/account.go @@ -12,7 +12,7 @@ var _ sdk.Account = (*AppAccount)(nil) // extending auth.BaseAccount with custom fields. // // This is compatible with the stock auth.AccountStore, since -// auth.AccountStore uses the flexible go-wire library. +// auth.AccountStore uses the flexible go-amino library. type AppAccount struct { auth.BaseAccount Name string `json:"name"` diff --git a/version/version.go b/version/version.go index 324db29dc9..53ba7f8c3f 100644 --- a/version/version.go +++ b/version/version.go @@ -6,10 +6,10 @@ package version // TODO improve const Maj = "0" -const Min = "13" -const Fix = "2" +const Min = "14" +const Fix = "0" -const Version = "0.13.2-dev" +const Version = "0.14.0-rc1" // GitCommit set by build flags var GitCommit = "" From a06cfbeaa824661a03970ac2edbedc641ac54f33 Mon Sep 17 00:00:00 2001 From: Jae Kwon Date: Sat, 7 Apr 2018 00:19:44 -0700 Subject: [PATCH 13/50] ... --- client/lcd/helpers.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/client/lcd/helpers.go b/client/lcd/helpers.go index 71278fca33..64814a5fcf 100644 --- a/client/lcd/helpers.go +++ b/client/lcd/helpers.go @@ -7,6 +7,7 @@ import ( "os" "path/filepath" "strings" + "time" cmn "github.com/tendermint/tmlibs/common" @@ -21,11 +22,15 @@ func waitForRPC() { laddr := GetConfig().RPC.ListenAddress fmt.Println("LADDR", laddr) client := rpcclient.NewJSONRPCClient(laddr) + ctypes.RegisterAmino(client.Codec()) result := new(ctypes.ResultStatus) for { _, err := client.Call("status", map[string]interface{}{}, result) if err == nil { return + } else { + fmt.Println("error", err) + time.Sleep(time.Millisecond) } } } From 413780807efebfc39ba04814959c5000c1983488 Mon Sep 17 00:00:00 2001 From: Jae Kwon Date: Sat, 7 Apr 2018 02:16:41 -0700 Subject: [PATCH 14/50] WIP --- Gopkg.lock | 6 +++--- Gopkg.toml | 2 +- client/lcd/lcd_test.go | 9 +++++---- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index ec3d458e5d..ff4e21c1c7 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -342,8 +342,8 @@ "types/priv_validator", "version" ] - revision = "02531ca5a3a3d521e33bffa528583ff5b78d0594" - version = "0.19.0-rc1" + revision = "7afe74a963b5222bbc063545f4a9261d27b188de" + version = "0.19.0-rc2" [[projects]] name = "github.com/tendermint/tmlibs" @@ -459,6 +459,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "14adc8fa3c1dd74dc5245e876158600265f86051b6d03f08f8a2d9f26dc347c2" + inputs-digest = "ad719da6da7632d7fd405a696e66e36d5616142a499358189d88312dc1946d34" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index b3517e9701..2570c08856 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -70,7 +70,7 @@ [[constraint]] name = "github.com/tendermint/tendermint" - version = "0.19.0-rc1" + version = "0.19.0-rc2" [[override]] name = "github.com/tendermint/tmlibs" diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 585d1570ed..7fcbb02b94 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -340,7 +340,7 @@ func startTMAndLCD() (*nm.Node, net.Listener, error) { config.Consensus.SkipTimeoutCommit = false logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)) - logger = log.NewFilter(logger, log.AllowError()) + // logger = log.NewFilter(logger, log.AllowError()) privValidatorFile := config.PrivValidatorFile() privVal := pvm.LoadOrGenFilePV(privValidatorFile) dbs := map[string]dbm.DB{ @@ -374,6 +374,7 @@ func startTMAndLCD() (*nm.Node, net.Listener, error) { genDoc.AppState = stateBytes cdc := wire.NewCodec() + wire.RegisterCrypto(cdc) // LCD listen address port = fmt.Sprintf("%d", 17377) // XXX @@ -392,7 +393,7 @@ func startTMAndLCD() (*nm.Node, net.Listener, error) { return nil, nil, err } - waitForStart() + waitForStart(cdc) return node, lcd, nil } @@ -533,7 +534,7 @@ func waitForHeight(height int64) { } // wait for 2 blocks -func waitForStart() { +func waitForStart(cdc *wire.Codec) { waitHeight := int64(2) for { time.Sleep(time.Second) @@ -558,7 +559,7 @@ func waitForStart() { } res.Body.Close() - err = json.Unmarshal([]byte(body), &resultBlock) + err = cdc.UnmarshalJSON([]byte(body), &resultBlock) if err != nil { fmt.Println("RES", res) fmt.Println("BODY", string(body)) From 1860f988b62dd0cc8e56011edbc1410e63b96370 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Sat, 7 Apr 2018 20:56:49 +0300 Subject: [PATCH 15/50] fix tests --- Gopkg.lock | 7 +-- Gopkg.toml | 3 +- client/lcd/lcd_test.go | 104 ++++++++++++++++--------------------- client/lcd/wire.go | 12 +++++ client/rpc/block.go | 3 +- client/rpc/status.go | 3 +- client/rpc/validators.go | 3 +- client/rpc/wire.go | 9 +--- x/auth/commands/account.go | 7 ++- x/auth/rest/query.go | 3 +- x/ibc/rest/transfer.go | 5 +- 11 files changed, 75 insertions(+), 84 deletions(-) create mode 100644 client/lcd/wire.go diff --git a/Gopkg.lock b/Gopkg.lock index ff4e21c1c7..620d30d6d8 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -305,6 +305,7 @@ version = "v0.7.0" [[projects]] + branch = "bucky/aminoify" name = "github.com/tendermint/tendermint" packages = [ "blockchain", @@ -342,8 +343,7 @@ "types/priv_validator", "version" ] - revision = "7afe74a963b5222bbc063545f4a9261d27b188de" - version = "0.19.0-rc2" + revision = "466c3ab1c79c1e9856aeea80c9e11c31219d11f0" [[projects]] name = "github.com/tendermint/tmlibs" @@ -448,6 +448,7 @@ "transport" ] revision = "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e" + source = "github.com/grpc/grpc-go" version = "v1.7.5" [[projects]] @@ -459,6 +460,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "ad719da6da7632d7fd405a696e66e36d5616142a499358189d88312dc1946d34" + inputs-digest = "d81bbe5d23b9bc1e1829c207a57857c40957c4c0dac6c70f5af04e0930cbd652" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 2570c08856..d8973a4c43 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -70,7 +70,8 @@ [[constraint]] name = "github.com/tendermint/tendermint" - version = "0.19.0-rc2" + #version = "0.19.0-rc2" + branch = "bucky/aminoify" [[override]] name = "github.com/tendermint/tmlibs" diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 7fcbb02b94..fe38b18d8f 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -35,8 +35,6 @@ import ( bapp "github.com/cosmos/cosmos-sdk/examples/basecoin/app" btypes "github.com/cosmos/cosmos-sdk/examples/basecoin/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/wire" - "github.com/cosmos/cosmos-sdk/x/auth" ) var ( @@ -90,7 +88,7 @@ func TestKeys(t *testing.T) { res, body = request(t, port, "GET", "/keys", nil) require.Equal(t, http.StatusOK, res.StatusCode, body) var m [2]keys.KeyOutput - err = json.Unmarshal([]byte(body), &m) + err = cdc.UnmarshalJSON([]byte(body), &m) require.Nil(t, err) assert.Equal(t, m[0].Name, name, "Did not serve keys name correctly") @@ -103,7 +101,7 @@ func TestKeys(t *testing.T) { res, body = request(t, port, "GET", keyEndpoint, nil) require.Equal(t, http.StatusOK, res.StatusCode, body) var m2 keys.KeyOutput - err = json.Unmarshal([]byte(body), &m2) + err = cdc.UnmarshalJSON([]byte(body), &m2) require.Nil(t, err) assert.Equal(t, newName, m2.Name, "Did not serve keys name correctly") @@ -143,7 +141,7 @@ func TestNodeStatus(t *testing.T) { require.Equal(t, http.StatusOK, res.StatusCode, body) var nodeInfo p2p.NodeInfo - err := json.Unmarshal([]byte(body), &nodeInfo) + err := cdc.UnmarshalJSON([]byte(body), &nodeInfo) require.Nil(t, err, "Couldn't parse node info") assert.NotEqual(t, p2p.NodeInfo{}, nodeInfo, "res: %v", res) @@ -166,7 +164,7 @@ func TestBlock(t *testing.T) { res, body := request(t, port, "GET", "/blocks/latest", nil) require.Equal(t, http.StatusOK, res.StatusCode, body) - err := json.Unmarshal([]byte(body), &resultBlock) + err := cdc.UnmarshalJSON([]byte(body), &resultBlock) require.Nil(t, err, "Couldn't parse block") assert.NotEqual(t, ctypes.ResultBlock{}, resultBlock) @@ -194,7 +192,7 @@ func TestValidators(t *testing.T) { res, body := request(t, port, "GET", "/validatorsets/latest", nil) require.Equal(t, http.StatusOK, res.StatusCode, body) - err := json.Unmarshal([]byte(body), &resultVals) + err := cdc.UnmarshalJSON([]byte(body), &resultVals) require.Nil(t, err, "Couldn't parse validatorset") assert.NotEqual(t, ctypes.ResultValidators{}, resultVals) @@ -204,7 +202,7 @@ func TestValidators(t *testing.T) { res, body = request(t, port, "GET", "/validatorsets/1", nil) require.Equal(t, http.StatusOK, res.StatusCode, body) - err = json.Unmarshal([]byte(body), &resultVals) + err = cdc.UnmarshalJSON([]byte(body), &resultVals) require.Nil(t, err, "Couldn't parse validatorset") assert.NotEqual(t, ctypes.ResultValidators{}, resultVals) @@ -221,6 +219,9 @@ func TestCoinSend(t *testing.T) { res, body := request(t, port, "GET", "/accounts/8FA6AB57AD6870F6B5B2E57735F38F2F30E73CB6", nil) require.Equal(t, http.StatusNoContent, res.StatusCode, body) + acc := getAccount(t, sendAddr) + initialBalance := acc.GetCoins() + // create TX receiveAddr, resultTx := doSend(t, port, seed) waitForHeight(resultTx.Height + 1) @@ -230,24 +231,15 @@ func TestCoinSend(t *testing.T) { assert.Equal(t, uint32(0), resultTx.DeliverTx.Code) // query sender - res, body = request(t, port, "GET", "/accounts/"+sendAddr, nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var m auth.BaseAccount - err := json.Unmarshal([]byte(body), &m) - require.Nil(t, err) - coins := m.Coins + acc = getAccount(t, sendAddr) + coins := acc.GetCoins() mycoins := coins[0] assert.Equal(t, coinDenom, mycoins.Denom) - assert.Equal(t, coinAmount-1, mycoins.Amount) + assert.Equal(t, initialBalance[0].Amount-1, mycoins.Amount) // query receiver - res, body = request(t, port, "GET", "/accounts/"+receiveAddr, nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - err = json.Unmarshal([]byte(body), &m) - require.Nil(t, err) - coins = m.Coins + acc = getAccount(t, receiveAddr) + coins = acc.GetCoins() mycoins = coins[0] assert.Equal(t, coinDenom, mycoins.Denom) assert.Equal(t, int64(1), mycoins.Amount) @@ -255,6 +247,9 @@ func TestCoinSend(t *testing.T) { func TestIBCTransfer(t *testing.T) { + acc := getAccount(t, sendAddr) + initialBalance := acc.GetCoins() + // create TX resultTx := doIBCTransfer(t, port, seed) @@ -265,16 +260,11 @@ func TestIBCTransfer(t *testing.T) { assert.Equal(t, uint32(0), resultTx.DeliverTx.Code) // query sender - res, body := request(t, port, "GET", "/accounts/"+sendAddr, nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var m auth.BaseAccount - err := json.Unmarshal([]byte(body), &m) - require.Nil(t, err) - coins := m.Coins + acc = getAccount(t, sendAddr) + coins := acc.GetCoins() mycoins := coins[0] assert.Equal(t, coinDenom, mycoins.Denom) - assert.Equal(t, coinAmount-2, mycoins.Amount) + assert.Equal(t, initialBalance[0].Amount-1, mycoins.Amount) // TODO: query ibc egress packet state } @@ -350,6 +340,7 @@ func startTMAndLCD() (*nm.Node, net.Listener, error) { "staking": dbm.NewMemDB(), } app := bapp.NewBasecoinApp(logger, dbs) + cdc = bapp.MakeCodec() // XXX genesisFile := config.GenesisFile() genDoc, err := tmtypes.GenesisDocFromFile(genesisFile) @@ -371,10 +362,7 @@ func startTMAndLCD() (*nm.Node, net.Listener, error) { if err != nil { return nil, nil, err } - genDoc.AppState = stateBytes - - cdc := wire.NewCodec() - wire.RegisterCrypto(cdc) + genDoc.AppStateJSON = stateBytes // LCD listen address port = fmt.Sprintf("%d", 17377) // XXX @@ -388,12 +376,12 @@ func startTMAndLCD() (*nm.Node, net.Listener, error) { if err != nil { return nil, nil, err } - lcd, err := startLCD(cdc, logger, listenAddr) + lcd, err := startLCD(logger, listenAddr) if err != nil { return nil, nil, err } - waitForStart(cdc) + waitForStart() return node, lcd, nil } @@ -427,7 +415,7 @@ func startTM(cfg *tmcfg.Config, logger log.Logger, genDoc *tmtypes.GenesisDoc, p } // start the LCD. note this blocks! -func startLCD(cdc *wire.Codec, logger log.Logger, listenAddr string) (net.Listener, error) { +func startLCD(logger log.Logger, listenAddr string) (net.Listener, error) { handler := createHandler(cdc) return tmrpc.StartHTTPServer(listenAddr, handler, logger) } @@ -449,6 +437,16 @@ func request(t *testing.T, port, method, path string, payload []byte) (*http.Res return res, string(output) } +func getAccount(t *testing.T, sendAddr string) sdk.Account { + // get the account to get the sequence + res, body := request(t, port, "GET", "/accounts/"+sendAddr, nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + var acc sdk.Account + err := cdc.UnmarshalJSON([]byte(body), &acc) + require.Nil(t, err) + return acc +} + func doSend(t *testing.T, port, seed string) (receiveAddr string, resultTx ctypes.ResultBroadcastTxCommit) { // create receive address @@ -457,20 +455,15 @@ func doSend(t *testing.T, port, seed string) (receiveAddr string, resultTx ctype require.Nil(t, err) receiveAddr = receiveInfo.PubKey.Address().String() - // get the account to get the sequence - res, body := request(t, port, "GET", "/accounts/"+sendAddr, nil) - // require.Equal(t, http.StatusOK, res.StatusCode, body) - acc := auth.BaseAccount{} - err = json.Unmarshal([]byte(body), &acc) - require.Nil(t, err) - sequence := acc.Sequence + acc := getAccount(t, sendAddr) + sequence := acc.GetSequence() // send jsonStr := []byte(fmt.Sprintf(`{ "name":"%s", "password":"%s", "sequence":%d, "amount":[{ "denom": "%s", "amount": 1 }] }`, name, password, sequence, coinDenom)) - res, body = request(t, port, "POST", "/accounts/"+receiveAddr+"/send", jsonStr) + res, body := request(t, port, "POST", "/accounts/"+receiveAddr+"/send", jsonStr) require.Equal(t, http.StatusOK, res.StatusCode, body) - err = json.Unmarshal([]byte(body), &resultTx) + err = cdc.UnmarshalJSON([]byte(body), &resultTx) require.Nil(t, err) return receiveAddr, resultTx @@ -485,19 +478,15 @@ func doIBCTransfer(t *testing.T, port, seed string) (resultTx ctypes.ResultBroad receiveAddr := receiveInfo.PubKey.Address().String() // get the account to get the sequence - res, body := request(t, port, "GET", "/accounts/"+sendAddr, nil) - // require.Equal(t, http.StatusOK, res.StatusCode, body) - acc := auth.BaseAccount{} - err = json.Unmarshal([]byte(body), &acc) - require.Nil(t, err) - sequence := acc.Sequence + acc := getAccount(t, sendAddr) + sequence := acc.GetSequence() // send jsonStr := []byte(fmt.Sprintf(`{ "name":"%s", "password":"%s", "sequence":%d, "amount":[{ "denom": "%s", "amount": 1 }] }`, name, password, sequence, coinDenom)) - res, body = request(t, port, "POST", "/ibc/testchain/"+receiveAddr+"/send", jsonStr) + res, body := request(t, port, "POST", "/ibc/testchain/"+receiveAddr+"/send", jsonStr) require.Equal(t, http.StatusOK, res.StatusCode, body) - err = json.Unmarshal([]byte(body), &resultTx) + err = cdc.UnmarshalJSON([]byte(body), &resultTx) require.Nil(t, err) return resultTx @@ -519,7 +508,7 @@ func waitForHeight(height int64) { } res.Body.Close() - err = json.Unmarshal([]byte(body), &resultBlock) + err = cdc.UnmarshalJSON([]byte(body), &resultBlock) if err != nil { fmt.Println("RES", res) fmt.Println("BODY", string(body)) @@ -534,13 +523,11 @@ func waitForHeight(height int64) { } // wait for 2 blocks -func waitForStart(cdc *wire.Codec) { +func waitForStart() { waitHeight := int64(2) for { time.Sleep(time.Second) - var resultBlock ctypes.ResultBlock - url := fmt.Sprintf("http://localhost:%v%v", port, "/blocks/latest") res, err := http.Get(url) if err != nil { @@ -559,6 +546,7 @@ func waitForStart(cdc *wire.Codec) { } res.Body.Close() + resultBlock := new(ctypes.ResultBlock) err = cdc.UnmarshalJSON([]byte(body), &resultBlock) if err != nil { fmt.Println("RES", res) diff --git a/client/lcd/wire.go b/client/lcd/wire.go new file mode 100644 index 0000000000..f146e102ed --- /dev/null +++ b/client/lcd/wire.go @@ -0,0 +1,12 @@ +package lcd + +import ( + amino "github.com/tendermint/go-amino" + ctypes "github.com/tendermint/tendermint/rpc/core/types" +) + +var cdc = amino.NewCodec() + +func init() { + ctypes.RegisterAmino(cdc) +} diff --git a/client/rpc/block.go b/client/rpc/block.go index f42a15bc2e..6333befde9 100644 --- a/client/rpc/block.go +++ b/client/rpc/block.go @@ -1,7 +1,6 @@ package rpc import ( - "encoding/json" "fmt" "net/http" "strconv" @@ -49,7 +48,7 @@ func getBlock(height *int64) ([]byte, error) { // TODO move maarshalling into cmd/rest functions // output, err := tmwire.MarshalJSON(res) - output, err := json.MarshalIndent(res, "", " ") + output, err := cdc.MarshalJSON(res) if err != nil { return nil, err } diff --git a/client/rpc/status.go b/client/rpc/status.go index 0339a355bc..13325761ef 100644 --- a/client/rpc/status.go +++ b/client/rpc/status.go @@ -1,7 +1,6 @@ package rpc import ( - "encoding/json" "fmt" "net/http" "strconv" @@ -61,7 +60,7 @@ func NodeInfoRequestHandler(w http.ResponseWriter, r *http.Request) { } nodeInfo := status.NodeInfo - output, err := json.MarshalIndent(nodeInfo, "", " ") + output, err := cdc.MarshalJSON(nodeInfo) if err != nil { w.WriteHeader(500) w.Write([]byte(err.Error())) diff --git a/client/rpc/validators.go b/client/rpc/validators.go index 9bf1505dbf..cdaf3be939 100644 --- a/client/rpc/validators.go +++ b/client/rpc/validators.go @@ -1,7 +1,6 @@ package rpc import ( - "encoding/json" "fmt" "net/http" "strconv" @@ -37,7 +36,7 @@ func GetValidators(height *int64) ([]byte, error) { return nil, err } - output, err := json.MarshalIndent(res, "", " ") + output, err := cdc.MarshalJSON(res) if err != nil { return nil, err } diff --git a/client/rpc/wire.go b/client/rpc/wire.go index f454decb37..841366fef1 100644 --- a/client/rpc/wire.go +++ b/client/rpc/wire.go @@ -1,17 +1,12 @@ package rpc import ( - "github.com/cosmos/cosmos-sdk/wire" + amino "github.com/tendermint/go-amino" ctypes "github.com/tendermint/tendermint/rpc/core/types" ) -var cdc *wire.Codec +var cdc = amino.NewCodec() func init() { - cdc = wire.NewCodec() - RegisterWire(cdc) -} - -func RegisterWire(cdc *wire.Codec) { ctypes.RegisterAmino(cdc) } diff --git a/x/auth/commands/account.go b/x/auth/commands/account.go index b87b957699..734285202c 100644 --- a/x/auth/commands/account.go +++ b/x/auth/commands/account.go @@ -11,7 +11,6 @@ import ( "github.com/cosmos/cosmos-sdk/client/context" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" - "github.com/cosmos/cosmos-sdk/x/auth" ) // GetAccountCmd for the auth.BaseAccount type @@ -20,9 +19,9 @@ func GetAccountCmdDefault(storeName string, cdc *wire.Codec) *cobra.Command { } func GetAccountDecoder(cdc *wire.Codec) sdk.AccountDecoder { - return func(accBytes []byte) (sdk.Account, error) { - acct := new(auth.BaseAccount) - err := cdc.UnmarshalBinary(accBytes, &acct) + return func(accBytes []byte) (acct sdk.Account, err error) { + // acct := new(auth.BaseAccount) + err = cdc.UnmarshalBinaryBare(accBytes, &acct) if err != nil { panic(err) } diff --git a/x/auth/rest/query.go b/x/auth/rest/query.go index 5430a77ff2..c401fe47f5 100644 --- a/x/auth/rest/query.go +++ b/x/auth/rest/query.go @@ -2,7 +2,6 @@ package rest import ( "encoding/hex" - "encoding/json" "fmt" "net/http" @@ -56,7 +55,7 @@ func QueryAccountRequestHandler(storeName string, cdc *wire.Codec, decoder sdk.A } // print out whole account - output, err := json.MarshalIndent(account, "", " ") + output, err := cdc.MarshalJSON(account) if err != nil { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(fmt.Sprintf("Could't marshall query result. Error: %s", err.Error()))) diff --git a/x/ibc/rest/transfer.go b/x/ibc/rest/transfer.go index fceac55677..1317730e7f 100644 --- a/x/ibc/rest/transfer.go +++ b/x/ibc/rest/transfer.go @@ -2,7 +2,6 @@ package rest import ( "encoding/hex" - "encoding/json" "io/ioutil" "net/http" @@ -43,7 +42,7 @@ func TransferRequestHandler(cdc *wire.Codec, kb keys.Keybase) func(http.Response w.Write([]byte(err.Error())) return } - err = json.Unmarshal(body, &m) + err = cdc.UnmarshalJSON(body, &m) if err != nil { w.WriteHeader(http.StatusBadRequest) w.Write([]byte(err.Error())) @@ -86,7 +85,7 @@ func TransferRequestHandler(cdc *wire.Codec, kb keys.Keybase) func(http.Response return } - output, err := json.MarshalIndent(res, "", " ") + output, err := cdc.MarshalJSON(res) if err != nil { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(err.Error())) From 9b40cf184f6b05594e7e5064d88afc18a7d3e525 Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Sun, 8 Apr 2018 00:58:03 +0200 Subject: [PATCH 16/50] added PrefixBytesTest --- types/store_test.go | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 types/store_test.go diff --git a/types/store_test.go b/types/store_test.go new file mode 100644 index 0000000000..2fd9441852 --- /dev/null +++ b/types/store_test.go @@ -0,0 +1,28 @@ +package types + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestPrefixEndBytes(t *testing.T) { + assert := assert.New(t) + + var testCases = []struct { + prefix []byte + expected []byte + }{ + {[]byte{byte(55), byte(255), byte(255), byte(0)}, []byte{byte(55), byte(255), byte(255), byte(1)}}, + {[]byte{byte(55), byte(255), byte(255), byte(15)}, []byte{byte(55), byte(255), byte(255), byte(16)}}, + {[]byte{byte(55), byte(200), byte(255)}, []byte{byte(55), byte(201)}}, + {[]byte{byte(55), byte(255), byte(255)}, []byte{byte(56)}}, + {[]byte{byte(255), byte(255), byte(255)}, nil}, + {nil, nil}, + } + + for _, test := range testCases { + end := PrefixEndBytes(test.prefix) + assert.Equal(test.expected, end) + } +} From cda03dd87478699861d6be91476401d2a08c73a3 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Mon, 9 Apr 2018 16:42:02 +0300 Subject: [PATCH 17/50] update deps --- Gopkg.lock | 17 ++++++++--------- Gopkg.toml | 11 +++++------ 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index 620d30d6d8..bb083c8ace 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -261,8 +261,8 @@ "server", "types" ] - revision = "c62aed95f2ce399ec815b0cafe478af002cdc4e6" - version = "v0.10.3-dev" + revision = "78a8905690ef54f9d57e3b2b0ee7ad3a04ef3f1f" + version = "v0.10.3" [[projects]] branch = "master" @@ -289,8 +289,8 @@ "keys/words", "keys/words/wordlist" ] - revision = "5d5f580f49ca66c13400938c64334186068c8b7c" - version = "v0.6.1" + revision = "915416979bf70efa4bcbf1c6cd5d64c5fff9fc19" + version = "v0.6.2" [[projects]] name = "github.com/tendermint/go-wire" @@ -305,7 +305,6 @@ version = "v0.7.0" [[projects]] - branch = "bucky/aminoify" name = "github.com/tendermint/tendermint" packages = [ "blockchain", @@ -343,7 +342,8 @@ "types/priv_validator", "version" ] - revision = "466c3ab1c79c1e9856aeea80c9e11c31219d11f0" + revision = "dcd00b0e688f133b9634aee513f8bf856e659356" + version = "v0.19.0-rc4" [[projects]] name = "github.com/tendermint/tmlibs" @@ -361,7 +361,7 @@ "pubsub/query" ] revision = "2e24b64fc121dcdf1cabceab8dc2f7257675483c" - version = "0.8.1" + version = "v0.8.1" [[projects]] branch = "master" @@ -448,7 +448,6 @@ "transport" ] revision = "5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e" - source = "github.com/grpc/grpc-go" version = "v1.7.5" [[projects]] @@ -460,6 +459,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "d81bbe5d23b9bc1e1829c207a57857c40957c4c0dac6c70f5af04e0930cbd652" + inputs-digest = "ad499422ee60cf89fd9d61e232e33d0a17f7b43e0ff7aff0c0a22949901096e8" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index d8973a4c43..59119b1fe8 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -54,15 +54,15 @@ [[constraint]] name = "github.com/tendermint/abci" - version = "~0.10.2" + version = "~0.10.3" [[constraint]] name = "github.com/tendermint/go-crypto" - version = "0.6.1" + version = "~0.6.2" [[constraint]] name = "github.com/tendermint/go-amino" - version = "0.9.6" + version = "~0.9.6" [[constraint]] name = "github.com/tendermint/iavl" @@ -70,10 +70,9 @@ [[constraint]] name = "github.com/tendermint/tendermint" - #version = "0.19.0-rc2" - branch = "bucky/aminoify" + version = "0.19.0-rc4" -[[override]] +[[constraint]] name = "github.com/tendermint/tmlibs" version = "~0.8.1" From 13521b3f77c75613173fcff0bb2cbc20bc28cd0d Mon Sep 17 00:00:00 2001 From: Adrian Brink Date: Mon, 9 Apr 2018 17:33:53 +0200 Subject: [PATCH 18/50] Remove deadcode --- x/bank/commands/sendtx.go | 28 ---------------------------- 1 file changed, 28 deletions(-) diff --git a/x/bank/commands/sendtx.go b/x/bank/commands/sendtx.go index ee4625eac2..aa0e17a910 100644 --- a/x/bank/commands/sendtx.go +++ b/x/bank/commands/sendtx.go @@ -7,12 +7,10 @@ import ( "github.com/spf13/cobra" "github.com/spf13/viper" - "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/context" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" "github.com/cosmos/cosmos-sdk/x/bank" - cryptokeys "github.com/tendermint/go-crypto/keys" ) const ( @@ -80,29 +78,3 @@ func BuildMsg(from sdk.Address, to sdk.Address, coins sdk.Coins) sdk.Msg { msg := bank.NewSendMsg([]bank.Input{input}, []bank.Output{output}) return msg } - -func (c Commander) SignMessage(msg sdk.Msg, kb cryptokeys.Keybase, accountName string, password string) ([]byte, error) { - // sign and build - bz := msg.GetSignBytes() - sig, pubkey, err := kb.Sign(accountName, password, bz) - if err != nil { - return nil, err - } - sigs := []sdk.StdSignature{{ - PubKey: pubkey, - Signature: sig, - Sequence: viper.GetInt64(client.FlagName), - }} - - // TODO: fees - var fee sdk.StdFee - - // marshal bytes - tx := sdk.NewStdTx(msg, fee, sigs) - - txBytes, err := c.Cdc.MarshalBinary(tx) - if err != nil { - return nil, err - } - return txBytes, nil -} From 5b32a3bad22a2e8111fa1ae1c1209bc35b57145a Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Mon, 9 Apr 2018 20:32:19 +0300 Subject: [PATCH 19/50] MarshalJSONIndent --- server/init.go | 7 ++++--- wire/wire.go | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/server/init.go b/server/init.go index 09d97338e8..8c82d2796d 100644 --- a/server/init.go +++ b/server/init.go @@ -6,6 +6,7 @@ import ( "io/ioutil" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/wire" "github.com/spf13/cobra" "github.com/tendermint/go-crypto/keys" @@ -97,7 +98,7 @@ func (c initCmd) run(cmd *cobra.Command, args []string) error { return err } testnetInfo.NodeID = nodeKey.ID() - out, err := json.MarshalIndent(testnetInfo, "", " ") + out, err := wire.MarshalJSONIndent(cdc, testnetInfo) if err != nil { return err } @@ -194,13 +195,13 @@ func addGenesisState(filename string, appState json.RawMessage) error { } var doc GenesisDoc - err = json.Unmarshal(bz, &doc) + err = cdc.UnmarshalJSON(bz, &doc) if err != nil { return err } doc["app_state"] = appState - out, err := json.MarshalIndent(doc, "", " ") + out, err := wire.MarshalJSONIndent(cdc, doc) if err != nil { return err } diff --git a/wire/wire.go b/wire/wire.go index 9c366b6fb8..32c82a6763 100644 --- a/wire/wire.go +++ b/wire/wire.go @@ -1,6 +1,9 @@ package wire import ( + "bytes" + "encoding/json" + "github.com/tendermint/go-amino" "github.com/tendermint/go-crypto" ) @@ -15,3 +18,17 @@ func NewCodec() *Codec { func RegisterCrypto(cdc *Codec) { crypto.RegisterAmino(cdc) } + +func MarshalJSONIndent(cdc *Codec, obj interface{}) ([]byte, error) { + bz, err := cdc.MarshalJSON(obj) + if err != nil { + return nil, err + } + + var out bytes.Buffer + err = json.Indent(&out, bz, "", " ") + if err != nil { + return nil, err + } + return out.Bytes(), nil +} From 9e2667b496aaaef4a906236edbf4f417ca1cb19b Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Mon, 9 Apr 2018 21:05:03 +0300 Subject: [PATCH 20/50] basecoin/types: UnmarshalBinaryBare --- examples/basecoin/types/account.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/basecoin/types/account.go b/examples/basecoin/types/account.go index b9b735a27f..e6eb5d7b46 100644 --- a/examples/basecoin/types/account.go +++ b/examples/basecoin/types/account.go @@ -29,7 +29,7 @@ func GetAccountDecoder(cdc *wire.Codec) sdk.AccountDecoder { return nil, sdk.ErrTxDecode("accBytes are empty") } acct := new(AppAccount) - err = cdc.UnmarshalBinary(accBytes, &acct) + err = cdc.UnmarshalBinaryBare(accBytes, &acct) if err != nil { panic(err) } From f5c285f5ee63756917d056d5d27e7cec8b50d2fa Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Mon, 9 Apr 2018 23:18:56 +0300 Subject: [PATCH 21/50] more MarshalJSONIndent --- baseapp/baseapp.go | 9 --------- x/auth/commands/account.go | 3 +-- x/stake/commands/query.go | 9 ++++----- 3 files changed, 5 insertions(+), 16 deletions(-) diff --git a/baseapp/baseapp.go b/baseapp/baseapp.go index dfbb821fe8..74b23bfb05 100644 --- a/baseapp/baseapp.go +++ b/baseapp/baseapp.go @@ -1,7 +1,6 @@ package baseapp import ( - "encoding/json" "fmt" "runtime/debug" @@ -241,14 +240,6 @@ func (app *BaseApp) InitChain(req abci.RequestInitChain) (res abci.ResponseInitC app.setDeliverState(abci.Header{}) app.initChainer(app.deliverState.ctx, req) // no error - // Initialize module genesis state - genesisState := new(map[string]json.RawMessage) - err := json.Unmarshal(req.AppStateBytes, genesisState) - if err != nil { - // TODO Return something intelligent - panic(err) - } - // NOTE: we don't commit, but BeginBlock for block 1 // starts from this deliverState diff --git a/x/auth/commands/account.go b/x/auth/commands/account.go index 734285202c..56f441f35d 100644 --- a/x/auth/commands/account.go +++ b/x/auth/commands/account.go @@ -2,7 +2,6 @@ package commands import ( "encoding/hex" - "encoding/json" "fmt" "github.com/pkg/errors" @@ -77,7 +76,7 @@ func (c commander) getAccountCmd(cmd *cobra.Command, args []string) error { } // print out whole account - output, err := json.MarshalIndent(account, "", " ") + output, err := wire.MarshalJSONIndent(c.cdc, account) if err != nil { return err } diff --git a/x/stake/commands/query.go b/x/stake/commands/query.go index 7bc6a8aa94..8cbb877ce9 100644 --- a/x/stake/commands/query.go +++ b/x/stake/commands/query.go @@ -2,7 +2,6 @@ package commands import ( "encoding/hex" - "encoding/json" "fmt" "github.com/spf13/cobra" @@ -59,7 +58,7 @@ func GetCmdQueryCandidates(cdc *wire.Codec, storeName string) *cobra.Command { if err != nil { return err } - output, err := json.MarshalIndent(candidates, "", " ") + output, err := wire.MarshalJSONIndent(cdc, candidates) if err != nil { return err } @@ -101,7 +100,7 @@ func GetCmdQueryCandidate(cdc *wire.Codec, storeName string) *cobra.Command { if err != nil { return err } - output, err := json.MarshalIndent(candidate, "", " ") + output, err := wire.MarshalJSONIndent(cdc, candidate) if err != nil { return err } @@ -149,7 +148,7 @@ func GetCmdQueryDelegatorBond(cdc *wire.Codec, storeName string) *cobra.Command if err != nil { return err } - output, err := json.MarshalIndent(bond, "", " ") + output, err := wire.MarshalJSONIndent(cdc, bond) if err != nil { return err } @@ -193,7 +192,7 @@ func GetCmdQueryDelegatorBonds(cdc *wire.Codec, storeName string) *cobra.Command if err != nil { return err } - output, err := json.MarshalIndent(candidates, "", " ") + output, err := wire.MarshalJSONIndent(cdc, candidates) if err != nil { return err } From 69448f90e5f796146ce343241431bc5b96015e17 Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Tue, 10 Apr 2018 01:32:04 +0200 Subject: [PATCH 22/50] added just FF byte --- types/store_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/types/store_test.go b/types/store_test.go index 2fd9441852..43dd1f5d3f 100644 --- a/types/store_test.go +++ b/types/store_test.go @@ -18,6 +18,7 @@ func TestPrefixEndBytes(t *testing.T) { {[]byte{byte(55), byte(200), byte(255)}, []byte{byte(55), byte(201)}}, {[]byte{byte(55), byte(255), byte(255)}, []byte{byte(56)}}, {[]byte{byte(255), byte(255), byte(255)}, nil}, + {[]byte{byte(255)}, nil}, {nil, nil}, } From 0be655b122e0505fd8353a8f0988618d6bf5ae56 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Fri, 6 Apr 2018 18:08:29 +0200 Subject: [PATCH 23/50] Automatically determine chainID, throw error if not provided (closes #810) --- client/context/viper.go | 22 +++++++++++++++++++++- client/core/core.go | 3 +++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/client/context/viper.go b/client/context/viper.go index 750a37c616..4264776df0 100644 --- a/client/context/viper.go +++ b/client/context/viper.go @@ -1,9 +1,13 @@ package context import ( + "encoding/json" "github.com/spf13/viper" + "io/ioutil" + tcmd "github.com/tendermint/tendermint/cmd/tendermint/commands" rpcclient "github.com/tendermint/tendermint/rpc/client" + tmtypes "github.com/tendermint/tendermint/types" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/core" @@ -15,8 +19,24 @@ func NewCoreContextFromViper() core.CoreContext { if nodeURI != "" { rpc = rpcclient.NewHTTP(nodeURI, "/websocket") } + chainID := viper.GetString(client.FlagChainID) + // if chain ID is not specified manually, read chain ID from genesis file if present + if chainID == "" { + cfg, err := tcmd.ParseConfig() + if err == nil { + genesisFile := cfg.GenesisFile() + bz, err := ioutil.ReadFile(genesisFile) + if err == nil { + var doc tmtypes.GenesisDoc + err = json.Unmarshal(bz, &doc) + if err == nil { + chainID = doc.ChainID + } + } + } + } return core.CoreContext{ - ChainID: viper.GetString(client.FlagChainID), + ChainID: chainID, Height: viper.GetInt64(client.FlagHeight), TrustNode: viper.GetBool(client.FlagTrustNode), FromAddressName: viper.GetString(client.FlagName), diff --git a/client/core/core.go b/client/core/core.go index a5c7b340c7..a39472c040 100644 --- a/client/core/core.go +++ b/client/core/core.go @@ -91,6 +91,9 @@ func (ctx CoreContext) SignAndBuild(name, passphrase string, msg sdk.Msg, cdc *w // build the Sign Messsage from the Standard Message chainID := ctx.ChainID + if chainID == "" { + return nil, errors.Errorf("Chain ID required but not specified") + } sequence := ctx.Sequence signMsg := sdk.StdSignMsg{ ChainID: chainID, From ec98545a1b55bd8b70b9b95c1ead5b345a05b319 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Mon, 9 Apr 2018 16:06:24 +0200 Subject: [PATCH 24/50] Default to next sequence number (closes #807) --- client/context/viper.go | 2 ++ client/core/context.go | 14 ++++++++++++++ client/core/core.go | 18 ++++++++++++++++++ x/bank/commands/sendtx.go | 17 ++++++++++++++++- 4 files changed, 50 insertions(+), 1 deletion(-) diff --git a/client/context/viper.go b/client/context/viper.go index 4264776df0..9a1cd5d0d4 100644 --- a/client/context/viper.go +++ b/client/context/viper.go @@ -43,5 +43,7 @@ func NewCoreContextFromViper() core.CoreContext { NodeURI: nodeURI, Sequence: viper.GetInt64(client.FlagSequence), Client: rpc, + Decoder: nil, + AccountStore: "main", } } diff --git a/client/core/context.go b/client/core/context.go index 3d7f400a8e..d56af5a816 100644 --- a/client/core/context.go +++ b/client/core/context.go @@ -2,6 +2,8 @@ package core import ( rpcclient "github.com/tendermint/tendermint/rpc/client" + + sdk "github.com/cosmos/cosmos-sdk/types" ) type CoreContext struct { @@ -12,6 +14,8 @@ type CoreContext struct { FromAddressName string Sequence int64 Client rpcclient.Client + Decoder sdk.AccountDecoder + AccountStore string } func (c CoreContext) WithChainID(chainID string) CoreContext { @@ -48,3 +52,13 @@ func (c CoreContext) WithClient(client rpcclient.Client) CoreContext { c.Client = client return c } + +func (c CoreContext) WithDecoder(decoder sdk.AccountDecoder) CoreContext { + c.Decoder = decoder + return c +} + +func (c CoreContext) WithAccountStore(accountStore string) CoreContext { + c.AccountStore = accountStore + return c +} diff --git a/client/core/core.go b/client/core/core.go index a39472c040..e28e6c3928 100644 --- a/client/core/core.go +++ b/client/core/core.go @@ -140,6 +140,24 @@ func (ctx CoreContext) SignBuildBroadcast(name string, msg sdk.Msg, cdc *wire.Co return ctx.BroadcastTx(txBytes) } +func (c CoreContext) NextSequence(address []byte) (int64, error) { + if c.Decoder == nil { + return 0, errors.New("AccountDecoder required but not provided") + } + + res, err := c.Query(address, c.AccountStore) + if err != nil { + return 0, err + } + + account, err := c.Decoder(res) + if err != nil { + panic(err) + } + + return account.GetSequence(), nil +} + // get passphrase from std input func (ctx CoreContext) GetPassphraseFromStdin(name string) (pass string, err error) { buf := client.BufferStdin() diff --git a/x/bank/commands/sendtx.go b/x/bank/commands/sendtx.go index aa0e17a910..17bf268700 100644 --- a/x/bank/commands/sendtx.go +++ b/x/bank/commands/sendtx.go @@ -10,6 +10,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/context" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" + authcmd "github.com/cosmos/cosmos-sdk/x/auth/commands" "github.com/cosmos/cosmos-sdk/x/bank" ) @@ -36,7 +37,7 @@ type Commander struct { } func (c Commander) sendTxCmd(cmd *cobra.Command, args []string) error { - ctx := context.NewCoreContextFromViper() + ctx := context.NewCoreContextFromViper().WithDecoder(authcmd.GetAccountDecoder(c.Cdc)) // get the from address from, err := ctx.GetFromAddress() @@ -62,6 +63,20 @@ func (c Commander) sendTxCmd(cmd *cobra.Command, args []string) error { // build message msg := BuildMsg(from, to, coins) + // default to next sequence number if none provided + if viper.GetInt64(client.FlagSequence) == 0 { + from, err := ctx.GetFromAddress() + if err != nil { + return err + } + seq, err := ctx.NextSequence(from) + if err != nil { + return err + } + fmt.Printf("Defaulting to next sequence number: %d\n", seq) + ctx = ctx.WithSequence(seq) + } + // build and sign the transaction, then broadcast to Tendermint res, err := ctx.SignBuildBroadcast(ctx.FromAddressName, msg, c.Cdc) if err != nil { From bd626ba94e4f0c113fac29a5702b552a5cf43f34 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Mon, 9 Apr 2018 17:59:01 +0200 Subject: [PATCH 25/50] Helper function --- client/context/viper.go | 16 ++++++++++++++++ x/bank/commands/sendtx.go | 14 +++----------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/client/context/viper.go b/client/context/viper.go index 9a1cd5d0d4..115311f11d 100644 --- a/client/context/viper.go +++ b/client/context/viper.go @@ -2,6 +2,7 @@ package context import ( "encoding/json" + "fmt" "github.com/spf13/viper" "io/ioutil" @@ -47,3 +48,18 @@ func NewCoreContextFromViper() core.CoreContext { AccountStore: "main", } } + +// Automatically set sequence number +func AutoSequence(ctx core.CoreContext) (core.CoreContext, error) { + from, err := ctx.GetFromAddress() + if err != nil { + return ctx, err + } + seq, err := ctx.NextSequence(from) + if err != nil { + return ctx, err + } + fmt.Printf("Defaulting to next sequence number: %d\n", seq) + ctx = ctx.WithSequence(seq) + return ctx, nil +} diff --git a/x/bank/commands/sendtx.go b/x/bank/commands/sendtx.go index 17bf268700..a37e969a63 100644 --- a/x/bank/commands/sendtx.go +++ b/x/bank/commands/sendtx.go @@ -64,17 +64,9 @@ func (c Commander) sendTxCmd(cmd *cobra.Command, args []string) error { msg := BuildMsg(from, to, coins) // default to next sequence number if none provided - if viper.GetInt64(client.FlagSequence) == 0 { - from, err := ctx.GetFromAddress() - if err != nil { - return err - } - seq, err := ctx.NextSequence(from) - if err != nil { - return err - } - fmt.Printf("Defaulting to next sequence number: %d\n", seq) - ctx = ctx.WithSequence(seq) + ctx, err = context.AutoSequence(ctx) + if err != nil { + return err } // build and sign the transaction, then broadcast to Tendermint From 7383c99026215ce17409bbd3507a3240df8c329a Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Mon, 9 Apr 2018 18:14:33 +0200 Subject: [PATCH 26/50] Add AutoSequence to all transaction-sending commands --- client/context/viper.go | 20 +++++++------ examples/democoin/x/cool/commands/tx.go | 17 ++++++++++-- examples/democoin/x/pow/commands/tx.go | 9 +++++- x/ibc/commands/ibctx.go | 9 +++++- x/simplestake/commands/commands.go | 10 ++++++- x/stake/commands/tx.go | 37 ++++++++++++++++++++++--- 6 files changed, 84 insertions(+), 18 deletions(-) diff --git a/client/context/viper.go b/client/context/viper.go index 115311f11d..acc6b391c7 100644 --- a/client/context/viper.go +++ b/client/context/viper.go @@ -51,15 +51,17 @@ func NewCoreContextFromViper() core.CoreContext { // Automatically set sequence number func AutoSequence(ctx core.CoreContext) (core.CoreContext, error) { - from, err := ctx.GetFromAddress() - if err != nil { - return ctx, err + if !viper.IsSet(client.FlagSequence) { + from, err := ctx.GetFromAddress() + if err != nil { + return ctx, err + } + seq, err := ctx.NextSequence(from) + if err != nil { + return ctx, err + } + fmt.Printf("Defaulting to next sequence number: %d\n", seq) + ctx = ctx.WithSequence(seq) } - seq, err := ctx.NextSequence(from) - if err != nil { - return ctx, err - } - fmt.Printf("Defaulting to next sequence number: %d\n", seq) - ctx = ctx.WithSequence(seq) return ctx, nil } diff --git a/examples/democoin/x/cool/commands/tx.go b/examples/democoin/x/cool/commands/tx.go index 8deaac405d..8ce009f0ff 100644 --- a/examples/democoin/x/cool/commands/tx.go +++ b/examples/democoin/x/cool/commands/tx.go @@ -10,6 +10,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/context" "github.com/cosmos/cosmos-sdk/wire" + authcmd "github.com/cosmos/cosmos-sdk/x/auth/commands" "github.com/cosmos/cosmos-sdk/examples/democoin/x/cool" ) @@ -24,7 +25,7 @@ func QuizTxCmd(cdc *wire.Codec) *cobra.Command { return errors.New("You must provide an answer") } - ctx := context.NewCoreContextFromViper() + ctx := context.NewCoreContextFromViper().WithDecoder(authcmd.GetAccountDecoder(cdc)) // get the from address from the name flag from, err := ctx.GetFromAddress() @@ -38,6 +39,12 @@ func QuizTxCmd(cdc *wire.Codec) *cobra.Command { // get account name name := viper.GetString(client.FlagName) + // default to next sequence number if none provided + ctx, err = context.AutoSequence(ctx) + if err != nil { + return err + } + // build and sign the transaction, then broadcast to Tendermint res, err := ctx.SignBuildBroadcast(name, msg, cdc) if err != nil { @@ -60,7 +67,7 @@ func SetTrendTxCmd(cdc *wire.Codec) *cobra.Command { return errors.New("You must provide an answer") } - ctx := context.NewCoreContextFromViper() + ctx := context.NewCoreContextFromViper().WithDecoder(authcmd.GetAccountDecoder(cdc)) // get the from address from the name flag from, err := ctx.GetFromAddress() @@ -71,6 +78,12 @@ func SetTrendTxCmd(cdc *wire.Codec) *cobra.Command { // get account name name := viper.GetString(client.FlagName) + // default to next sequence number if none provided + ctx, err = context.AutoSequence(ctx) + if err != nil { + return err + } + // create the message msg := cool.NewSetTrendMsg(from, args[0]) diff --git a/examples/democoin/x/pow/commands/tx.go b/examples/democoin/x/pow/commands/tx.go index badbe39092..abd5d27ebf 100644 --- a/examples/democoin/x/pow/commands/tx.go +++ b/examples/democoin/x/pow/commands/tx.go @@ -11,6 +11,7 @@ import ( "github.com/cosmos/cosmos-sdk/examples/democoin/x/pow" "github.com/cosmos/cosmos-sdk/wire" + authcmd "github.com/cosmos/cosmos-sdk/x/auth/commands" ) func MineCmd(cdc *wire.Codec) *cobra.Command { @@ -24,7 +25,7 @@ func MineCmd(cdc *wire.Codec) *cobra.Command { // get from address and parse arguments - ctx := context.NewCoreContextFromViper() + ctx := context.NewCoreContextFromViper().WithDecoder(authcmd.GetAccountDecoder(cdc)) from, err := ctx.GetFromAddress() if err != nil { @@ -53,6 +54,12 @@ func MineCmd(cdc *wire.Codec) *cobra.Command { // get account name name := ctx.FromAddressName + // default to next sequence number if none provided + ctx, err = context.AutoSequence(ctx) + if err != nil { + return err + } + // build and sign the transaction, then broadcast to Tendermint res, err := ctx.SignBuildBroadcast(name, msg, cdc) if err != nil { diff --git a/x/ibc/commands/ibctx.go b/x/ibc/commands/ibctx.go index 689a983181..ee0ac02eea 100644 --- a/x/ibc/commands/ibctx.go +++ b/x/ibc/commands/ibctx.go @@ -13,6 +13,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" wire "github.com/cosmos/cosmos-sdk/wire" + authcmd "github.com/cosmos/cosmos-sdk/x/auth/commands" "github.com/cosmos/cosmos-sdk/x/ibc" ) @@ -39,7 +40,7 @@ type sendCommander struct { } func (c sendCommander) sendIBCTransfer(cmd *cobra.Command, args []string) error { - ctx := context.NewCoreContextFromViper() + ctx := context.NewCoreContextFromViper().WithDecoder(authcmd.GetAccountDecoder(c.cdc)) // get the from address from, err := ctx.GetFromAddress() @@ -53,6 +54,12 @@ func (c sendCommander) sendIBCTransfer(cmd *cobra.Command, args []string) error return err } + // default to next sequence number if none provided + ctx, err = context.AutoSequence(ctx) + if err != nil { + return err + } + // get password res, err := ctx.SignBuildBroadcast(ctx.FromAddressName, msg, c.cdc) if err != nil { diff --git a/x/simplestake/commands/commands.go b/x/simplestake/commands/commands.go index b2a057beed..0e8a7a9bb4 100644 --- a/x/simplestake/commands/commands.go +++ b/x/simplestake/commands/commands.go @@ -12,6 +12,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/context" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" + authcmd "github.com/cosmos/cosmos-sdk/x/auth/commands" "github.com/cosmos/cosmos-sdk/x/simplestake" ) @@ -94,7 +95,14 @@ func (co commander) unbondTxCmd(cmd *cobra.Command, args []string) error { } func (co commander) sendMsg(msg sdk.Msg) error { - ctx := context.NewCoreContextFromViper() + ctx := context.NewCoreContextFromViper().WithDecoder(authcmd.GetAccountDecoder(co.cdc)) + + // default to next sequence number if none provided + ctx, err := context.AutoSequence(ctx) + if err != nil { + return err + } + res, err := ctx.SignBuildBroadcast(ctx.FromAddressName, msg, co.cdc) if err != nil { return err diff --git a/x/stake/commands/tx.go b/x/stake/commands/tx.go index d1a399e19c..1b9063a65b 100644 --- a/x/stake/commands/tx.go +++ b/x/stake/commands/tx.go @@ -14,6 +14,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/context" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" + authcmd "github.com/cosmos/cosmos-sdk/x/auth/commands" "github.com/cosmos/cosmos-sdk/x/stake" ) @@ -92,7 +93,14 @@ func GetCmdDeclareCandidacy(cdc *wire.Codec) *cobra.Command { msg := stake.NewMsgDeclareCandidacy(candidateAddr, pk, amount, description) // build and sign the transaction, then broadcast to Tendermint - ctx := context.NewCoreContextFromViper() + ctx := context.NewCoreContextFromViper().WithDecoder(authcmd.GetAccountDecoder(cdc)) + + // default to next sequence number if none provided + ctx, err = context.AutoSequence(ctx) + if err != nil { + return err + } + res, err := ctx.SignBuildBroadcast(ctx.FromAddressName, msg, cdc) if err != nil { return err @@ -129,7 +137,14 @@ func GetCmdEditCandidacy(cdc *wire.Codec) *cobra.Command { msg := stake.NewMsgEditCandidacy(candidateAddr, description) // build and sign the transaction, then broadcast to Tendermint - ctx := context.NewCoreContextFromViper() + ctx := context.NewCoreContextFromViper().WithDecoder(authcmd.GetAccountDecoder(cdc)) + + // default to next sequence number if none provided + ctx, err = context.AutoSequence(ctx) + if err != nil { + return err + } + res, err := ctx.SignBuildBroadcast(ctx.FromAddressName, msg, cdc) if err != nil { return err @@ -165,7 +180,14 @@ func GetCmdDelegate(cdc *wire.Codec) *cobra.Command { msg := stake.NewMsgDelegate(delegatorAddr, candidateAddr, amount) // build and sign the transaction, then broadcast to Tendermint - ctx := context.NewCoreContextFromViper() + ctx := context.NewCoreContextFromViper().WithDecoder(authcmd.GetAccountDecoder(cdc)) + + // default to next sequence number if none provided + ctx, err = context.AutoSequence(ctx) + if err != nil { + return err + } + res, err := ctx.SignBuildBroadcast(ctx.FromAddressName, msg, cdc) if err != nil { return err @@ -212,7 +234,14 @@ func GetCmdUnbond(cdc *wire.Codec) *cobra.Command { msg := stake.NewMsgUnbond(delegatorAddr, candidateAddr, sharesStr) // build and sign the transaction, then broadcast to Tendermint - ctx := context.NewCoreContextFromViper() + ctx := context.NewCoreContextFromViper().WithDecoder(authcmd.GetAccountDecoder(cdc)) + + // default to next sequence number if none provided + ctx, err = context.AutoSequence(ctx) + if err != nil { + return err + } + res, err := ctx.SignBuildBroadcast(ctx.FromAddressName, msg, cdc) if err != nil { return err From c7b680a545937ba8b614eb24f09c77f0a33aa06f Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Tue, 10 Apr 2018 11:15:34 +0200 Subject: [PATCH 27/50] Address PR comments --- client/context/viper.go | 63 +++++++++++++++---------- client/core/context.go | 9 ++++ examples/democoin/x/cool/commands/tx.go | 4 +- examples/democoin/x/pow/commands/tx.go | 2 +- x/bank/commands/sendtx.go | 2 +- x/ibc/commands/ibctx.go | 2 +- x/simplestake/commands/commands.go | 2 +- x/stake/commands/tx.go | 8 ++-- 8 files changed, 57 insertions(+), 35 deletions(-) diff --git a/client/context/viper.go b/client/context/viper.go index acc6b391c7..193fe9baa6 100644 --- a/client/context/viper.go +++ b/client/context/viper.go @@ -14,6 +14,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/core" ) +// NewCoreContextFromViper - return a new context with parameters from the command line func NewCoreContextFromViper() core.CoreContext { nodeURI := viper.GetString(client.FlagNode) var rpc rpcclient.Client @@ -21,19 +22,11 @@ func NewCoreContextFromViper() core.CoreContext { rpc = rpcclient.NewHTTP(nodeURI, "/websocket") } chainID := viper.GetString(client.FlagChainID) - // if chain ID is not specified manually, read chain ID from genesis file if present + // if chain ID is not specified manually, read default chain ID if chainID == "" { - cfg, err := tcmd.ParseConfig() - if err == nil { - genesisFile := cfg.GenesisFile() - bz, err := ioutil.ReadFile(genesisFile) - if err == nil { - var doc tmtypes.GenesisDoc - err = json.Unmarshal(bz, &doc) - if err == nil { - chainID = doc.ChainID - } - } + def, err := defaultChainID() + if err != nil { + chainID = def } } return core.CoreContext{ @@ -49,19 +42,39 @@ func NewCoreContextFromViper() core.CoreContext { } } -// Automatically set sequence number -func AutoSequence(ctx core.CoreContext) (core.CoreContext, error) { - if !viper.IsSet(client.FlagSequence) { - from, err := ctx.GetFromAddress() - if err != nil { - return ctx, err - } - seq, err := ctx.NextSequence(from) - if err != nil { - return ctx, err - } - fmt.Printf("Defaulting to next sequence number: %d\n", seq) - ctx = ctx.WithSequence(seq) +// read chain ID from genesis file, if present +func defaultChainID() (string, error) { + cfg, err := tcmd.ParseConfig() + if err != nil { + return "", err } + genesisFile := cfg.GenesisFile() + bz, err := ioutil.ReadFile(genesisFile) + if err != nil { + return "", err + } + var doc tmtypes.GenesisDoc + err = json.Unmarshal(bz, &doc) + if err != nil { + return "", err + } + return doc.ChainID, nil +} + +// EnsureSequence - automatically set sequence number if none provided +func EnsureSequence(ctx core.CoreContext) (core.CoreContext, error) { + if viper.IsSet(client.FlagSequence) { + return ctx, nil + } + from, err := ctx.GetFromAddress() + if err != nil { + return ctx, err + } + seq, err := ctx.NextSequence(from) + if err != nil { + return ctx, err + } + fmt.Printf("Defaulting to next sequence number: %d\n", seq) + ctx = ctx.WithSequence(seq) return ctx, nil } diff --git a/client/core/context.go b/client/core/context.go index d56af5a816..34376ece4f 100644 --- a/client/core/context.go +++ b/client/core/context.go @@ -18,46 +18,55 @@ type CoreContext struct { AccountStore string } +// WithChainID - return a copy of the context with an updated chainID func (c CoreContext) WithChainID(chainID string) CoreContext { c.ChainID = chainID return c } +// WithHeight - eturn a copy of the context with an updated height func (c CoreContext) WithHeight(height int64) CoreContext { c.Height = height return c } +// WithTrustNode - return a copy of the context with an updated TrustNode flag func (c CoreContext) WithTrustNode(trustNode bool) CoreContext { c.TrustNode = trustNode return c } +// WithNodeURI - return a copy of the context with an updated node URI func (c CoreContext) WithNodeURI(nodeURI string) CoreContext { c.NodeURI = nodeURI return c } +// WithFromAddressName - return a copy of the context with an updated from address func (c CoreContext) WithFromAddressName(fromAddressName string) CoreContext { c.FromAddressName = fromAddressName return c } +// WithSequence - return a copy of the context with an updated sequence number func (c CoreContext) WithSequence(sequence int64) CoreContext { c.Sequence = sequence return c } +// WithClient - return a copy of the context with an updated RPC client instance func (c CoreContext) WithClient(client rpcclient.Client) CoreContext { c.Client = client return c } +// WithDecoder - return a copy of the context with an updated Decoder func (c CoreContext) WithDecoder(decoder sdk.AccountDecoder) CoreContext { c.Decoder = decoder return c } +// WithAccountStore - return a copy of the context with an updated AccountStore func (c CoreContext) WithAccountStore(accountStore string) CoreContext { c.AccountStore = accountStore return c diff --git a/examples/democoin/x/cool/commands/tx.go b/examples/democoin/x/cool/commands/tx.go index 8ce009f0ff..88c5e4e68a 100644 --- a/examples/democoin/x/cool/commands/tx.go +++ b/examples/democoin/x/cool/commands/tx.go @@ -40,7 +40,7 @@ func QuizTxCmd(cdc *wire.Codec) *cobra.Command { name := viper.GetString(client.FlagName) // default to next sequence number if none provided - ctx, err = context.AutoSequence(ctx) + ctx, err = context.EnsureSequence(ctx) if err != nil { return err } @@ -79,7 +79,7 @@ func SetTrendTxCmd(cdc *wire.Codec) *cobra.Command { name := viper.GetString(client.FlagName) // default to next sequence number if none provided - ctx, err = context.AutoSequence(ctx) + ctx, err = context.EnsureSequence(ctx) if err != nil { return err } diff --git a/examples/democoin/x/pow/commands/tx.go b/examples/democoin/x/pow/commands/tx.go index abd5d27ebf..5fa11a4766 100644 --- a/examples/democoin/x/pow/commands/tx.go +++ b/examples/democoin/x/pow/commands/tx.go @@ -55,7 +55,7 @@ func MineCmd(cdc *wire.Codec) *cobra.Command { name := ctx.FromAddressName // default to next sequence number if none provided - ctx, err = context.AutoSequence(ctx) + ctx, err = context.EnsureSequence(ctx) if err != nil { return err } diff --git a/x/bank/commands/sendtx.go b/x/bank/commands/sendtx.go index a37e969a63..56048262d7 100644 --- a/x/bank/commands/sendtx.go +++ b/x/bank/commands/sendtx.go @@ -64,7 +64,7 @@ func (c Commander) sendTxCmd(cmd *cobra.Command, args []string) error { msg := BuildMsg(from, to, coins) // default to next sequence number if none provided - ctx, err = context.AutoSequence(ctx) + ctx, err = context.EnsureSequence(ctx) if err != nil { return err } diff --git a/x/ibc/commands/ibctx.go b/x/ibc/commands/ibctx.go index ee0ac02eea..d17b40b21e 100644 --- a/x/ibc/commands/ibctx.go +++ b/x/ibc/commands/ibctx.go @@ -55,7 +55,7 @@ func (c sendCommander) sendIBCTransfer(cmd *cobra.Command, args []string) error } // default to next sequence number if none provided - ctx, err = context.AutoSequence(ctx) + ctx, err = context.EnsureSequence(ctx) if err != nil { return err } diff --git a/x/simplestake/commands/commands.go b/x/simplestake/commands/commands.go index 0e8a7a9bb4..ba66020283 100644 --- a/x/simplestake/commands/commands.go +++ b/x/simplestake/commands/commands.go @@ -98,7 +98,7 @@ func (co commander) sendMsg(msg sdk.Msg) error { ctx := context.NewCoreContextFromViper().WithDecoder(authcmd.GetAccountDecoder(co.cdc)) // default to next sequence number if none provided - ctx, err := context.AutoSequence(ctx) + ctx, err := context.EnsureSequence(ctx) if err != nil { return err } diff --git a/x/stake/commands/tx.go b/x/stake/commands/tx.go index 1b9063a65b..5cc9747b61 100644 --- a/x/stake/commands/tx.go +++ b/x/stake/commands/tx.go @@ -96,7 +96,7 @@ func GetCmdDeclareCandidacy(cdc *wire.Codec) *cobra.Command { ctx := context.NewCoreContextFromViper().WithDecoder(authcmd.GetAccountDecoder(cdc)) // default to next sequence number if none provided - ctx, err = context.AutoSequence(ctx) + ctx, err = context.EnsureSequence(ctx) if err != nil { return err } @@ -140,7 +140,7 @@ func GetCmdEditCandidacy(cdc *wire.Codec) *cobra.Command { ctx := context.NewCoreContextFromViper().WithDecoder(authcmd.GetAccountDecoder(cdc)) // default to next sequence number if none provided - ctx, err = context.AutoSequence(ctx) + ctx, err = context.EnsureSequence(ctx) if err != nil { return err } @@ -183,7 +183,7 @@ func GetCmdDelegate(cdc *wire.Codec) *cobra.Command { ctx := context.NewCoreContextFromViper().WithDecoder(authcmd.GetAccountDecoder(cdc)) // default to next sequence number if none provided - ctx, err = context.AutoSequence(ctx) + ctx, err = context.EnsureSequence(ctx) if err != nil { return err } @@ -237,7 +237,7 @@ func GetCmdUnbond(cdc *wire.Codec) *cobra.Command { ctx := context.NewCoreContextFromViper().WithDecoder(authcmd.GetAccountDecoder(cdc)) // default to next sequence number if none provided - ctx, err = context.AutoSequence(ctx) + ctx, err = context.EnsureSequence(ctx) if err != nil { return err } From 3f2a8e789a33bd31ccbd8ee56ccab058af4628bc Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Tue, 10 Apr 2018 12:25:13 +0300 Subject: [PATCH 28/50] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 52feff7fc3..79cb396c6e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ BREAKING CHANGES * Remove go-wire, use go-amino +* [store] Add `SubspaceIterator` and `ReverseSubspaceIterator` to `KVStore` interface ## 0.14.1 (April 9, 2018) From 22372bfffdec0cb6016b72b6f8c122e9868916a7 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Tue, 10 Apr 2018 12:39:47 +0200 Subject: [PATCH 29/50] Add basic Dockerfile to build all binaries and export gaiad --- .dockerignore | 5 +++++ Dockerfile | 51 +++++++++++++++++++++++++++++++-------------------- 2 files changed, 36 insertions(+), 20 deletions(-) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000000..404f6c39fb --- /dev/null +++ b/.dockerignore @@ -0,0 +1,5 @@ +Dockerfile +Vagrantfile + +build/ +coverage.txt diff --git a/Dockerfile b/Dockerfile index 79b078d91c..6fe01a15db 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,28 +1,39 @@ -FROM alpine:3.5 +# Simple usage with a mounted data directory: +# > docker build -t gaia . +# > docker run -v $HOME/.gaiad:/root/.gaiad gaia init +# > docker run -v $HOME/.gaiad:/root/.gaiad gaia start -# BCHOME is where your genesis.json, key.json and other files including state are stored. -ENV BCHOME /basecoin +FROM alpine:edge -# Create a basecoin user and group first so the IDs get set the same way, even -# as the rest of this may change over time. -RUN addgroup basecoin && \ - adduser -S -G basecoin basecoin +# Install minimum necessary dependencies -RUN mkdir -p $BCHOME && \ - chown -R basecoin:basecoin $BCHOME -WORKDIR $BCHOME +ENV PACKAGES go glide make git libc-dev bash +RUN apk add --no-cache $PACKAGES -# Expose the basecoin home directory as a volume since there's mutable state in there. -VOLUME $BCHOME +# Set up GOPATH & PATH -# jq and curl used for extracting `pub_key` from private validator while -# deploying tendermint with Kubernetes. It is nice to have bash so the users -# could execute bash commands. -RUN apk add --no-cache bash curl jq +ENV GOPATH /root/go +ENV BASE_PATH $GOPATH/src/github.com/cosmos +ENV REPO_PATH $BASE_PATH/cosmos-sdk +ENV WORKDIR /cosmos/ +ENV PATH $GOPATH/bin:$PATH -COPY basecoin /usr/bin/basecoin +# Link expected Go repo path -ENTRYPOINT ["basecoin"] +RUN mkdir -p $WORKDIR $GOPATH/pkg $ $GOPATH/bin $BASE_PATH && ln -sf $WORKDIR $REPO_PATH -# By default you will get the basecoin with local MerkleEyes and in-proc Tendermint. -CMD ["start", "--dir=${BCHOME}"] +# Add source files + +ADD . $WORKDIR + +# Build cosmos-sdk + +RUN cd $REPO_PATH && make get_tools && make get_vendor_deps && make all && make install + +# Remove packages + +RUN apk del $PACKAGES + +# Set entrypoint + +ENTRYPOINT ["/root/go/bin/gaiad"] From 442e67730026f99e6991e32d11a20b83eee6e7a6 Mon Sep 17 00:00:00 2001 From: mossid Date: Tue, 10 Apr 2018 17:04:27 +0200 Subject: [PATCH 30/50] add CacheContext --- types/context.go | 11 +++++++++-- types/context_test.go | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/types/context.go b/types/context.go index 3c90b016a2..85eb9e493f 100644 --- a/types/context.go +++ b/types/context.go @@ -16,12 +16,13 @@ The intent of Context is for it to be an immutable object that can be cloned and updated cheaply with WithValue() and passed forward to the next decorator or handler. For example, - func MsgHandler(ctx Context, tx Tx) Result { + func MsgHandler(context Context, tx Tx) Result { ... - ctx = ctx.WithValue(key, value) + context = context.WithValue(key, value) ... } */ + type Context struct { context.Context pst *thePast @@ -171,6 +172,12 @@ func (c Context) WithTxBytes(txBytes []byte) Context { return c.withValue(contextKeyTxBytes, txBytes) } +func (c Context) CacheContext() (Context, func()) { + cms := c.multiStore().CacheMultiStore() + cc := c.WithMultiStore(cms) + return cc, cms.Write +} + //---------------------------------------- // thePast diff --git a/types/context_test.go b/types/context_test.go index 36d8099b95..b40e79dc2a 100644 --- a/types/context_test.go +++ b/types/context_test.go @@ -3,6 +3,11 @@ package types_test import ( "testing" + "github.com/stretchr/testify/assert" + + dbm "github.com/tendermint/tmlibs/db" + + "github.com/cosmos/cosmos-sdk/store" "github.com/cosmos/cosmos-sdk/types" abci "github.com/tendermint/abci/types" ) @@ -18,3 +23,39 @@ func TestContextGetOpShouldNeverPanic(t *testing.T) { _, _ = ctx.GetOp(index) } } + +func defaultContext(key types.StoreKey) types.Context { + db := dbm.NewMemDB() + cms := store.NewCommitMultiStore(db) + cms.MountStoreWithDB(key, types.StoreTypeIAVL, db) + cms.LoadLatestVersion() + ctx := types.NewContext(cms, abci.Header{}, false, nil) + return ctx +} + +func TestCacheContext(t *testing.T) { + key := types.NewKVStoreKey(t.Name()) + k1 := []byte("hello") + v1 := []byte("world") + k2 := []byte("key") + v2 := []byte("value") + + ctx := defaultContext(key) + store := ctx.KVStore(key) + store.Set(k1, v1) + assert.Equal(t, v1, store.Get(k1)) + assert.Nil(t, store.Get(k2)) + + cctx, write := ctx.CacheContext() + cstore := cctx.KVStore(key) + assert.Equal(t, v1, cstore.Get(k1)) + assert.Nil(t, cstore.Get(k2)) + + cstore.Set(k2, v2) + assert.Equal(t, v2, cstore.Get(k2)) + assert.Nil(t, store.Get(k2)) + + write() + + assert.Equal(t, v2, store.Get(k2)) +} From 8ed15f7e9d33d1127107c1f445311fe50dbfac08 Mon Sep 17 00:00:00 2001 From: mossid Date: Tue, 10 Apr 2018 17:06:02 +0200 Subject: [PATCH 31/50] typo --- types/context.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/types/context.go b/types/context.go index 85eb9e493f..a6d6b3c3b3 100644 --- a/types/context.go +++ b/types/context.go @@ -16,9 +16,9 @@ The intent of Context is for it to be an immutable object that can be cloned and updated cheaply with WithValue() and passed forward to the next decorator or handler. For example, - func MsgHandler(context Context, tx Tx) Result { + func MsgHandler(ctx Context, tx Tx) Result { ... - context = context.WithValue(key, value) + ctx = context.WithValue(key, value) ... } */ From 1c8094c6bde1a137422be2a77480e91154011781 Mon Sep 17 00:00:00 2001 From: Joon Date: Tue, 10 Apr 2018 17:07:54 +0200 Subject: [PATCH 32/50] Update context.go --- types/context.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/types/context.go b/types/context.go index a6d6b3c3b3..1ec81ca0ec 100644 --- a/types/context.go +++ b/types/context.go @@ -18,7 +18,7 @@ next decorator or handler. For example, func MsgHandler(ctx Context, tx Tx) Result { ... - ctx = context.WithValue(key, value) + ctx = ctx.WithValue(key, value) ... } */ From 8dd612c38aa815c5ba63819b29e46e63e0dc7713 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Tue, 10 Apr 2018 18:48:47 +0200 Subject: [PATCH 33/50] Address PR comments --- Dockerfile | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6fe01a15db..a788aa6416 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,10 +5,8 @@ FROM alpine:edge -# Install minimum necessary dependencies - +# Set up dependencies ENV PACKAGES go glide make git libc-dev bash -RUN apk add --no-cache $PACKAGES # Set up GOPATH & PATH @@ -20,20 +18,17 @@ ENV PATH $GOPATH/bin:$PATH # Link expected Go repo path -RUN mkdir -p $WORKDIR $GOPATH/pkg $ $GOPATH/bin $BASE_PATH && ln -sf $WORKDIR $REPO_PATH +RUN mkdir -p $WORKDIR $GOPATH/pkg $ $GOPATH/bin $BASE_PATH # Add source files -ADD . $WORKDIR +ADD . $REPO_PATH -# Build cosmos-sdk - -RUN cd $REPO_PATH && make get_tools && make get_vendor_deps && make all && make install - -# Remove packages - -RUN apk del $PACKAGES +# Install minimum necessary dependencies, build Cosmos SDK, remove packages +RUN apk add --no-cache $PACKAGES && \ + cd $REPO_PATH && make get_tools && make get_vendor_deps && make all && make install && \ + apk del $PACKAGES # Set entrypoint -ENTRYPOINT ["/root/go/bin/gaiad"] +ENTRYPOINT ["gaiad"] From bdc7fe56bac8bf4e1d74d505b792d4b7117284a1 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Tue, 10 Apr 2018 15:44:49 -0400 Subject: [PATCH 34/50] cachecontext comments and changelog update --- CHANGELOG.md | 4 ++++ types/context.go | 7 ++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 79cb396c6e..2801c932b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ BREAKING CHANGES * Remove go-wire, use go-amino * [store] Add `SubspaceIterator` and `ReverseSubspaceIterator` to `KVStore` interface +FEATURES: + +* Add CacheContext + ## 0.14.1 (April 9, 2018) BUG FIXES diff --git a/types/context.go b/types/context.go index 1ec81ca0ec..8c91175bc6 100644 --- a/types/context.go +++ b/types/context.go @@ -22,7 +22,6 @@ next decorator or handler. For example, ... } */ - type Context struct { context.Context pst *thePast @@ -172,9 +171,11 @@ func (c Context) WithTxBytes(txBytes []byte) Context { return c.withValue(contextKeyTxBytes, txBytes) } -func (c Context) CacheContext() (Context, func()) { +// Cache the multistore and return a new cached context. The cached context is +// written to the context when writeCache is called. +func (c Context) CacheContext() (cc Context, writeCache func()) { cms := c.multiStore().CacheMultiStore() - cc := c.WithMultiStore(cms) + cc = c.WithMultiStore(cms) return cc, cms.Write } From c741be16cea679808fbaa9181be08bbae03952de Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Tue, 10 Apr 2018 17:45:23 -0400 Subject: [PATCH 35/50] next sequence comment, CHANGELOG updates --- CHANGELOG.md | 4 ++++ client/core/core.go | 1 + 2 files changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 52feff7fc3..1b31535273 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ BREAKING CHANGES * Remove go-wire, use go-amino +FEATURES: + +* Add auto sequencing to client + ## 0.14.1 (April 9, 2018) BUG FIXES diff --git a/client/core/core.go b/client/core/core.go index e28e6c3928..2a1b2736a2 100644 --- a/client/core/core.go +++ b/client/core/core.go @@ -140,6 +140,7 @@ func (ctx CoreContext) SignBuildBroadcast(name string, msg sdk.Msg, cdc *wire.Co return ctx.BroadcastTx(txBytes) } +// get the next sequence for the account address func (c CoreContext) NextSequence(address []byte) (int64, error) { if c.Decoder == nil { return 0, errors.New("AccountDecoder required but not provided") From 24f3a3a71c8fdc3b333e99a201accbdbcba39603 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Wed, 11 Apr 2018 11:25:52 +0200 Subject: [PATCH 36/50] Recreate RPC client on WithNodeURI --- client/core/context.go | 1 + 1 file changed, 1 insertion(+) diff --git a/client/core/context.go b/client/core/context.go index 3d7f400a8e..77d2dc549b 100644 --- a/client/core/context.go +++ b/client/core/context.go @@ -31,6 +31,7 @@ func (c CoreContext) WithTrustNode(trustNode bool) CoreContext { func (c CoreContext) WithNodeURI(nodeURI string) CoreContext { c.NodeURI = nodeURI + c.Client = rpcclient.NewHTTP(nodeURI, "/websocket") return c } From 25d0fb593cdf431f19678fd91c74a4d071162438 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Wed, 11 Apr 2018 17:47:56 +0200 Subject: [PATCH 37/50] Address PR comments --- client/context/viper.go | 10 +--------- client/core/context.go | 2 +- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/client/context/viper.go b/client/context/viper.go index 193fe9baa6..c3b0369d98 100644 --- a/client/context/viper.go +++ b/client/context/viper.go @@ -1,10 +1,8 @@ package context import ( - "encoding/json" "fmt" "github.com/spf13/viper" - "io/ioutil" tcmd "github.com/tendermint/tendermint/cmd/tendermint/commands" rpcclient "github.com/tendermint/tendermint/rpc/client" @@ -48,13 +46,7 @@ func defaultChainID() (string, error) { if err != nil { return "", err } - genesisFile := cfg.GenesisFile() - bz, err := ioutil.ReadFile(genesisFile) - if err != nil { - return "", err - } - var doc tmtypes.GenesisDoc - err = json.Unmarshal(bz, &doc) + doc, err := tmtypes.GenesisDocFromFile(cfg.GenesisFile()) if err != nil { return "", err } diff --git a/client/core/context.go b/client/core/context.go index 7f8d764324..fac60b553b 100644 --- a/client/core/context.go +++ b/client/core/context.go @@ -24,7 +24,7 @@ func (c CoreContext) WithChainID(chainID string) CoreContext { return c } -// WithHeight - eturn a copy of the context with an updated height +// WithHeight - return a copy of the context with an updated height func (c CoreContext) WithHeight(height int64) CoreContext { c.Height = height return c From 5883c0e942071b072073420caff1903d6e307649 Mon Sep 17 00:00:00 2001 From: Jae Kwon Date: Thu, 12 Apr 2018 15:56:41 -0700 Subject: [PATCH 38/50] Support namespacing within RMS db --- store/rootmultistore.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/store/rootmultistore.go b/store/rootmultistore.go index 9be28967c2..6ee800db4a 100644 --- a/store/rootmultistore.go +++ b/store/rootmultistore.go @@ -56,8 +56,9 @@ func (rs *rootMultiStore) MountStoreWithDB(key StoreKey, typ StoreType, db dbm.D panic(fmt.Sprintf("rootMultiStore duplicate store key %v", key)) } rs.storesParams[key] = storeParams{ - db: db, + key: key, typ: typ, + db: db, } rs.keysByName[key.Name()] = key } @@ -244,9 +245,12 @@ func parsePath(path string) (storeName string, subpath string, err sdk.Error) { //---------------------------------------- func (rs *rootMultiStore) loadCommitStoreFromParams(id CommitID, params storeParams) (store CommitStore, err error) { - db := rs.db + var db dbm.DB if params.db != nil { db = params.db + } else { + db = rs.db + db = dbm.NewPrefixDB(rs.db, []byte(params.key.Name())) } switch params.typ { case sdk.StoreTypeMulti: @@ -276,6 +280,7 @@ func (rs *rootMultiStore) nameToKey(name string) StoreKey { // storeParams type storeParams struct { + key StoreKey db dbm.DB typ StoreType } From 186ee72c0c9a7de8bc60c3c2a108fc9bed36f442 Mon Sep 17 00:00:00 2001 From: Jae Kwon Date: Thu, 12 Apr 2018 16:22:44 -0700 Subject: [PATCH 39/50] Update documentation --- docs/guide.md | 81 ++++++++++++++++++++++++++++++----------- store/rootmultistore.go | 5 +-- 2 files changed, 61 insertions(+), 25 deletions(-) diff --git a/docs/guide.md b/docs/guide.md index 12a9b534cb..fe28a09cb8 100644 --- a/docs/guide.md +++ b/docs/guide.md @@ -22,7 +22,7 @@ The SDK distinguishes between transactions (Tx) and messages Users can create messages containing arbitrary information by implementing the `Msg` interface: -```golang +```go type Msg interface { // Return the message type. @@ -68,7 +68,7 @@ but this is mostly for convenience and not type-safe. For instance, the `Basecoin` message types are defined in `x/bank/tx.go`: -```golang +```go type SendMsg struct { Inputs []Input `json:"inputs"` Outputs []Output `json:"outputs"` @@ -82,7 +82,7 @@ type IssueMsg struct { Each specifies the addresses that must sign the message: -```golang +```go func (msg SendMsg) GetSigners() []sdk.Address { addrs := make([]sdk.Address, len(msg.Inputs)) for i, in := range msg.Inputs { @@ -100,7 +100,7 @@ func (msg IssueMsg) GetSigners() []sdk.Address { A transaction is a message with additional information for authentication: -```golang +```go type Tx interface { GetMsg() Msg @@ -120,7 +120,7 @@ The `tx.GetSignatures()` method returns a list of signatures, which must match the list of addresses returned by `tx.Msg.GetSigners()`. The signatures come in a standard form: -```golang +```go type StdSignature struct { crypto.PubKey // optional crypto.Signature @@ -146,7 +146,7 @@ to return this. The standard way to create a transaction from a message is to use the `StdTx`: -```golang +```go type StdTx struct { Msg Signatures []StdSignature @@ -164,7 +164,7 @@ When initializing an application, a developer must specify a `TxDecoder` function which determines how an arbitrary byte array should be unmarshalled into a `Tx`: -```golang +```go type TxDecoder func(txBytes []byte) (Tx, error) ``` @@ -177,7 +177,7 @@ relevant types to be registered ahead of type. Registration happens on a For instance, in `Basecoin`, we wish to register the `SendMsg` and `IssueMsg` types: -```golang +```go cdc.RegisterInterface((*sdk.Msg)(nil), nil) cdc.RegisterConcrete(bank.SendMsg{}, "cosmos-sdk/SendMsg", nil) cdc.RegisterConcrete(bank.IssueMsg{}, "cosmos-sdk/IssueMsg", nil) @@ -189,21 +189,58 @@ same prefix-bytes, regardless of what interface it is satisfying. For more details, see the [go-amino documentation](https://github.com/tendermint/go-amino/blob/develop). -## MultiStore +## Storage -### MultiStore is like a filesystem -### Mounting an IAVLStore +### MultiStore +MultiStore is like a root filesystem of an operating system, except +all the entries are fully Merkleized. You mount onto a MultiStore +any number of Stores. Currently only KVStores are supported, but in +the future we may support more kinds of stores, such as a HeapStore +or a NDStore for multidimensional storage. + +The MultiStore as well as all mounted stores provide caching (aka +cache-wrapping) for intermediate state (aka software transactional +memory) during the execution of transactions. In the case of the +KVStore, this also works for iterators. For example, after running +the app's AnteHandler, the MultiStore is cache-wrapped (and each +store is also cache-wrapped) so that should processing of the +transaction fail, at least the transaction fees are paid and +sequence incremented. + +The MultiStore as well as all stores support (or will support) +historical state pruning and snapshotting and various kinds of +queries with proofs. + +### KVStore + +Here we'll focus on the IAVLStore, which is a kind of KVStore. + +IAVLStore is a fast balanced dynamic Merkle store that also supports +iteration, and of course cache-wrapping, state pruning, and various +queries with proofs, such as proofs of existence, absence, range, +and so on. + +Here's how you mount them to a MultiStore. + +```go +mainDB, catDB := dbm.NewMemDB(), dbm.NewMemDB() +fooKey := sdk.NewKVStoreKey("foo") +barKey := sdk.NewKVStoreKey("bar") +catKey := sdk.NewKVStoreKey("cat") +ms := NewCommitMultiStore(mainDB) +ms.MountStoreWithDB(fooKey, sdk.StoreTypeIAVL, nil) +ms.MountStoreWithDB(barKey, sdk.StoreTypeIAVL, nil) +ms.MountStoreWithDB(catKey, sdk.StoreTypeIAVL, catDB) ``` -TODO: -- IAVLStore: Fast balanced dynamic Merkle store. - - supports iteration. -- MultiStore: multiple Merkle tree backends in a single store - - allows using Ethereum Patricia Trie and Tendermint IAVL in same app -- Provide caching for intermediate state during execution of blocks and transactions (including for iteration) -- Historical state pruning and snapshotting. -- Query proofs (existence, absence, range, etc.) on current and retained historical state. -``` + +In the example above, all IAVL nodes (inner and leaf) will be stored +in mainDB with the prefix of "s/k:foo/" and "s/k:bar/" respectively, +thus sharing the mainDB. All IAVL nodes (inner and leaf) for the +cat KVStore are stored separately in catDB with the prefix of +"s/\_/". The "s/k:KEY/" and "s/\_/" prefixes are there to +disambiguate store items from other items of non-storage concern. + ## Context @@ -223,7 +260,7 @@ Many methods on SDK objects receive a context as the first argument. Transaction processing in the SDK is defined through `Handler` functions: -```golang +```go type Handler func(ctx Context, tx Tx) Result ``` @@ -237,7 +274,7 @@ to a particular store (or two or more). Access to stores is managed using capabilities keys and mappers. When a handler is initialized, it is passed a key or mapper that gives it access to the relevant stores. -```golang +```go // File: cosmos-sdk/examples/basecoin/app/init_stores.go app.BaseApp.MountStore(app.capKeyMainStore, sdk.StoreTypeIAVL) app.accountMapper = auth.NewAccountMapper( diff --git a/store/rootmultistore.go b/store/rootmultistore.go index 6ee800db4a..ee574c2942 100644 --- a/store/rootmultistore.go +++ b/store/rootmultistore.go @@ -247,10 +247,9 @@ func parsePath(path string) (storeName string, subpath string, err sdk.Error) { func (rs *rootMultiStore) loadCommitStoreFromParams(id CommitID, params storeParams) (store CommitStore, err error) { var db dbm.DB if params.db != nil { - db = params.db + db = dbm.NewPrefixDB(rs.db, []byte("s/_/")) } else { - db = rs.db - db = dbm.NewPrefixDB(rs.db, []byte(params.key.Name())) + db = dbm.NewPrefixDB(rs.db, []byte("s/k:"+params.key.Name()+"/")) } switch params.typ { case sdk.StoreTypeMulti: From eb25943c58e4279655777679fd07d594eecd18e8 Mon Sep 17 00:00:00 2001 From: Jae Kwon Date: Thu, 12 Apr 2018 16:24:34 -0700 Subject: [PATCH 40/50] ... --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 79cb396c6e..0566da4eb2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ BREAKING CHANGES * Remove go-wire, use go-amino * [store] Add `SubspaceIterator` and `ReverseSubspaceIterator` to `KVStore` interface +BUG FIXES + +* MountStoreWithDB without providing a custom store works. + ## 0.14.1 (April 9, 2018) BUG FIXES From d530ee2abc4ff3d9d321d9b125eb6599b0e554c5 Mon Sep 17 00:00:00 2001 From: Jae Kwon Date: Fri, 13 Apr 2018 02:04:31 -0700 Subject: [PATCH 41/50] Fix MountStoreWithDB(); Bump to 0.15.0-rc0 --- Gopkg.lock | 18 ++++++++-------- Gopkg.toml | 6 +++--- client/rpc/block.go | 2 +- client/rpc/status.go | 2 +- store/rootmultistore.go | 5 +++-- store/rootmultistore_test.go | 41 ++++++++++++++++++++---------------- version/version.go | 2 +- 7 files changed, 41 insertions(+), 35 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index bb083c8ace..eb2a1c8ca6 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -215,8 +215,8 @@ [[projects]] name = "github.com/spf13/pflag" packages = ["."] - revision = "e57e3eeb33f795204c1ca35f56c44f83227c6e66" - version = "v1.0.0" + revision = "583c0c0531f06d5278b7d917446061adc344b5cd" + version = "v1.0.1" [[projects]] name = "github.com/spf13/viper" @@ -342,8 +342,8 @@ "types/priv_validator", "version" ] - revision = "dcd00b0e688f133b9634aee513f8bf856e659356" - version = "v0.19.0-rc4" + revision = "d0beaba7e8a5652506a34b5fab299cc2dc274c02" + version = "v0.19.0" [[projects]] name = "github.com/tendermint/tmlibs" @@ -360,8 +360,8 @@ "pubsub", "pubsub/query" ] - revision = "2e24b64fc121dcdf1cabceab8dc2f7257675483c" - version = "v0.8.1" + revision = "737154202faf75c70437f59ba5303f2eb09f5636" + version = "0.8.2-rc1" [[projects]] branch = "master" @@ -377,7 +377,7 @@ "ripemd160", "salsa20/salsa" ] - revision = "b2aa35443fbc700ab74c586ae79b81c171851023" + revision = "d6449816ce06963d9d136eee5a56fca5b0616e7e" [[projects]] branch = "master" @@ -424,7 +424,7 @@ branch = "master" name = "google.golang.org/genproto" packages = ["googleapis/rpc/status"] - revision = "ce84044298496ef4b54b4a0a0909ba593cc60e30" + revision = "51d0944304c3cbce4afe9e5247e21100037bff78" [[projects]] name = "google.golang.org/grpc" @@ -459,6 +459,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "ad499422ee60cf89fd9d61e232e33d0a17f7b43e0ff7aff0c0a22949901096e8" + inputs-digest = "b6b2d696a242e715ddb8b25c93b3c8f7e7cabc9292eab29dffe935eddbd35fb8" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 59119b1fe8..86de8ca21f 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -70,11 +70,11 @@ [[constraint]] name = "github.com/tendermint/tendermint" - version = "0.19.0-rc4" + version = "0.19.0" -[[constraint]] +[[override]] name = "github.com/tendermint/tmlibs" - version = "~0.8.1" + version = "~0.8.2-rc1" [prune] go-tests = true diff --git a/client/rpc/block.go b/client/rpc/block.go index 6333befde9..8df26edda5 100644 --- a/client/rpc/block.go +++ b/client/rpc/block.go @@ -64,7 +64,7 @@ func GetChainHeight() (int64, error) { if err != nil { return -1, err } - height := status.LatestBlockHeight + height := status.SyncInfo.LatestBlockHeight return height, nil } diff --git a/client/rpc/status.go b/client/rpc/status.go index 13325761ef..83fc01c565 100644 --- a/client/rpc/status.go +++ b/client/rpc/status.go @@ -77,7 +77,7 @@ func NodeSyncingRequestHandler(w http.ResponseWriter, r *http.Request) { return } - syncing := status.Syncing + syncing := status.SyncInfo.Syncing if err != nil { w.WriteHeader(500) w.Write([]byte(err.Error())) diff --git a/store/rootmultistore.go b/store/rootmultistore.go index ee574c2942..3e094712b7 100644 --- a/store/rootmultistore.go +++ b/store/rootmultistore.go @@ -247,7 +247,7 @@ func parsePath(path string) (storeName string, subpath string, err sdk.Error) { func (rs *rootMultiStore) loadCommitStoreFromParams(id CommitID, params storeParams) (store CommitStore, err error) { var db dbm.DB if params.db != nil { - db = dbm.NewPrefixDB(rs.db, []byte("s/_/")) + db = dbm.NewPrefixDB(params.db, []byte("s/_/")) } else { db = dbm.NewPrefixDB(rs.db, []byte("s/k:"+params.key.Name()+"/")) } @@ -379,10 +379,11 @@ func commitStores(version int64, storeMap map[StoreKey]CommitStore) commitInfo { storeInfos = append(storeInfos, si) } - return commitInfo{ + ci := commitInfo{ Version: version, StoreInfos: storeInfos, } + return ci } // Gets commitInfo from disk. diff --git a/store/rootmultistore_test.go b/store/rootmultistore_test.go index 333f0f5af0..3796bd4770 100644 --- a/store/rootmultistore_test.go +++ b/store/rootmultistore_test.go @@ -11,17 +11,22 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" ) +const useDebugDB = false + func TestMultistoreCommitLoad(t *testing.T) { - db := dbm.NewMemDB() + var db dbm.DB = dbm.NewMemDB() + if useDebugDB { + db = dbm.NewDebugDB("CMS", db) + } store := newMultiStoreWithMounts(db) err := store.LoadLatestVersion() assert.Nil(t, err) - // new store has empty last commit + // New store has empty last commit. commitID := CommitID{} checkStore(t, store, commitID, commitID) - // make sure we can get stores by name + // Make sure we can get stores by name. s1 := store.getStoreByName("store1") assert.NotNil(t, s1) s3 := store.getStoreByName("store3") @@ -29,7 +34,7 @@ func TestMultistoreCommitLoad(t *testing.T) { s77 := store.getStoreByName("store77") assert.Nil(t, s77) - // make a few commits and check them + // Make a few commits and check them. nCommits := int64(3) for i := int64(0); i < nCommits; i++ { commitID = store.Commit() @@ -37,19 +42,19 @@ func TestMultistoreCommitLoad(t *testing.T) { checkStore(t, store, expectedCommitID, commitID) } - // Load the latest multistore again and check version + // Load the latest multistore again and check version. store = newMultiStoreWithMounts(db) err = store.LoadLatestVersion() assert.Nil(t, err) commitID = getExpectedCommitID(store, nCommits) checkStore(t, store, commitID, commitID) - // commit and check version + // Commit and check version. commitID = store.Commit() expectedCommitID := getExpectedCommitID(store, nCommits+1) checkStore(t, store, expectedCommitID, commitID) - // Load an older multistore and check version + // Load an older multistore and check version. ver := nCommits - 1 store = newMultiStoreWithMounts(db) err = store.LoadVersion(ver) @@ -62,8 +67,8 @@ func TestMultistoreCommitLoad(t *testing.T) { expectedCommitID = getExpectedCommitID(store, ver+1) checkStore(t, store, expectedCommitID, commitID) - // XXX: confirm old commit is overwritten and - // we have rolled back LatestVersion + // XXX: confirm old commit is overwritten and we have rolled back + // LatestVersion store = newMultiStoreWithMounts(db) err = store.LoadLatestVersion() assert.Nil(t, err) @@ -104,23 +109,23 @@ func TestMultiStoreQuery(t *testing.T) { cid := multi.Commit() - // make sure we can get by name + // Make sure we can get by name. garbage := multi.getStoreByName("bad-name") assert.Nil(t, garbage) - // set and commit data in one store + // Set and commit data in one store. store1 := multi.getStoreByName("store1").(KVStore) store1.Set(k, v) - // and another + // ... and another. store2 := multi.getStoreByName("store2").(KVStore) store2.Set(k2, v2) - // commit the multistore + // Commit the multistore. cid = multi.Commit() ver := cid.Version - // bad path + // Test bad path. query := abci.RequestQuery{Path: "/key", Data: k, Height: ver} qres := multi.Query(query) assert.Equal(t, uint32(sdk.CodeUnknownRequest), qres.Code) @@ -129,25 +134,25 @@ func TestMultiStoreQuery(t *testing.T) { qres = multi.Query(query) assert.Equal(t, uint32(sdk.CodeUnknownRequest), qres.Code) - // invalid store name + // Test invalid store name. query.Path = "/garbage/key" qres = multi.Query(query) assert.Equal(t, uint32(sdk.CodeUnknownRequest), qres.Code) - // valid query with data + // Test valid query with data. query.Path = "/store1/key" qres = multi.Query(query) assert.Equal(t, uint32(sdk.CodeOK), qres.Code) assert.Equal(t, v, qres.Value) - // valid but empty + // Test valid but empty query. query.Path = "/store2/key" query.Prove = true qres = multi.Query(query) assert.Equal(t, uint32(sdk.CodeOK), qres.Code) assert.Nil(t, qres.Value) - // store2 data + // Test store2 data. query.Data = k2 qres = multi.Query(query) assert.Equal(t, uint32(sdk.CodeOK), qres.Code) diff --git a/version/version.go b/version/version.go index e5e3b6611c..ded399a034 100644 --- a/version/version.go +++ b/version/version.go @@ -9,7 +9,7 @@ const Maj = "0" const Min = "15" const Fix = "0" -const Version = "0.15.0-rc1" +const Version = "0.15.0-rc0" // GitCommit set by build flags var GitCommit = "" From 62d63c948380493194b2d8a7c8acbc045b301e50 Mon Sep 17 00:00:00 2001 From: Jae Kwon Date: Fri, 13 Apr 2018 02:47:46 -0700 Subject: [PATCH 42/50] Update README.md --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 63a40aaa7f..640cd28742 100644 --- a/README.md +++ b/README.md @@ -70,4 +70,8 @@ The key directories of the SDK are: ## Getting Started -See the [documentation](https://cosmos-sdk.readthedocs.io). \ No newline at end of file +See the [documentation](https://cosmos-sdk.readthedocs.io). + +## Disambiguation + +This Cosmos-SDK project is not related to the [React-Cosmos](https://github.com/react-cosmos/react-cosmos) project (yet). Many thanks to Evan Coury and Ovidiu (@skidding) for this Github organization name. As per our agreement, this disambiguation notice will stay here. From 49b89784545d155b49e9ebe7ade53c47215fe65d Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Fri, 13 Apr 2018 12:44:20 +0200 Subject: [PATCH 43/50] Swap all examples & testcases to use automatic DB namespacing --- CHANGELOG.md | 1 + baseapp/baseapp.go | 7 +++---- baseapp/baseapp_test.go | 13 +++--------- client/lcd/lcd_test.go | 9 ++------- cmd/gaiad/main.go | 22 ++------------------ examples/basecoin/app/app.go | 11 +++------- examples/basecoin/app/app_test.go | 25 +++++++++-------------- examples/basecoin/cmd/basecoind/main.go | 22 ++------------------ examples/democoin/app/app.go | 12 +++-------- examples/democoin/app/app_test.go | 22 ++++++++------------ examples/democoin/cmd/democoind/main.go | 27 ++----------------------- 11 files changed, 39 insertions(+), 132 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 54e994bdf6..a366f96fb3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ BREAKING CHANGES * Remove go-wire, use go-amino * [store] Add `SubspaceIterator` and `ReverseSubspaceIterator` to `KVStore` interface +* [basecoin] NewBasecoinApp takes a `dbm.DB` and uses namespaced DBs for substores BUG FIXES diff --git a/baseapp/baseapp.go b/baseapp/baseapp.go index 74b23bfb05..884528876d 100644 --- a/baseapp/baseapp.go +++ b/baseapp/baseapp.go @@ -71,21 +71,20 @@ func (app *BaseApp) Name() string { } // Mount a store to the provided key in the BaseApp multistore -// Broken until #532 is implemented. func (app *BaseApp) MountStoresIAVL(keys ...*sdk.KVStoreKey) { for _, key := range keys { app.MountStore(key, sdk.StoreTypeIAVL) } } -// Mount a store to the provided key in the BaseApp multistore +// Mount a store to the provided key in the BaseApp multistore, using a specified DB func (app *BaseApp) MountStoreWithDB(key sdk.StoreKey, typ sdk.StoreType, db dbm.DB) { app.cms.MountStoreWithDB(key, typ, db) } -// Mount a store to the provided key in the BaseApp multistore +// Mount a store to the provided key in the BaseApp multistore, using the default DB func (app *BaseApp) MountStore(key sdk.StoreKey, typ sdk.StoreType) { - app.cms.MountStoreWithDB(key, typ, app.db) + app.cms.MountStoreWithDB(key, typ, nil) } // nolint - Set functions diff --git a/baseapp/baseapp_test.go b/baseapp/baseapp_test.go index 29b224c468..78fd504642 100644 --- a/baseapp/baseapp_test.go +++ b/baseapp/baseapp_test.go @@ -35,15 +35,12 @@ func TestMountStores(t *testing.T) { // make some cap keys capKey1 := sdk.NewKVStoreKey("key1") - db1 := dbm.NewMemDB() capKey2 := sdk.NewKVStoreKey("key2") - db2 := dbm.NewMemDB() // no stores are mounted assert.Panics(t, func() { app.LoadLatestVersion(capKey1) }) - app.MountStoreWithDB(capKey1, sdk.StoreTypeIAVL, db1) - app.MountStoreWithDB(capKey2, sdk.StoreTypeIAVL, db2) + app.MountStoresIAVL(capKey1, capKey2) // stores are mounted err := app.LoadLatestVersion(capKey1) @@ -155,11 +152,8 @@ func TestInitChainer(t *testing.T) { // NOTE/TODO: mounting multiple stores is broken // see https://github.com/cosmos/cosmos-sdk/issues/532 capKey := sdk.NewKVStoreKey("main") - db1 := dbm.NewMemDB() capKey2 := sdk.NewKVStoreKey("key2") - db2 := dbm.NewMemDB() - app.MountStoreWithDB(capKey, sdk.StoreTypeIAVL, db1) - app.MountStoreWithDB(capKey2, sdk.StoreTypeIAVL, db2) + app.MountStoresIAVL(capKey, capKey2) err := app.LoadLatestVersion(capKey) // needed to make stores non-nil assert.Nil(t, err) @@ -191,8 +185,7 @@ func TestInitChainer(t *testing.T) { // reload app app = NewBaseApp(name, logger, db) - app.MountStoreWithDB(capKey, sdk.StoreTypeIAVL, db1) - app.MountStoreWithDB(capKey2, sdk.StoreTypeIAVL, db2) + app.MountStoresIAVL(capKey, capKey2) err = app.LoadLatestVersion(capKey) // needed to make stores non-nil assert.Nil(t, err) app.SetInitChainer(initChainer) diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index fe38b18d8f..0e7ce7b7bb 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -333,13 +333,8 @@ func startTMAndLCD() (*nm.Node, net.Listener, error) { // logger = log.NewFilter(logger, log.AllowError()) privValidatorFile := config.PrivValidatorFile() privVal := pvm.LoadOrGenFilePV(privValidatorFile) - dbs := map[string]dbm.DB{ - "main": dbm.NewMemDB(), - "acc": dbm.NewMemDB(), - "ibc": dbm.NewMemDB(), - "staking": dbm.NewMemDB(), - } - app := bapp.NewBasecoinApp(logger, dbs) + db := dbm.NewMemDB() + app := bapp.NewBasecoinApp(logger, db) cdc = bapp.MakeCodec() // XXX genesisFile := config.GenesisFile() diff --git a/cmd/gaiad/main.go b/cmd/gaiad/main.go index e44bc73eac..9ebf196db8 100644 --- a/cmd/gaiad/main.go +++ b/cmd/gaiad/main.go @@ -28,29 +28,11 @@ var ( // TODO: distinguish from basecoin func generateApp(rootDir string, logger log.Logger) (abci.Application, error) { dataDir := filepath.Join(rootDir, "data") - dbMain, err := dbm.NewGoLevelDB("gaia", dataDir) + db, err := dbm.NewGoLevelDB("gaia", dataDir) if err != nil { return nil, err } - dbAcc, err := dbm.NewGoLevelDB("gaia-acc", dataDir) - if err != nil { - return nil, err - } - dbIBC, err := dbm.NewGoLevelDB("gaia-ibc", dataDir) - if err != nil { - return nil, err - } - dbStaking, err := dbm.NewGoLevelDB("gaia-staking", dataDir) - if err != nil { - return nil, err - } - dbs := map[string]dbm.DB{ - "main": dbMain, - "acc": dbAcc, - "ibc": dbIBC, - "staking": dbStaking, - } - bapp := app.NewBasecoinApp(logger, dbs) + bapp := app.NewBasecoinApp(logger, db) return bapp, nil } diff --git a/examples/basecoin/app/app.go b/examples/basecoin/app/app.go index 15a4f1f193..a1b94318af 100644 --- a/examples/basecoin/app/app.go +++ b/examples/basecoin/app/app.go @@ -38,14 +38,14 @@ type BasecoinApp struct { accountMapper sdk.AccountMapper } -func NewBasecoinApp(logger log.Logger, dbs map[string]dbm.DB) *BasecoinApp { +func NewBasecoinApp(logger log.Logger, db dbm.DB) *BasecoinApp { // Create app-level codec for txs and accounts. var cdc = MakeCodec() // Create your application object. var app = &BasecoinApp{ - BaseApp: bam.NewBaseApp(appName, logger, dbs["main"]), + BaseApp: bam.NewBaseApp(appName, logger, db), cdc: cdc, capKeyMainStore: sdk.NewKVStoreKey("main"), capKeyAccountStore: sdk.NewKVStoreKey("acc"), @@ -72,12 +72,7 @@ func NewBasecoinApp(logger log.Logger, dbs map[string]dbm.DB) *BasecoinApp { // Initialize BaseApp. app.SetTxDecoder(app.txDecoder) app.SetInitChainer(app.initChainer) - app.MountStoreWithDB(app.capKeyMainStore, sdk.StoreTypeIAVL, dbs["main"]) - app.MountStoreWithDB(app.capKeyAccountStore, sdk.StoreTypeIAVL, dbs["acc"]) - app.MountStoreWithDB(app.capKeyIBCStore, sdk.StoreTypeIAVL, dbs["ibc"]) - app.MountStoreWithDB(app.capKeyStakingStore, sdk.StoreTypeIAVL, dbs["staking"]) - // NOTE: Broken until #532 lands - //app.MountStoresIAVL(app.capKeyMainStore, app.capKeyIBCStore, app.capKeyStakingStore) + app.MountStoresIAVL(app.capKeyMainStore, app.capKeyAccountStore, app.capKeyIBCStore, app.capKeyStakingStore) app.SetAnteHandler(auth.NewAnteHandler(app.accountMapper)) err := app.LoadLatestVersion(app.capKeyMainStore) if err != nil { diff --git a/examples/basecoin/app/app_test.go b/examples/basecoin/app/app_test.go index 41c1a6f171..ead49adc2a 100644 --- a/examples/basecoin/app/app_test.go +++ b/examples/basecoin/app/app_test.go @@ -85,20 +85,15 @@ var ( } ) -func loggerAndDBs() (log.Logger, map[string]dbm.DB) { +func loggerAndDB() (log.Logger, dbm.DB) { logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)).With("module", "sdk/app") - dbs := map[string]dbm.DB{ - "main": dbm.NewMemDB(), - "acc": dbm.NewMemDB(), - "ibc": dbm.NewMemDB(), - "staking": dbm.NewMemDB(), - } - return logger, dbs + db := dbm.NewMemDB() + return logger, db } func newBasecoinApp() *BasecoinApp { - logger, dbs := loggerAndDBs() - return NewBasecoinApp(logger, dbs) + logger, db := loggerAndDB() + return NewBasecoinApp(logger, db) } func setGenesisAccounts(bapp *BasecoinApp, accs ...auth.BaseAccount) error { @@ -142,8 +137,8 @@ func TestMsgs(t *testing.T) { } func TestSortGenesis(t *testing.T) { - logger, dbs := loggerAndDBs() - bapp := NewBasecoinApp(logger, dbs) + logger, db := loggerAndDB() + bapp := NewBasecoinApp(logger, db) // Note the order: the coins are unsorted! coinDenom1, coinDenom2 := "foocoin", "barcoin" @@ -184,8 +179,8 @@ func TestSortGenesis(t *testing.T) { } func TestGenesis(t *testing.T) { - logger, dbs := loggerAndDBs() - bapp := NewBasecoinApp(logger, dbs) + logger, db := loggerAndDB() + bapp := NewBasecoinApp(logger, db) // Construct some genesis bytes to reflect basecoin/types/AppAccount pk := crypto.GenPrivKeyEd25519().PubKey() @@ -207,7 +202,7 @@ func TestGenesis(t *testing.T) { assert.Equal(t, acc, res1) // reload app and ensure the account is still there - bapp = NewBasecoinApp(logger, dbs) + bapp = NewBasecoinApp(logger, db) ctx = bapp.BaseApp.NewContext(true, abci.Header{}) res1 = bapp.accountMapper.GetAccount(ctx, baseAcc.Address) assert.Equal(t, acc, res1) diff --git a/examples/basecoin/cmd/basecoind/main.go b/examples/basecoin/cmd/basecoind/main.go index 34e45bf312..37eb7d58f4 100644 --- a/examples/basecoin/cmd/basecoind/main.go +++ b/examples/basecoin/cmd/basecoind/main.go @@ -27,29 +27,11 @@ var ( func generateApp(rootDir string, logger log.Logger) (abci.Application, error) { dataDir := filepath.Join(rootDir, "data") - dbMain, err := dbm.NewGoLevelDB("basecoin", dataDir) + db, err := dbm.NewGoLevelDB("basecoin", dataDir) if err != nil { return nil, err } - dbAcc, err := dbm.NewGoLevelDB("basecoin-acc", dataDir) - if err != nil { - return nil, err - } - dbIBC, err := dbm.NewGoLevelDB("basecoin-ibc", dataDir) - if err != nil { - return nil, err - } - dbStaking, err := dbm.NewGoLevelDB("basecoin-staking", dataDir) - if err != nil { - return nil, err - } - dbs := map[string]dbm.DB{ - "main": dbMain, - "acc": dbAcc, - "ibc": dbIBC, - "staking": dbStaking, - } - bapp := app.NewBasecoinApp(logger, dbs) + bapp := app.NewBasecoinApp(logger, db) return bapp, nil } diff --git a/examples/democoin/app/app.go b/examples/democoin/app/app.go index ad6fd7865d..db2614bad0 100644 --- a/examples/democoin/app/app.go +++ b/examples/democoin/app/app.go @@ -42,14 +42,14 @@ type DemocoinApp struct { accountMapper sdk.AccountMapper } -func NewDemocoinApp(logger log.Logger, dbs map[string]dbm.DB) *DemocoinApp { +func NewDemocoinApp(logger log.Logger, db dbm.DB) *DemocoinApp { // Create app-level codec for txs and accounts. var cdc = MakeCodec() // Create your application object. var app = &DemocoinApp{ - BaseApp: bam.NewBaseApp(appName, logger, dbs["main"]), + BaseApp: bam.NewBaseApp(appName, logger, db), cdc: cdc, capKeyMainStore: sdk.NewKVStoreKey("main"), capKeyAccountStore: sdk.NewKVStoreKey("acc"), @@ -82,13 +82,7 @@ func NewDemocoinApp(logger log.Logger, dbs map[string]dbm.DB) *DemocoinApp { // Initialize BaseApp. app.SetTxDecoder(app.txDecoder) app.SetInitChainer(app.initChainerFn(coolKeeper, powKeeper)) - app.MountStoreWithDB(app.capKeyMainStore, sdk.StoreTypeIAVL, dbs["main"]) - app.MountStoreWithDB(app.capKeyAccountStore, sdk.StoreTypeIAVL, dbs["acc"]) - app.MountStoreWithDB(app.capKeyPowStore, sdk.StoreTypeIAVL, dbs["pow"]) - app.MountStoreWithDB(app.capKeyIBCStore, sdk.StoreTypeIAVL, dbs["ibc"]) - app.MountStoreWithDB(app.capKeyStakingStore, sdk.StoreTypeIAVL, dbs["staking"]) - // NOTE: Broken until #532 lands - //app.MountStoresIAVL(app.capKeyMainStore, app.capKeyIBCStore, app.capKeyStakingStore) + app.MountStoresIAVL(app.capKeyMainStore, app.capKeyAccountStore, app.capKeyPowStore, app.capKeyIBCStore, app.capKeyStakingStore) app.SetAnteHandler(auth.NewAnteHandler(app.accountMapper)) err := app.LoadLatestVersion(app.capKeyMainStore) if err != nil { diff --git a/examples/democoin/app/app_test.go b/examples/democoin/app/app_test.go index 7047f5d28b..ca4e2509ef 100644 --- a/examples/democoin/app/app_test.go +++ b/examples/democoin/app/app_test.go @@ -67,21 +67,15 @@ var ( } ) -func loggerAndDBs() (log.Logger, map[string]dbm.DB) { +func loggerAndDB() (log.Logger, dbm.DB) { logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)).With("module", "sdk/app") - dbs := map[string]dbm.DB{ - "main": dbm.NewMemDB(), - "acc": dbm.NewMemDB(), - "pow": dbm.NewMemDB(), - "ibc": dbm.NewMemDB(), - "staking": dbm.NewMemDB(), - } - return logger, dbs + db := dbm.NewMemDB() + return logger, db } func newDemocoinApp() *DemocoinApp { - logger, dbs := loggerAndDBs() - return NewDemocoinApp(logger, dbs) + logger, db := loggerAndDB() + return NewDemocoinApp(logger, db) } //_______________________________________________________________________ @@ -123,8 +117,8 @@ func TestMsgs(t *testing.T) { } func TestGenesis(t *testing.T) { - logger, dbs := loggerAndDBs() - bapp := NewDemocoinApp(logger, dbs) + logger, db := loggerAndDB() + bapp := NewDemocoinApp(logger, db) // Construct some genesis bytes to reflect democoin/types/AppAccount pk := crypto.GenPrivKeyEd25519().PubKey() @@ -157,7 +151,7 @@ func TestGenesis(t *testing.T) { assert.Equal(t, acc, res1) // reload app and ensure the account is still there - bapp = NewDemocoinApp(logger, dbs) + bapp = NewDemocoinApp(logger, db) ctx = bapp.BaseApp.NewContext(true, abci.Header{}) res1 = bapp.accountMapper.GetAccount(ctx, baseAcc.Address) assert.Equal(t, acc, res1) diff --git a/examples/democoin/cmd/democoind/main.go b/examples/democoin/cmd/democoind/main.go index df94e2c323..8f8bb5a905 100644 --- a/examples/democoin/cmd/democoind/main.go +++ b/examples/democoin/cmd/democoind/main.go @@ -47,34 +47,11 @@ func defaultAppState(args []string, addr sdk.Address, coinDenom string) (json.Ra } func generateApp(rootDir string, logger log.Logger) (abci.Application, error) { - dbMain, err := dbm.NewGoLevelDB("democoin", filepath.Join(rootDir, "data")) + db, err := dbm.NewGoLevelDB("democoin", filepath.Join(rootDir, "data")) if err != nil { return nil, err } - dbAcc, err := dbm.NewGoLevelDB("democoin-acc", filepath.Join(rootDir, "data")) - if err != nil { - return nil, err - } - dbPow, err := dbm.NewGoLevelDB("democoin-pow", filepath.Join(rootDir, "data")) - if err != nil { - return nil, err - } - dbIBC, err := dbm.NewGoLevelDB("democoin-ibc", filepath.Join(rootDir, "data")) - if err != nil { - return nil, err - } - dbStaking, err := dbm.NewGoLevelDB("democoin-staking", filepath.Join(rootDir, "data")) - if err != nil { - return nil, err - } - dbs := map[string]dbm.DB{ - "main": dbMain, - "acc": dbAcc, - "pow": dbPow, - "ibc": dbIBC, - "staking": dbStaking, - } - bapp := app.NewDemocoinApp(logger, dbs) + bapp := app.NewDemocoinApp(logger, db) return bapp, nil } From e870163ec0118cdd4ef3613b1623f4f86a0b0a6b Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Thu, 12 Apr 2018 13:03:29 +0200 Subject: [PATCH 44/50] Implement fee pool pseudo-account in sdk.AccountMapper --- types/account.go | 2 ++ x/auth/ante.go | 3 +++ x/auth/mapper.go | 27 +++++++++++++++++++++++++++ 3 files changed, 32 insertions(+) diff --git a/types/account.go b/types/account.go index 91ad499795..5217fa8507 100644 --- a/types/account.go +++ b/types/account.go @@ -48,6 +48,8 @@ type AccountMapper interface { NewAccountWithAddress(ctx Context, addr Address) Account GetAccount(ctx Context, addr Address) Account SetAccount(ctx Context, acc Account) + GetFeePool(ctx Context) Coins + SetFeePool(ctx Context, coins Coins) } // AccountDecoder unmarshals account bytes diff --git a/x/auth/ante.go b/x/auth/ante.go index 6801769a45..20852b5d70 100644 --- a/x/auth/ante.go +++ b/x/auth/ante.go @@ -74,6 +74,9 @@ func NewAnteHandler(accountMapper sdk.AccountMapper) sdk.AnteHandler { // TODO: min fee if !fee.Amount.IsZero() { signerAcc, res = deductFees(signerAcc, fee) + pool := accountMapper.GetFeePool(ctx) + pool = pool.Plus(fee.Amount) + accountMapper.SetFeePool(ctx, pool) if !res.IsOK() { return ctx, res, true } diff --git a/x/auth/mapper.go b/x/auth/mapper.go index 7bc23aee10..552e10691e 100644 --- a/x/auth/mapper.go +++ b/x/auth/mapper.go @@ -51,6 +51,33 @@ func (am accountMapper) Seal() sealedAccountMapper { return sealedAccountMapper{am} } +var feePoolKey = []byte("feePool") + +// Implements sdk.AccountMapper. +func (am accountMapper) GetFeePool(ctx sdk.Context) sdk.Coins { + store := ctx.KVStore(am.key) + bz := store.Get(feePoolKey) + if bz == nil { + return sdk.Coins{} + } + var coins sdk.Coins + err := am.cdc.UnmarshalBinaryBare(bz, &coins) + if err != nil { + panic(err) + } + return coins +} + +// Implements sdk.AccountMapper. +func (am accountMapper) SetFeePool(ctx sdk.Context, coins sdk.Coins) { + store := ctx.KVStore(am.key) + bz, err := am.cdc.MarshalBinaryBare(coins) + if err != nil { + panic(err) + } + store.Set(feePoolKey, bz) +} + // Implements sdk.AccountMapper. func (am accountMapper) NewAccountWithAddress(ctx sdk.Context, addr sdk.Address) sdk.Account { acc := am.clonePrototype() From 7fafa9e021a7d8e5267315de9ebea37dcc23041f Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Thu, 12 Apr 2018 13:08:57 +0200 Subject: [PATCH 45/50] Add testcases --- x/auth/mapper_test.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/x/auth/mapper_test.go b/x/auth/mapper_test.go index 030207db2c..e591398411 100644 --- a/x/auth/mapper_test.go +++ b/x/auth/mapper_test.go @@ -71,3 +71,19 @@ func TestAccountMapperSealed(t *testing.T) { mapperSealed := mapper.Seal() assert.Panics(t, func() { mapperSealed.WireCodec() }) } + +func TestAccountMapperFeePool(t *testing.T) { + ms, capKey := setupMultiStore() + cdc := wire.NewCodec() + ctx := sdk.NewContext(ms, abci.Header{}, false, nil) + mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) + + // default empty + pool := mapper.GetFeePool(ctx) + assert.Equal(t, pool, sdk.Coins{}) + + // get after set + mapper.SetFeePool(ctx, sdk.Coins{sdk.Coin{"doge", 1}}) + pool = mapper.GetFeePool(ctx) + assert.Equal(t, pool, sdk.Coins{sdk.Coin{"doge", 1}}) +} From 39ee95abe47db0d49cf7e5b4920cfc12fa4b347c Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Mon, 16 Apr 2018 14:15:03 +0200 Subject: [PATCH 46/50] Refactor to use FeeHandler function --- examples/basecoin/app/app.go | 8 +++++++- examples/democoin/app/app.go | 8 +++++++- types/account.go | 2 -- types/handler.go | 3 +++ x/auth/ante.go | 6 ++---- x/auth/ante_test.go | 13 ++++++++----- x/auth/mapper.go | 27 --------------------------- x/auth/mapper_test.go | 16 ---------------- 8 files changed, 27 insertions(+), 56 deletions(-) diff --git a/examples/basecoin/app/app.go b/examples/basecoin/app/app.go index a1b94318af..5e3e637466 100644 --- a/examples/basecoin/app/app.go +++ b/examples/basecoin/app/app.go @@ -36,6 +36,9 @@ type BasecoinApp struct { // Manage getting and setting accounts accountMapper sdk.AccountMapper + + // Handle fees + feeHandler sdk.FeeHandler } func NewBasecoinApp(logger log.Logger, db dbm.DB) *BasecoinApp { @@ -60,6 +63,9 @@ func NewBasecoinApp(logger log.Logger, db dbm.DB) *BasecoinApp { &types.AppAccount{}, // prototype ).Seal() + // Define the feeHandler. + app.feeHandler = func(ctx sdk.Context, fees sdk.Coins) {} + // Add handlers. coinKeeper := bank.NewCoinKeeper(app.accountMapper) ibcMapper := ibc.NewIBCMapper(app.cdc, app.capKeyIBCStore) @@ -73,7 +79,7 @@ func NewBasecoinApp(logger log.Logger, db dbm.DB) *BasecoinApp { app.SetTxDecoder(app.txDecoder) app.SetInitChainer(app.initChainer) app.MountStoresIAVL(app.capKeyMainStore, app.capKeyAccountStore, app.capKeyIBCStore, app.capKeyStakingStore) - app.SetAnteHandler(auth.NewAnteHandler(app.accountMapper)) + app.SetAnteHandler(auth.NewAnteHandler(app.accountMapper, app.feeHandler)) err := app.LoadLatestVersion(app.capKeyMainStore) if err != nil { cmn.Exit(err.Error()) diff --git a/examples/democoin/app/app.go b/examples/democoin/app/app.go index db2614bad0..8954411f64 100644 --- a/examples/democoin/app/app.go +++ b/examples/democoin/app/app.go @@ -40,6 +40,9 @@ type DemocoinApp struct { // Manage getting and setting accounts accountMapper sdk.AccountMapper + + // Handle fees + feeHandler sdk.FeeHandler } func NewDemocoinApp(logger log.Logger, db dbm.DB) *DemocoinApp { @@ -65,6 +68,9 @@ func NewDemocoinApp(logger log.Logger, db dbm.DB) *DemocoinApp { &types.AppAccount{}, // prototype ).Seal() + // Define the feeHandler. + app.feeHandler = func(ctx sdk.Context, fee sdk.Coins) {} + // Add handlers. coinKeeper := bank.NewCoinKeeper(app.accountMapper) coolKeeper := cool.NewKeeper(app.capKeyMainStore, coinKeeper) @@ -83,7 +89,7 @@ func NewDemocoinApp(logger log.Logger, db dbm.DB) *DemocoinApp { app.SetTxDecoder(app.txDecoder) app.SetInitChainer(app.initChainerFn(coolKeeper, powKeeper)) app.MountStoresIAVL(app.capKeyMainStore, app.capKeyAccountStore, app.capKeyPowStore, app.capKeyIBCStore, app.capKeyStakingStore) - app.SetAnteHandler(auth.NewAnteHandler(app.accountMapper)) + app.SetAnteHandler(auth.NewAnteHandler(app.accountMapper, app.feeHandler)) err := app.LoadLatestVersion(app.capKeyMainStore) if err != nil { cmn.Exit(err.Error()) diff --git a/types/account.go b/types/account.go index 5217fa8507..91ad499795 100644 --- a/types/account.go +++ b/types/account.go @@ -48,8 +48,6 @@ type AccountMapper interface { NewAccountWithAddress(ctx Context, addr Address) Account GetAccount(ctx Context, addr Address) Account SetAccount(ctx Context, acc Account) - GetFeePool(ctx Context) Coins - SetFeePool(ctx Context, coins Coins) } // AccountDecoder unmarshals account bytes diff --git a/types/handler.go b/types/handler.go index 129f42647a..6127c52d72 100644 --- a/types/handler.go +++ b/types/handler.go @@ -3,5 +3,8 @@ package types // core function variable which application runs for transactions type Handler func(ctx Context, msg Msg) Result +// core function variable which application runs to handle fees +type FeeHandler func(ctx Context, fee Coins) + // If newCtx.IsZero(), ctx is used instead. type AnteHandler func(ctx Context, tx Tx) (newCtx Context, result Result, abort bool) diff --git a/x/auth/ante.go b/x/auth/ante.go index 20852b5d70..9db714196f 100644 --- a/x/auth/ante.go +++ b/x/auth/ante.go @@ -11,7 +11,7 @@ import ( // NewAnteHandler returns an AnteHandler that checks // and increments sequence numbers, checks signatures, // and deducts fees from the first signer. -func NewAnteHandler(accountMapper sdk.AccountMapper) sdk.AnteHandler { +func NewAnteHandler(accountMapper sdk.AccountMapper, feeHandler sdk.FeeHandler) sdk.AnteHandler { return func( ctx sdk.Context, tx sdk.Tx, ) (_ sdk.Context, _ sdk.Result, abort bool) { @@ -74,9 +74,7 @@ func NewAnteHandler(accountMapper sdk.AccountMapper) sdk.AnteHandler { // TODO: min fee if !fee.Amount.IsZero() { signerAcc, res = deductFees(signerAcc, fee) - pool := accountMapper.GetFeePool(ctx) - pool = pool.Plus(fee.Amount) - accountMapper.SetFeePool(ctx, pool) + feeHandler(ctx, fee.Amount) if !res.IsOK() { return ctx, res, true } diff --git a/x/auth/ante_test.go b/x/auth/ante_test.go index 2f90701e65..ae12cd6cda 100644 --- a/x/auth/ante_test.go +++ b/x/auth/ante_test.go @@ -12,6 +12,9 @@ import ( wire "github.com/cosmos/cosmos-sdk/wire" ) +func nopFeeHandler(ctx sdk.Context, fee sdk.Coins) { +} + func newTestMsg(addrs ...sdk.Address) *sdk.TestMsg { return sdk.NewTestMsg(addrs...) } @@ -72,7 +75,7 @@ func TestAnteHandlerSigErrors(t *testing.T) { cdc := wire.NewCodec() RegisterBaseAccount(cdc) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) - anteHandler := NewAnteHandler(mapper) + anteHandler := NewAnteHandler(mapper, nopFeeHandler) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil) // keys and addresses @@ -113,7 +116,7 @@ func TestAnteHandlerSequences(t *testing.T) { cdc := wire.NewCodec() RegisterBaseAccount(cdc) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) - anteHandler := NewAnteHandler(mapper) + anteHandler := NewAnteHandler(mapper, nopFeeHandler) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil) // keys and addresses @@ -179,7 +182,7 @@ func TestAnteHandlerFees(t *testing.T) { cdc := wire.NewCodec() RegisterBaseAccount(cdc) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) - anteHandler := NewAnteHandler(mapper) + anteHandler := NewAnteHandler(mapper, nopFeeHandler) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil) // keys and addresses @@ -216,7 +219,7 @@ func TestAnteHandlerBadSignBytes(t *testing.T) { cdc := wire.NewCodec() RegisterBaseAccount(cdc) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) - anteHandler := NewAnteHandler(mapper) + anteHandler := NewAnteHandler(mapper, nopFeeHandler) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil) // keys and addresses @@ -291,7 +294,7 @@ func TestAnteHandlerSetPubKey(t *testing.T) { cdc := wire.NewCodec() RegisterBaseAccount(cdc) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) - anteHandler := NewAnteHandler(mapper) + anteHandler := NewAnteHandler(mapper, nopFeeHandler) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil) // keys and addresses diff --git a/x/auth/mapper.go b/x/auth/mapper.go index 552e10691e..7bc23aee10 100644 --- a/x/auth/mapper.go +++ b/x/auth/mapper.go @@ -51,33 +51,6 @@ func (am accountMapper) Seal() sealedAccountMapper { return sealedAccountMapper{am} } -var feePoolKey = []byte("feePool") - -// Implements sdk.AccountMapper. -func (am accountMapper) GetFeePool(ctx sdk.Context) sdk.Coins { - store := ctx.KVStore(am.key) - bz := store.Get(feePoolKey) - if bz == nil { - return sdk.Coins{} - } - var coins sdk.Coins - err := am.cdc.UnmarshalBinaryBare(bz, &coins) - if err != nil { - panic(err) - } - return coins -} - -// Implements sdk.AccountMapper. -func (am accountMapper) SetFeePool(ctx sdk.Context, coins sdk.Coins) { - store := ctx.KVStore(am.key) - bz, err := am.cdc.MarshalBinaryBare(coins) - if err != nil { - panic(err) - } - store.Set(feePoolKey, bz) -} - // Implements sdk.AccountMapper. func (am accountMapper) NewAccountWithAddress(ctx sdk.Context, addr sdk.Address) sdk.Account { acc := am.clonePrototype() diff --git a/x/auth/mapper_test.go b/x/auth/mapper_test.go index e591398411..030207db2c 100644 --- a/x/auth/mapper_test.go +++ b/x/auth/mapper_test.go @@ -71,19 +71,3 @@ func TestAccountMapperSealed(t *testing.T) { mapperSealed := mapper.Seal() assert.Panics(t, func() { mapperSealed.WireCodec() }) } - -func TestAccountMapperFeePool(t *testing.T) { - ms, capKey := setupMultiStore() - cdc := wire.NewCodec() - ctx := sdk.NewContext(ms, abci.Header{}, false, nil) - mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) - - // default empty - pool := mapper.GetFeePool(ctx) - assert.Equal(t, pool, sdk.Coins{}) - - // get after set - mapper.SetFeePool(ctx, sdk.Coins{sdk.Coin{"doge", 1}}) - pool = mapper.GetFeePool(ctx) - assert.Equal(t, pool, sdk.Coins{sdk.Coin{"doge", 1}}) -} From 3bbb15f454cb3a4a526a38284b612ba5ba24fc2b Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Mon, 16 Apr 2018 14:58:19 +0200 Subject: [PATCH 47/50] Add tx to feeHandler, move around in example apps --- examples/basecoin/app/app.go | 6 +++--- examples/democoin/app/app.go | 6 +++--- types/handler.go | 2 +- x/auth/ante.go | 2 +- x/auth/ante_test.go | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/basecoin/app/app.go b/examples/basecoin/app/app.go index 5e3e637466..8a4f4810d0 100644 --- a/examples/basecoin/app/app.go +++ b/examples/basecoin/app/app.go @@ -63,9 +63,6 @@ func NewBasecoinApp(logger log.Logger, db dbm.DB) *BasecoinApp { &types.AppAccount{}, // prototype ).Seal() - // Define the feeHandler. - app.feeHandler = func(ctx sdk.Context, fees sdk.Coins) {} - // Add handlers. coinKeeper := bank.NewCoinKeeper(app.accountMapper) ibcMapper := ibc.NewIBCMapper(app.cdc, app.capKeyIBCStore) @@ -75,6 +72,9 @@ func NewBasecoinApp(logger log.Logger, db dbm.DB) *BasecoinApp { AddRoute("ibc", ibc.NewHandler(ibcMapper, coinKeeper)). AddRoute("simplestake", simplestake.NewHandler(stakeKeeper)) + // Define the feeHandler. + app.feeHandler = func(ctx sdk.Context, tx sdk.Tx, fees sdk.Coins) {} + // Initialize BaseApp. app.SetTxDecoder(app.txDecoder) app.SetInitChainer(app.initChainer) diff --git a/examples/democoin/app/app.go b/examples/democoin/app/app.go index 8954411f64..85ed50b301 100644 --- a/examples/democoin/app/app.go +++ b/examples/democoin/app/app.go @@ -68,9 +68,6 @@ func NewDemocoinApp(logger log.Logger, db dbm.DB) *DemocoinApp { &types.AppAccount{}, // prototype ).Seal() - // Define the feeHandler. - app.feeHandler = func(ctx sdk.Context, fee sdk.Coins) {} - // Add handlers. coinKeeper := bank.NewCoinKeeper(app.accountMapper) coolKeeper := cool.NewKeeper(app.capKeyMainStore, coinKeeper) @@ -85,6 +82,9 @@ func NewDemocoinApp(logger log.Logger, db dbm.DB) *DemocoinApp { AddRoute("ibc", ibc.NewHandler(ibcMapper, coinKeeper)). AddRoute("simplestake", simplestake.NewHandler(stakeKeeper)) + // Define the feeHandler. + app.feeHandler = func(ctx sdk.Context, tx sdk.Tx, fee sdk.Coins) {} + // Initialize BaseApp. app.SetTxDecoder(app.txDecoder) app.SetInitChainer(app.initChainerFn(coolKeeper, powKeeper)) diff --git a/types/handler.go b/types/handler.go index 6127c52d72..679a3b1a78 100644 --- a/types/handler.go +++ b/types/handler.go @@ -4,7 +4,7 @@ package types type Handler func(ctx Context, msg Msg) Result // core function variable which application runs to handle fees -type FeeHandler func(ctx Context, fee Coins) +type FeeHandler func(ctx Context, tx Tx, fee Coins) // If newCtx.IsZero(), ctx is used instead. type AnteHandler func(ctx Context, tx Tx) (newCtx Context, result Result, abort bool) diff --git a/x/auth/ante.go b/x/auth/ante.go index 9db714196f..dc756e3603 100644 --- a/x/auth/ante.go +++ b/x/auth/ante.go @@ -74,7 +74,7 @@ func NewAnteHandler(accountMapper sdk.AccountMapper, feeHandler sdk.FeeHandler) // TODO: min fee if !fee.Amount.IsZero() { signerAcc, res = deductFees(signerAcc, fee) - feeHandler(ctx, fee.Amount) + feeHandler(ctx, tx, fee.Amount) if !res.IsOK() { return ctx, res, true } diff --git a/x/auth/ante_test.go b/x/auth/ante_test.go index ae12cd6cda..8445c1448c 100644 --- a/x/auth/ante_test.go +++ b/x/auth/ante_test.go @@ -12,7 +12,7 @@ import ( wire "github.com/cosmos/cosmos-sdk/wire" ) -func nopFeeHandler(ctx sdk.Context, fee sdk.Coins) { +func nopFeeHandler(ctx sdk.Context, tx sdk.Tx, fee sdk.Coins) { } func newTestMsg(addrs ...sdk.Address) *sdk.TestMsg { From 474fa1dfd1ade9e450ba65eb746f819a9d4468e4 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Tue, 17 Apr 2018 01:06:07 +0200 Subject: [PATCH 48/50] Switch to BurnFeeHandler --- examples/basecoin/app/app.go | 2 +- examples/democoin/app/app.go | 2 +- x/auth/ante.go | 4 ++++ x/auth/ante_test.go | 13 +++++-------- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/examples/basecoin/app/app.go b/examples/basecoin/app/app.go index 8a4f4810d0..ae60e8a734 100644 --- a/examples/basecoin/app/app.go +++ b/examples/basecoin/app/app.go @@ -73,7 +73,7 @@ func NewBasecoinApp(logger log.Logger, db dbm.DB) *BasecoinApp { AddRoute("simplestake", simplestake.NewHandler(stakeKeeper)) // Define the feeHandler. - app.feeHandler = func(ctx sdk.Context, tx sdk.Tx, fees sdk.Coins) {} + app.feeHandler = auth.BurnFeeHandler // Initialize BaseApp. app.SetTxDecoder(app.txDecoder) diff --git a/examples/democoin/app/app.go b/examples/democoin/app/app.go index 85ed50b301..151241d148 100644 --- a/examples/democoin/app/app.go +++ b/examples/democoin/app/app.go @@ -83,7 +83,7 @@ func NewDemocoinApp(logger log.Logger, db dbm.DB) *DemocoinApp { AddRoute("simplestake", simplestake.NewHandler(stakeKeeper)) // Define the feeHandler. - app.feeHandler = func(ctx sdk.Context, tx sdk.Tx, fee sdk.Coins) {} + app.feeHandler = auth.BurnFeeHandler // Initialize BaseApp. app.SetTxDecoder(app.txDecoder) diff --git a/x/auth/ante.go b/x/auth/ante.go index dc756e3603..c7af7e2d95 100644 --- a/x/auth/ante.go +++ b/x/auth/ante.go @@ -157,3 +157,7 @@ func deductFees(acc sdk.Account, fee sdk.StdFee) (sdk.Account, sdk.Result) { acc.SetCoins(newCoins) return acc, sdk.Result{} } + +// BurnFeeHandler burns all fees (decreasing total supply) +func BurnFeeHandler(ctx sdk.Context, tx sdk.Tx, fee sdk.Coins) { +} diff --git a/x/auth/ante_test.go b/x/auth/ante_test.go index 8445c1448c..58633ff9a6 100644 --- a/x/auth/ante_test.go +++ b/x/auth/ante_test.go @@ -12,9 +12,6 @@ import ( wire "github.com/cosmos/cosmos-sdk/wire" ) -func nopFeeHandler(ctx sdk.Context, tx sdk.Tx, fee sdk.Coins) { -} - func newTestMsg(addrs ...sdk.Address) *sdk.TestMsg { return sdk.NewTestMsg(addrs...) } @@ -75,7 +72,7 @@ func TestAnteHandlerSigErrors(t *testing.T) { cdc := wire.NewCodec() RegisterBaseAccount(cdc) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) - anteHandler := NewAnteHandler(mapper, nopFeeHandler) + anteHandler := NewAnteHandler(mapper, BurnFeeHandler) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil) // keys and addresses @@ -116,7 +113,7 @@ func TestAnteHandlerSequences(t *testing.T) { cdc := wire.NewCodec() RegisterBaseAccount(cdc) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) - anteHandler := NewAnteHandler(mapper, nopFeeHandler) + anteHandler := NewAnteHandler(mapper, BurnFeeHandler) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil) // keys and addresses @@ -182,7 +179,7 @@ func TestAnteHandlerFees(t *testing.T) { cdc := wire.NewCodec() RegisterBaseAccount(cdc) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) - anteHandler := NewAnteHandler(mapper, nopFeeHandler) + anteHandler := NewAnteHandler(mapper, BurnFeeHandler) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil) // keys and addresses @@ -219,7 +216,7 @@ func TestAnteHandlerBadSignBytes(t *testing.T) { cdc := wire.NewCodec() RegisterBaseAccount(cdc) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) - anteHandler := NewAnteHandler(mapper, nopFeeHandler) + anteHandler := NewAnteHandler(mapper, BurnFeeHandler) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil) // keys and addresses @@ -294,7 +291,7 @@ func TestAnteHandlerSetPubKey(t *testing.T) { cdc := wire.NewCodec() RegisterBaseAccount(cdc) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) - anteHandler := NewAnteHandler(mapper, nopFeeHandler) + anteHandler := NewAnteHandler(mapper, BurnFeeHandler) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil) // keys and addresses From e3045fd57d89cb7bf502bc85eade383639cd2acf Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Tue, 17 Apr 2018 01:07:56 +0200 Subject: [PATCH 49/50] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a366f96fb3..1612f083f8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ FEATURES: * Add CacheContext * Add auto sequencing to client +* Add FeeHandler to ante handler BREAKING CHANGES From d3fd71a3688670962fe426cb060ef822628bc23e Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Sat, 28 Apr 2018 21:59:47 -0400 Subject: [PATCH 50/50] version and changelog --- CHANGELOG.md | 2 +- version/version.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1612f083f8..1e70c13cf4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## 0.15.0 (TBD) +## 0.15.0 (April 29, 2018) FEATURES: diff --git a/version/version.go b/version/version.go index ded399a034..957af26af4 100644 --- a/version/version.go +++ b/version/version.go @@ -9,7 +9,7 @@ const Maj = "0" const Min = "15" const Fix = "0" -const Version = "0.15.0-rc0" +const Version = "0.15.0" // GitCommit set by build flags var GitCommit = ""