Merge abci_proof
This commit is contained in:
parent
cf33596bb1
commit
b8374f4a9c
3
Makefile
3
Makefile
|
@ -4,6 +4,9 @@ all: test install
|
||||||
|
|
||||||
NOVENDOR = go list github.com/tendermint/basecoin/... | grep -v /vendor/
|
NOVENDOR = go list github.com/tendermint/basecoin/... | grep -v /vendor/
|
||||||
|
|
||||||
|
build:
|
||||||
|
go build github.com/tendermint/basecoin/cmd/...
|
||||||
|
|
||||||
install:
|
install:
|
||||||
go install github.com/tendermint/basecoin/cmd/...
|
go install github.com/tendermint/basecoin/cmd/...
|
||||||
|
|
||||||
|
|
16
app/app.go
16
app/app.go
|
@ -118,12 +118,20 @@ func (app *Basecoin) CheckTx(txBytes []byte) (res abci.Result) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// TMSP::Query
|
// TMSP::Query
|
||||||
func (app *Basecoin) Query(query []byte) (res abci.Result) {
|
func (app *Basecoin) Query(reqQuery abci.RequestQuery) (resQuery abci.ResponseQuery) {
|
||||||
if len(query) == 0 {
|
if len(reqQuery.Data) == 0 {
|
||||||
return abci.ErrEncodingError.SetLog("Query cannot be zero length")
|
resQuery.Log = "Query cannot be zero length"
|
||||||
|
resQuery.Code = abci.CodeType_EncodingError
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
return app.eyesCli.QuerySync(query)
|
resQuery, err := app.eyesCli.QuerySync(reqQuery)
|
||||||
|
if err != nil {
|
||||||
|
resQuery.Log = "Failed to query MerkleEyes: " + err.Error()
|
||||||
|
resQuery.Code = abci.CodeType_InternalError
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// TMSP::Commit
|
// TMSP::Commit
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
package app
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"reflect"
|
||||||
|
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
cmn "github.com/tendermint/go-common"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (app *Basecoin) LoadGenesis(path string) error {
|
||||||
|
kvz, err := loadGenesis(path)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
for _, kv := range kvz {
|
||||||
|
log := app.SetOption(kv.Key, kv.Value)
|
||||||
|
// TODO: remove debug output
|
||||||
|
fmt.Printf("Set %v=%v. Log: %v", kv.Key, kv.Value, log)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type keyValue struct {
|
||||||
|
Key string `json:"key"`
|
||||||
|
Value string `json:"value"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func loadGenesis(filePath string) (kvz []keyValue, err error) {
|
||||||
|
kvz_ := []interface{}{}
|
||||||
|
bytes, err := cmn.ReadFile(filePath)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.Wrap(err, "loading genesis file")
|
||||||
|
}
|
||||||
|
err = json.Unmarshal(bytes, &kvz_)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.Wrap(err, "parsing genesis file")
|
||||||
|
}
|
||||||
|
if len(kvz_)%2 != 0 {
|
||||||
|
return nil, errors.New("genesis cannot have an odd number of items. Format = [key1, value1, key2, value2, ...]")
|
||||||
|
}
|
||||||
|
for i := 0; i < len(kvz_); i += 2 {
|
||||||
|
keyIfc := kvz_[i]
|
||||||
|
valueIfc := kvz_[i+1]
|
||||||
|
var key, value string
|
||||||
|
key, ok := keyIfc.(string)
|
||||||
|
if !ok {
|
||||||
|
return nil, errors.Errorf("genesis had invalid key %v of type %v", keyIfc, reflect.TypeOf(keyIfc))
|
||||||
|
}
|
||||||
|
if value_, ok := valueIfc.(string); ok {
|
||||||
|
value = value_
|
||||||
|
} else {
|
||||||
|
valueBytes, err := json.Marshal(valueIfc)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.Errorf("genesis had invalid value %v: %v", value_, err.Error())
|
||||||
|
}
|
||||||
|
value = string(valueBytes)
|
||||||
|
}
|
||||||
|
kvz = append(kvz, keyValue{key, value})
|
||||||
|
}
|
||||||
|
return kvz, nil
|
||||||
|
}
|
|
@ -1,28 +1,32 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
|
||||||
"reflect"
|
|
||||||
|
|
||||||
"github.com/tendermint/abci/server"
|
"github.com/tendermint/abci/server"
|
||||||
"github.com/tendermint/basecoin/app"
|
"github.com/tendermint/basecoin/app"
|
||||||
. "github.com/tendermint/go-common"
|
cmn "github.com/tendermint/go-common"
|
||||||
eyes "github.com/tendermint/merkleeyes/client"
|
eyes "github.com/tendermint/merkleeyes/client"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|
||||||
addrPtr := flag.String("address", "tcp://0.0.0.0:46658", "Listen address")
|
addrPtr := flag.String("address", "tcp://0.0.0.0:46658", "Listen address")
|
||||||
eyesPtr := flag.String("eyes", "local", "MerkleEyes address, or 'local' for embedded")
|
eyesPtr := flag.String("eyes", "local", "MerkleEyes address, or 'local' for embedded")
|
||||||
|
eyesDBNamePtr := flag.String("eyes-db-name", "local.db", "MerkleEyes db name, for embedded")
|
||||||
|
eyesCacheSizePtr := flag.Int("eyes-cache-size", 10000, "MerkleEyes db cache size, for embedded")
|
||||||
genFilePath := flag.String("genesis", "", "Genesis file, if any")
|
genFilePath := flag.String("genesis", "", "Genesis file, if any")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
// Connect to MerkleEyes
|
// Connect to MerkleEyes
|
||||||
eyesCli, err := eyes.NewClient(*eyesPtr, "socket")
|
var eyesCli *eyes.Client
|
||||||
|
if *eyesPtr == "local" {
|
||||||
|
eyesCli = eyes.NewLocalClient(*eyesDBNamePtr, *eyesCacheSizePtr)
|
||||||
|
} else {
|
||||||
|
var err error
|
||||||
|
eyesCli, err = eyes.NewClient(*eyesPtr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
Exit("connect to MerkleEyes: " + err.Error())
|
cmn.Exit("connect to MerkleEyes: " + err.Error())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create Basecoin app
|
// Create Basecoin app
|
||||||
|
@ -30,65 +34,22 @@ func main() {
|
||||||
|
|
||||||
// If genesis file was specified, set key-value options
|
// If genesis file was specified, set key-value options
|
||||||
if *genFilePath != "" {
|
if *genFilePath != "" {
|
||||||
kvz := loadGenesis(*genFilePath)
|
err := app.LoadGenesis(*genFilePath)
|
||||||
for _, kv := range kvz {
|
if err != nil {
|
||||||
log := app.SetOption(kv.Key, kv.Value)
|
cmn.Exit(cmn.Fmt("%+v", err))
|
||||||
fmt.Println(Fmt("Set %v=%v. Log: %v", kv.Key, kv.Value, log))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start the listener
|
// Start the listener
|
||||||
svr, err := server.NewServer(*addrPtr, "socket", app)
|
svr, err := server.NewServer(*addrPtr, "socket", app)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
Exit("create listener: " + err.Error())
|
cmn.Exit("create listener: " + err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wait forever
|
// Wait forever
|
||||||
TrapSignal(func() {
|
cmn.TrapSignal(func() {
|
||||||
// Cleanup
|
// Cleanup
|
||||||
svr.Stop()
|
svr.Stop()
|
||||||
})
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------
|
|
||||||
|
|
||||||
type KeyValue struct {
|
|
||||||
Key string `json:"key"`
|
|
||||||
Value string `json:"value"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func loadGenesis(filePath string) (kvz []KeyValue) {
|
|
||||||
kvz_ := []interface{}{}
|
|
||||||
bytes, err := ReadFile(filePath)
|
|
||||||
if err != nil {
|
|
||||||
Exit("loading genesis file: " + err.Error())
|
|
||||||
}
|
|
||||||
err = json.Unmarshal(bytes, &kvz_)
|
|
||||||
if err != nil {
|
|
||||||
Exit("parsing genesis file: " + err.Error())
|
|
||||||
}
|
|
||||||
if len(kvz_)%2 != 0 {
|
|
||||||
Exit("genesis cannot have an odd number of items. Format = [key1, value1, key2, value2, ...]")
|
|
||||||
}
|
|
||||||
for i := 0; i < len(kvz_); i += 2 {
|
|
||||||
keyIfc := kvz_[i]
|
|
||||||
valueIfc := kvz_[i+1]
|
|
||||||
var key, value string
|
|
||||||
key, ok := keyIfc.(string)
|
|
||||||
if !ok {
|
|
||||||
Exit(Fmt("genesis had invalid key %v of type %v", keyIfc, reflect.TypeOf(keyIfc)))
|
|
||||||
}
|
|
||||||
if value_, ok := valueIfc.(string); ok {
|
|
||||||
value = value_
|
|
||||||
} else {
|
|
||||||
valueBytes, err := json.Marshal(valueIfc)
|
|
||||||
if err != nil {
|
|
||||||
Exit(Fmt("genesis had invalid value %v: %v", value_, err.Error()))
|
|
||||||
}
|
|
||||||
value = string(valueBytes)
|
|
||||||
}
|
|
||||||
kvz = append(kvz, KeyValue{key, value})
|
|
||||||
}
|
|
||||||
return kvz
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"flag"
|
||||||
|
|
||||||
|
"github.com/tendermint/abci/server"
|
||||||
|
"github.com/tendermint/basecoin/app"
|
||||||
|
"github.com/tendermint/basecoin/plugins/counter"
|
||||||
|
cmn "github.com/tendermint/go-common"
|
||||||
|
eyes "github.com/tendermint/merkleeyes/client"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
addrPtr := flag.String("address", "tcp://0.0.0.0:46658", "Listen address")
|
||||||
|
eyesPtr := flag.String("eyes", "local", "MerkleEyes address, or 'local' for embedded")
|
||||||
|
genFilePath := flag.String("genesis", "", "Genesis file, if any")
|
||||||
|
flag.Parse()
|
||||||
|
|
||||||
|
// Connect to MerkleEyes
|
||||||
|
eyesCli, err := eyes.NewClient(*eyesPtr)
|
||||||
|
if err != nil {
|
||||||
|
cmn.Exit("connect to MerkleEyes: " + err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create Basecoin app
|
||||||
|
app := app.NewBasecoin(eyesCli)
|
||||||
|
|
||||||
|
// add plugins
|
||||||
|
// TODO: add some more, like the cool voting app
|
||||||
|
counter := counter.New("counter")
|
||||||
|
app.RegisterPlugin(counter)
|
||||||
|
|
||||||
|
// If genesis file was specified, set key-value options
|
||||||
|
if *genFilePath != "" {
|
||||||
|
err := app.LoadGenesis(*genFilePath)
|
||||||
|
if err != nil {
|
||||||
|
cmn.Exit(cmn.Fmt("%+v", err))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start the listener
|
||||||
|
svr, err := server.NewServer(*addrPtr, "socket", app)
|
||||||
|
if err != nil {
|
||||||
|
cmn.Exit("create listener: " + err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait forever
|
||||||
|
cmn.TrapSignal(func() {
|
||||||
|
// Cleanup
|
||||||
|
svr.Stop()
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
hash: 3869944d14a8df914ffcad02c2ef3548173daba51c5ea697767f8af77c07b348
|
hash: 3869944d14a8df914ffcad02c2ef3548173daba51c5ea697767f8af77c07b348
|
||||||
updated: 2017-01-15T14:45:40.368426139-08:00
|
updated: 2017-01-28T09:14:54.898268931-08:00
|
||||||
imports:
|
imports:
|
||||||
- name: github.com/btcsuite/btcd
|
- name: github.com/btcsuite/btcd
|
||||||
version: afec1bd1245a4a19e6dfe1306974b733e7cbb9b8
|
version: afec1bd1245a4a19e6dfe1306974b733e7cbb9b8
|
||||||
|
@ -25,6 +25,8 @@ imports:
|
||||||
version: ed8eb9e318d7a84ce5915b495b7d35e0cfe7b5a8
|
version: ed8eb9e318d7a84ce5915b495b7d35e0cfe7b5a8
|
||||||
- name: github.com/mattn/go-isatty
|
- name: github.com/mattn/go-isatty
|
||||||
version: 66b8e73f3f5cda9f96b69efd03dd3d7fc4a5cdb8
|
version: 66b8e73f3f5cda9f96b69efd03dd3d7fc4a5cdb8
|
||||||
|
- name: github.com/pkg/errors
|
||||||
|
version: 248dadf4e9068a0b3e79f02ed0a610d935de5302
|
||||||
- name: github.com/syndtr/goleveldb
|
- name: github.com/syndtr/goleveldb
|
||||||
version: 6ae1797c0b42b9323fc27ff7dcf568df88f2f33d
|
version: 6ae1797c0b42b9323fc27ff7dcf568df88f2f33d
|
||||||
subpackages:
|
subpackages:
|
||||||
|
@ -41,7 +43,7 @@ imports:
|
||||||
- leveldb/table
|
- leveldb/table
|
||||||
- leveldb/util
|
- leveldb/util
|
||||||
- name: github.com/tendermint/abci
|
- name: github.com/tendermint/abci
|
||||||
version: 05096de3687ac582bec63860b3dd384acd9149aa
|
version: 8df0bc3a40ccad0d2be10e33c62c404e65c92502
|
||||||
subpackages:
|
subpackages:
|
||||||
- client
|
- client
|
||||||
- server
|
- server
|
||||||
|
@ -52,7 +54,7 @@ imports:
|
||||||
- edwards25519
|
- edwards25519
|
||||||
- extra25519
|
- extra25519
|
||||||
- name: github.com/tendermint/go-common
|
- name: github.com/tendermint/go-common
|
||||||
version: 70e694ee76f09058ea38c9ba81b4aa621bd54df1
|
version: 339e135776142939d82bc8e699db0bf391fd938d
|
||||||
- name: github.com/tendermint/go-config
|
- name: github.com/tendermint/go-config
|
||||||
version: e64b424499acd0eb9856b88e10c0dff41628c0d6
|
version: e64b424499acd0eb9856b88e10c0dff41628c0d6
|
||||||
- name: github.com/tendermint/go-crypto
|
- name: github.com/tendermint/go-crypto
|
||||||
|
@ -68,7 +70,7 @@ imports:
|
||||||
- name: github.com/tendermint/go-logger
|
- name: github.com/tendermint/go-logger
|
||||||
version: cefb3a45c0bf3c493a04e9bcd9b1540528be59f2
|
version: cefb3a45c0bf3c493a04e9bcd9b1540528be59f2
|
||||||
- name: github.com/tendermint/go-merkle
|
- name: github.com/tendermint/go-merkle
|
||||||
version: 2979c7eb8aa020fa1cf203654907dbb889703888
|
version: 653cb1f631528351ddbc359b994eb0c96f0341cd
|
||||||
- name: github.com/tendermint/go-p2p
|
- name: github.com/tendermint/go-p2p
|
||||||
version: 67c9086b7458eb45b1970483decd01cd744c477a
|
version: 67c9086b7458eb45b1970483decd01cd744c477a
|
||||||
subpackages:
|
subpackages:
|
||||||
|
@ -85,12 +87,12 @@ imports:
|
||||||
subpackages:
|
subpackages:
|
||||||
- term
|
- term
|
||||||
- name: github.com/tendermint/merkleeyes
|
- name: github.com/tendermint/merkleeyes
|
||||||
version: 2cf87e5f049ab6131aa4ea188c1b5b629d9b3bf9
|
version: 00d915af3e425cf57c10afe502fd9e0a6a70acd4
|
||||||
subpackages:
|
subpackages:
|
||||||
- app
|
- app
|
||||||
- client
|
- client
|
||||||
- name: github.com/tendermint/tendermint
|
- name: github.com/tendermint/tendermint
|
||||||
version: 9a2dd8bc9279ed2a1a4d4f31cc151f8a621cceb3
|
version: 7c15b54cccac574cfe673c473d4edff01c2503ec
|
||||||
subpackages:
|
subpackages:
|
||||||
- rpc/core/types
|
- rpc/core/types
|
||||||
- types
|
- types
|
||||||
|
|
|
@ -18,6 +18,5 @@ import:
|
||||||
version: develop
|
version: develop
|
||||||
- package: github.com/tendermint/abci
|
- package: github.com/tendermint/abci
|
||||||
version: develop
|
version: develop
|
||||||
|
|
||||||
- package: github.com/gorilla/websocket
|
- package: github.com/gorilla/websocket
|
||||||
version: v1.1.0
|
version: v1.1.0
|
||||||
|
|
|
@ -32,7 +32,7 @@ func (cp *CounterPlugin) StateKey() []byte {
|
||||||
return []byte(fmt.Sprintf("CounterPlugin{name=%v}.State", cp.name))
|
return []byte(fmt.Sprintf("CounterPlugin{name=%v}.State", cp.name))
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewCounterPlugin(name string) *CounterPlugin {
|
func New(name string) *CounterPlugin {
|
||||||
return &CounterPlugin{
|
return &CounterPlugin{
|
||||||
name: name,
|
name: name,
|
||||||
}
|
}
|
||||||
|
@ -43,7 +43,6 @@ func (cp *CounterPlugin) SetOption(store types.KVStore, key string, value string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cp *CounterPlugin) RunTx(store types.KVStore, ctx types.CallContext, txBytes []byte) (res abci.Result) {
|
func (cp *CounterPlugin) RunTx(store types.KVStore, ctx types.CallContext, txBytes []byte) (res abci.Result) {
|
||||||
|
|
||||||
// Decode tx
|
// Decode tx
|
||||||
var tx CounterTx
|
var tx CounterTx
|
||||||
err := wire.ReadBinaryBytes(txBytes, &tx)
|
err := wire.ReadBinaryBytes(txBytes, &tx)
|
||||||
|
|
|
@ -15,7 +15,7 @@ import (
|
||||||
func TestCounterPlugin(t *testing.T) {
|
func TestCounterPlugin(t *testing.T) {
|
||||||
|
|
||||||
// Basecoin initialization
|
// Basecoin initialization
|
||||||
eyesCli := eyescli.NewLocalClient()
|
eyesCli := eyescli.NewLocalClient("", 0)
|
||||||
chainID := "test_chain_id"
|
chainID := "test_chain_id"
|
||||||
bcApp := app.NewBasecoin(eyesCli)
|
bcApp := app.NewBasecoin(eyesCli)
|
||||||
bcApp.SetOption("base/chainID", chainID)
|
bcApp.SetOption("base/chainID", chainID)
|
||||||
|
@ -23,7 +23,7 @@ func TestCounterPlugin(t *testing.T) {
|
||||||
|
|
||||||
// Add Counter plugin
|
// Add Counter plugin
|
||||||
counterPluginName := "testcounter"
|
counterPluginName := "testcounter"
|
||||||
counterPlugin := NewCounterPlugin(counterPluginName)
|
counterPlugin := New(counterPluginName)
|
||||||
bcApp.RegisterPlugin(counterPlugin)
|
bcApp.RegisterPlugin(counterPlugin)
|
||||||
|
|
||||||
// Account initialization
|
// Account initialization
|
||||||
|
|
|
@ -12,7 +12,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestSendTx(t *testing.T) {
|
func TestSendTx(t *testing.T) {
|
||||||
eyesCli := eyescli.NewLocalClient()
|
eyesCli := eyescli.NewLocalClient("", 0)
|
||||||
chainID := "test_chain_id"
|
chainID := "test_chain_id"
|
||||||
bcApp := app.NewBasecoin(eyesCli)
|
bcApp := app.NewBasecoin(eyesCli)
|
||||||
bcApp.SetOption("base/chainID", chainID)
|
bcApp.SetOption("base/chainID", chainID)
|
||||||
|
@ -58,7 +58,7 @@ func TestSendTx(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestSequence(t *testing.T) {
|
func TestSequence(t *testing.T) {
|
||||||
eyesCli := eyescli.NewLocalClient()
|
eyesCli := eyescli.NewLocalClient("", 0)
|
||||||
chainID := "test_chain_id"
|
chainID := "test_chain_id"
|
||||||
bcApp := app.NewBasecoin(eyesCli)
|
bcApp := app.NewBasecoin(eyesCli)
|
||||||
bcApp.SetOption("base/chainID", chainID)
|
bcApp.SetOption("base/chainID", chainID)
|
||||||
|
|
Loading…
Reference in New Issue