Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

More staking work #1858

Merged
merged 6 commits into from
Jul 1, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion configs/single_node/genesis.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"extra_data":null,"genesis_time":"2019-06-13T09:40:50.990285733Z","registry":{"entities":[{"signature":{"public_key":"TqUyj5Q+9vZtqu10yw6Zw7HEX3Ywe0JQA9vHyzY47TU=","signature":"Yx7IvyWipXTNh1nGUGtukolAV3lJ2cy0F+cM6lkyKbMcYavviVEOKGyuLndxyc/o5QTuv3XUeooNeH+2OS7SDw=="},"untrusted_raw_value":"omJpZFggTqUyj5Q+9vZtqu10yw6Zw7HEX3Ywe0JQA9vHyzY47TVxcmVnaXN0cmF0aW9uX3RpbWUaXPHAAA=="}],"runtimes":[{"signature":{"public_key":"TqUyj5Q+9vZtqu10yw6Zw7HEX3Ywe0JQA9vHyzY47TU=","signature":"rQThUvx2oRHTXkbzm2itbzGkhJIaFJ70VeuY+UPY7PnmnaNnw6OKrJowC9QN0MsTTNYJ1qypcMNvJ9sUutsBCg=="},"untrusted_raw_value":"q2JpZFgg//////////////////////////////////////////9ka2luZAFnZ2VuZXNpc6Jqc3RhdGVfcm9vdFggxnK40e9W7Sirh8NiLFEUBpvdOte4+XN0mNDAHs7wlnpvc3RvcmFnZV9yZWNlaXB0omlzaWduYXR1cmVYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqcHVibGljX2tlefZra2V5X21hbmFnZXJYIP//////////////////////////////////////////bHRlZV9oYXJkd2FyZQBxcmVnaXN0cmF0aW9uX3RpbWUaXPHAAHJyZXBsaWNhX2dyb3VwX3NpemUBcnN0b3JhZ2VfZ3JvdXBfc2l6ZQF4GXJlcGxpY2FfZ3JvdXBfYmFja3VwX3NpemUAeBpyZXBsaWNhX2FsbG93ZWRfc3RyYWdnbGVycwB4IHRyYW5zYWN0aW9uX3NjaGVkdWxlcl9ncm91cF9zaXplAQ=="},{"signature":{"public_key":"TqUyj5Q+9vZtqu10yw6Zw7HEX3Ywe0JQA9vHyzY47TU=","signature":"meg8c+dRcpnlFHbs0+tuNziWpdOVa7TczkUy4Bkpgng0ju/WZM89YW1eK6rQEvPnXakiuwFbvJKc7eyRHbeqBg=="},"untrusted_raw_value":"q2JpZFggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABka2luZABnZ2VuZXNpc6Jqc3RhdGVfcm9vdFggxnK40e9W7Sirh8NiLFEUBpvdOte4+XN0mNDAHs7wlnpvc3RvcmFnZV9yZWNlaXB0omlzaWduYXR1cmVYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqcHVibGljX2tlefZra2V5X21hbmFnZXJYIP//////////////////////////////////////////bHRlZV9oYXJkd2FyZQBxcmVnaXN0cmF0aW9uX3RpbWUaXPHAAHJyZXBsaWNhX2dyb3VwX3NpemUBcnN0b3JhZ2VfZ3JvdXBfc2l6ZQF4GXJlcGxpY2FfZ3JvdXBfYmFja3VwX3NpemUAeBpyZXBsaWNhX2FsbG93ZWRfc3RyYWdnbGVycwB4IHRyYW5zYWN0aW9uX3NjaGVkdWxlcl9ncm91cF9zaXplAQ=="}]},"roothash":{"blocks":{}},"staking":{"ledger":null},"storage":{"state":null},"validators":[{"core_address":"127.0.0.1:26656","name":"single-node","power":10,"pub_key":"RPHEs6FhqInmh2upLCDD9j3R7PIEratspDZWZJewFig="}]}
{"extra_data":null,"genesis_time":"2019-07-01T08:45:15.759972576Z","keymanager":{"statuses":null},"registry":{"entities":[{"signature":{"public_key":"TqUyj5Q+9vZtqu10yw6Zw7HEX3Ywe0JQA9vHyzY47TU=","signature":"Yx7IvyWipXTNh1nGUGtukolAV3lJ2cy0F+cM6lkyKbMcYavviVEOKGyuLndxyc/o5QTuv3XUeooNeH+2OS7SDw=="},"untrusted_raw_value":"omJpZFggTqUyj5Q+9vZtqu10yw6Zw7HEX3Ywe0JQA9vHyzY47TVxcmVnaXN0cmF0aW9uX3RpbWUaXPHAAA=="}],"runtimes":[{"signature":{"public_key":"TqUyj5Q+9vZtqu10yw6Zw7HEX3Ywe0JQA9vHyzY47TU=","signature":"rQThUvx2oRHTXkbzm2itbzGkhJIaFJ70VeuY+UPY7PnmnaNnw6OKrJowC9QN0MsTTNYJ1qypcMNvJ9sUutsBCg=="},"untrusted_raw_value":"q2JpZFgg//////////////////////////////////////////9ka2luZAFnZ2VuZXNpc6Jqc3RhdGVfcm9vdFggxnK40e9W7Sirh8NiLFEUBpvdOte4+XN0mNDAHs7wlnpvc3RvcmFnZV9yZWNlaXB0omlzaWduYXR1cmVYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqcHVibGljX2tlefZra2V5X21hbmFnZXJYIP//////////////////////////////////////////bHRlZV9oYXJkd2FyZQBxcmVnaXN0cmF0aW9uX3RpbWUaXPHAAHJyZXBsaWNhX2dyb3VwX3NpemUBcnN0b3JhZ2VfZ3JvdXBfc2l6ZQF4GXJlcGxpY2FfZ3JvdXBfYmFja3VwX3NpemUAeBpyZXBsaWNhX2FsbG93ZWRfc3RyYWdnbGVycwB4IHRyYW5zYWN0aW9uX3NjaGVkdWxlcl9ncm91cF9zaXplAQ=="},{"signature":{"public_key":"TqUyj5Q+9vZtqu10yw6Zw7HEX3Ywe0JQA9vHyzY47TU=","signature":"meg8c+dRcpnlFHbs0+tuNziWpdOVa7TczkUy4Bkpgng0ju/WZM89YW1eK6rQEvPnXakiuwFbvJKc7eyRHbeqBg=="},"untrusted_raw_value":"q2JpZFggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABka2luZABnZ2VuZXNpc6Jqc3RhdGVfcm9vdFggxnK40e9W7Sirh8NiLFEUBpvdOte4+XN0mNDAHs7wlnpvc3RvcmFnZV9yZWNlaXB0omlzaWduYXR1cmVYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqcHVibGljX2tlefZra2V5X21hbmFnZXJYIP//////////////////////////////////////////bHRlZV9oYXJkd2FyZQBxcmVnaXN0cmF0aW9uX3RpbWUaXPHAAHJyZXBsaWNhX2dyb3VwX3NpemUBcnN0b3JhZ2VfZ3JvdXBfc2l6ZQF4GXJlcGxpY2FfZ3JvdXBfYmFja3VwX3NpemUAeBpyZXBsaWNhX2FsbG93ZWRfc3RyYWdnbGVycwB4IHRyYW5zYWN0aW9uX3NjaGVkdWxlcl9ncm91cF9zaXplAQ=="}]},"roothash":{"blocks":{}},"staking":{"common_pool":"0","ledger":{"TqUyj5Q+9vZtqu10yw6Zw7HEX3Ywe0JQA9vHyzY47TU=":{"escrow_balance":"100000000000","general_balance":"100000000000","nonce":0}},"total_supply":"200000000000"},"storage":{"state":null},"validators":[{"core_address":"127.0.0.1:26656","name":"single-node","power":10,"pub_key":"RPHEs6FhqInmh2upLCDD9j3R7PIEratspDZWZJewFig="}]}
2 changes: 1 addition & 1 deletion configs/single_node_sgx/genesis.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"extra_data":null,"genesis_time":"2019-06-13T09:40:51.108454277Z","registry":{"entities":[{"signature":{"public_key":"TqUyj5Q+9vZtqu10yw6Zw7HEX3Ywe0JQA9vHyzY47TU=","signature":"Yx7IvyWipXTNh1nGUGtukolAV3lJ2cy0F+cM6lkyKbMcYavviVEOKGyuLndxyc/o5QTuv3XUeooNeH+2OS7SDw=="},"untrusted_raw_value":"omJpZFggTqUyj5Q+9vZtqu10yw6Zw7HEX3Ywe0JQA9vHyzY47TVxcmVnaXN0cmF0aW9uX3RpbWUaXPHAAA=="}],"runtimes":[{"signature":{"public_key":"TqUyj5Q+9vZtqu10yw6Zw7HEX3Ywe0JQA9vHyzY47TU=","signature":"h87+YyWUvVIdwF66M8WAF2o2L+uAjqQqLpt4uqKiuqX5BI3EBmRdK4hiyrYycWBa2K3lAWYJJtFe5eovKLekBA=="},"untrusted_raw_value":"q2JpZFgg//////////////////////////////////////////9ka2luZAFnZ2VuZXNpc6Jqc3RhdGVfcm9vdFggxnK40e9W7Sirh8NiLFEUBpvdOte4+XN0mNDAHs7wlnpvc3RvcmFnZV9yZWNlaXB0omlzaWduYXR1cmVYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqcHVibGljX2tlefZra2V5X21hbmFnZXJYIP//////////////////////////////////////////bHRlZV9oYXJkd2FyZQFxcmVnaXN0cmF0aW9uX3RpbWUaXPHAAHJyZXBsaWNhX2dyb3VwX3NpemUBcnN0b3JhZ2VfZ3JvdXBfc2l6ZQF4GXJlcGxpY2FfZ3JvdXBfYmFja3VwX3NpemUAeBpyZXBsaWNhX2FsbG93ZWRfc3RyYWdnbGVycwB4IHRyYW5zYWN0aW9uX3NjaGVkdWxlcl9ncm91cF9zaXplAQ=="},{"signature":{"public_key":"TqUyj5Q+9vZtqu10yw6Zw7HEX3Ywe0JQA9vHyzY47TU=","signature":"KECsvSKJJLpLLYFthrihr4uFna2U5HE0KmFVMk3kjtv3NAFBpkqW/Rrk1QYP7G1nFW/lLwi34VLI46BdnamxCw=="},"untrusted_raw_value":"q2JpZFggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABka2luZABnZ2VuZXNpc6Jqc3RhdGVfcm9vdFggxnK40e9W7Sirh8NiLFEUBpvdOte4+XN0mNDAHs7wlnpvc3RvcmFnZV9yZWNlaXB0omlzaWduYXR1cmVYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqcHVibGljX2tlefZra2V5X21hbmFnZXJYIP//////////////////////////////////////////bHRlZV9oYXJkd2FyZQFxcmVnaXN0cmF0aW9uX3RpbWUaXPHAAHJyZXBsaWNhX2dyb3VwX3NpemUBcnN0b3JhZ2VfZ3JvdXBfc2l6ZQF4GXJlcGxpY2FfZ3JvdXBfYmFja3VwX3NpemUAeBpyZXBsaWNhX2FsbG93ZWRfc3RyYWdnbGVycwB4IHRyYW5zYWN0aW9uX3NjaGVkdWxlcl9ncm91cF9zaXplAQ=="}]},"roothash":{"blocks":{}},"staking":{"ledger":null},"storage":{"state":null},"validators":[{"core_address":"127.0.0.1:26656","name":"single-node","power":10,"pub_key":"RPHEs6FhqInmh2upLCDD9j3R7PIEratspDZWZJewFig="}]}
{"extra_data":null,"genesis_time":"2019-07-01T08:45:15.890698916Z","keymanager":{"statuses":null},"registry":{"entities":[{"signature":{"public_key":"TqUyj5Q+9vZtqu10yw6Zw7HEX3Ywe0JQA9vHyzY47TU=","signature":"Yx7IvyWipXTNh1nGUGtukolAV3lJ2cy0F+cM6lkyKbMcYavviVEOKGyuLndxyc/o5QTuv3XUeooNeH+2OS7SDw=="},"untrusted_raw_value":"omJpZFggTqUyj5Q+9vZtqu10yw6Zw7HEX3Ywe0JQA9vHyzY47TVxcmVnaXN0cmF0aW9uX3RpbWUaXPHAAA=="}],"runtimes":[{"signature":{"public_key":"TqUyj5Q+9vZtqu10yw6Zw7HEX3Ywe0JQA9vHyzY47TU=","signature":"h87+YyWUvVIdwF66M8WAF2o2L+uAjqQqLpt4uqKiuqX5BI3EBmRdK4hiyrYycWBa2K3lAWYJJtFe5eovKLekBA=="},"untrusted_raw_value":"q2JpZFgg//////////////////////////////////////////9ka2luZAFnZ2VuZXNpc6Jqc3RhdGVfcm9vdFggxnK40e9W7Sirh8NiLFEUBpvdOte4+XN0mNDAHs7wlnpvc3RvcmFnZV9yZWNlaXB0omlzaWduYXR1cmVYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqcHVibGljX2tlefZra2V5X21hbmFnZXJYIP//////////////////////////////////////////bHRlZV9oYXJkd2FyZQFxcmVnaXN0cmF0aW9uX3RpbWUaXPHAAHJyZXBsaWNhX2dyb3VwX3NpemUBcnN0b3JhZ2VfZ3JvdXBfc2l6ZQF4GXJlcGxpY2FfZ3JvdXBfYmFja3VwX3NpemUAeBpyZXBsaWNhX2FsbG93ZWRfc3RyYWdnbGVycwB4IHRyYW5zYWN0aW9uX3NjaGVkdWxlcl9ncm91cF9zaXplAQ=="},{"signature":{"public_key":"TqUyj5Q+9vZtqu10yw6Zw7HEX3Ywe0JQA9vHyzY47TU=","signature":"KECsvSKJJLpLLYFthrihr4uFna2U5HE0KmFVMk3kjtv3NAFBpkqW/Rrk1QYP7G1nFW/lLwi34VLI46BdnamxCw=="},"untrusted_raw_value":"q2JpZFggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABka2luZABnZ2VuZXNpc6Jqc3RhdGVfcm9vdFggxnK40e9W7Sirh8NiLFEUBpvdOte4+XN0mNDAHs7wlnpvc3RvcmFnZV9yZWNlaXB0omlzaWduYXR1cmVYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqcHVibGljX2tlefZra2V5X21hbmFnZXJYIP//////////////////////////////////////////bHRlZV9oYXJkd2FyZQFxcmVnaXN0cmF0aW9uX3RpbWUaXPHAAHJyZXBsaWNhX2dyb3VwX3NpemUBcnN0b3JhZ2VfZ3JvdXBfc2l6ZQF4GXJlcGxpY2FfZ3JvdXBfYmFja3VwX3NpemUAeBpyZXBsaWNhX2FsbG93ZWRfc3RyYWdnbGVycwB4IHRyYW5zYWN0aW9uX3NjaGVkdWxlcl9ncm91cF9zaXplAQ=="}]},"roothash":{"blocks":{}},"staking":{"common_pool":"0","ledger":{"TqUyj5Q+9vZtqu10yw6Zw7HEX3Ywe0JQA9vHyzY47TU=":{"escrow_balance":"100000000000","general_balance":"100000000000","nonce":0}},"total_supply":"200000000000"},"storage":{"state":null},"validators":[{"core_address":"127.0.0.1:26656","name":"single-node","power":10,"pub_key":"RPHEs6FhqInmh2upLCDD9j3R7PIEratspDZWZJewFig="}]}
1 change: 1 addition & 0 deletions go/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,5 @@ grpc/storage/*.pb.go
grpc/client/*.pb.go
grpc/enclaverpc/*.pb.go
grpc/txnscheduler/*.pb.go
grpc/staking/*.pb.go
common/sgx/aesm/*.pb.go
80 changes: 79 additions & 1 deletion go/ekiden/cmd/genesis/genesis.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ package genesis
import (
"errors"
"io/ioutil"
"math/big"
"os"
"time"

Expand All @@ -21,6 +22,7 @@ import (
registry "github.com/oasislabs/ekiden/go/registry/api"
roothash "github.com/oasislabs/ekiden/go/roothash/api"
"github.com/oasislabs/ekiden/go/roothash/api/block"
staking "github.com/oasislabs/ekiden/go/staking/api"
storage "github.com/oasislabs/ekiden/go/storage/api"
)

Expand All @@ -30,6 +32,7 @@ const (
cfgRuntime = "runtime"
cfgRootHash = "roothash"
cfgKeyManager = "keymanager"
cfgStaking = "staking"
cfgStorage = "storage"
cfgValidator = "validator"
)
Expand Down Expand Up @@ -130,6 +133,14 @@ func doInitGenesis(cmd *cobra.Command, args []string) {
return
}

staking := viper.GetString(cfgStaking)
if err := AppendStakingState(doc, staking, logger); err != nil {
logger.Error("failed to parse staking genesis state",
"err", err,
)
return
}

storage := viper.GetStringSlice(cfgStorage)
if err := AppendStorageState(doc, storage, logger); err != nil {
logger.Error("failed to parse storage genesis state",
Expand All @@ -138,6 +149,8 @@ func doInitGenesis(cmd *cobra.Command, args []string) {
return
}

// TODO: Ensure consistency/sanity.

b := json.Marshal(doc)
if err := ioutil.WriteFile(f, b, 0600); err != nil {
logger.Error("failed to save generated genesis document",
Expand Down Expand Up @@ -179,6 +192,8 @@ func AppendRegistryState(doc *genesis.Document, entities, runtimes []string, l *
regSt.Entities = append(regSt.Entities, &entity)
}
if flags.DebugTestEntity() {
l.Warn("registering debug test entity")

ent, privKey, err := entity.TestEntity()
if err != nil {
l.Error("failed to retrive test entity",
Expand Down Expand Up @@ -309,10 +324,71 @@ func AppendKeyManagerState(doc *genesis.Document, statuses []string, l *logging.
return nil
}

// AppendStakingState appens the staking gensis state given a state file name.
func AppendStakingState(doc *genesis.Document, state string, l *logging.Logger) error {
stakingSt := staking.Genesis{
Ledger: make(map[signature.MapKey]*staking.GenesisLedgerEntry),
}

if state != "" {
b, err := ioutil.ReadFile(state)
if err != nil {
l.Error("failed to load genesis staking status",
"err", err,
"filename", state,
)
return err
}

if err = json.Unmarshal(b, &stakingSt); err != nil {
l.Error("failed to parse genesis staking status",
"err", err,
"filename", state,
)
return err
}
}
if flags.DebugTestEntity() {
l.Warn("granting stake to the debug test entity")

ent, _, err := entity.TestEntity()
if err != nil {
l.Error("failed to retrive test entity",
"err", err,
)
return err
}

// Ok then, we hold the world ransom for One Hundred Billion Dollars.
var q staking.Quantity
if err = q.FromBigInt(big.NewInt(100000000000)); err != nil {
l.Error("failed to allocate test stake",
"err", err,
)
return err
}

stakingSt.Ledger[ent.ID.ToMapKey()] = &staking.GenesisLedgerEntry{
GeneralBalance: q,
EscrowBalance: q,
Nonce: 0,
}

// Inflate the TotalSupply to account for the account's general and
// escrow balances.
_ = stakingSt.TotalSupply.Add(&q)
_ = stakingSt.TotalSupply.Add(&q)
}

doc.Staking = stakingSt

return nil
}

// AppendStorageState appends the storage genesis state given a vector
// of state filenames.
func AppendStorageState(doc *genesis.Document, states []string, l *logging.Logger) error {
storageSt := storage.Genesis{}
var storageSt storage.Genesis

for _, v := range states {
b, err := ioutil.ReadFile(v)
Expand Down Expand Up @@ -347,6 +423,7 @@ func registerInitGenesisFlags(cmd *cobra.Command) {
cmd.Flags().StringSlice(cfgEntity, nil, "path to entity registration file")
cmd.Flags().StringSlice(cfgRuntime, nil, "path to runtime registration file")
cmd.Flags().StringSlice(cfgRootHash, nil, "path to roothash genesis blocks file")
cmd.Flags().String(cfgStaking, "", "path to staking genesis file")
cmd.Flags().StringSlice(cfgKeyManager, nil, "path to key manager genesis status file")
cmd.Flags().StringSlice(cfgStorage, nil, "path to storage genesis state file")
cmd.Flags().StringSlice(cfgValidator, nil, "path to validator file")
Expand All @@ -358,6 +435,7 @@ func registerInitGenesisFlags(cmd *cobra.Command) {
cfgRuntime,
cfgRootHash,
cfgKeyManager,
cfgStaking,
cfgStorage,
cfgValidator,
} {
Expand Down
1 change: 1 addition & 0 deletions go/ekiden/cmd/node/node.go
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@ func (n *Node) initBackends() error {
// Initialize and register the internal gRPC services.
grpcSrv := n.grpcInternal.Server()
registry.NewGRPCServer(grpcSrv, n.Registry)
staking.NewGRPCServer(grpcSrv, n.Staking)
storage.NewGRPCServer(grpcSrv, n.Storage)
dummydebug.NewGRPCServer(grpcSrv, n.Epochtime, n.Registry)

Expand Down
2 changes: 1 addition & 1 deletion go/ekiden/node_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ var (
{"storage.backend", "leveldb"},
{"storage.debug.mock_signing_key", true},
{"staking.backend", "tendermint"},
{"staking.debug.genesis_state", stakingTests.InitialBalancesArg},
{"staking.debug.genesis_state", stakingTests.DebugGenesisState},
{"tendermint.consensus.timeout_commit", 1 * time.Millisecond},
{"tendermint.consensus.skip_timeout_commit", true},
{"worker.compute.enabled", true},
Expand Down
1 change: 1 addition & 0 deletions go/grpc/build_protos.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ var protoFiles = [][]string{
{"client/client.proto"},
{"enclaverpc/enclaverpc.proto"},
{"txnscheduler/txnscheduler.proto"},
{"staking/staking.proto"},
}

//
Expand Down
137 changes: 137 additions & 0 deletions go/grpc/staking/staking.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
syntax = "proto3";

package staking;
option go_package = "github.com/oasislabs/ekiden/go/grpc/staking";

service Staking {
// Calls that query.
rpc GetName(GetNameRequest) returns (GetNameResponse) {}
rpc GetSymbol(GetSymbolRequest) returns (GetSymbolResponse) {}
rpc GetTotalSupply(GetTotalSupplyRequest) returns (GetTotalSupplyResponse) {}
rpc GetCommonPool(GetCommonPoolRequest) returns (GetCommonPoolResponse) {}
rpc GetAccounts(GetAccountsRequest) returns (GetAccountsResponse) {} // TODO: Stream this?
rpc GetAccountInfo(GetAccountInfoRequest) returns (GetAccountInfoResponse) {}
rpc GetAllowance(GetAllowanceRequest) returns (GetAllowanceResponse) {}

// Calls that mutate state.
rpc Transfer(TransferRequest) returns (TransferResponse) {}
rpc Approve(ApproveRequest) returns (ApproveResponse) {}
rpc Withdraw(WithdrawRequest) returns (WithdrawResponse) {}
rpc Burn(BurnRequest) returns (BurnResponse) {}
rpc AddEscrow(AddEscrowRequest) returns (AddEscrowResponse) {}

// Calls that watch events.
rpc WatchTransfers (WatchTransfersRequest) returns (stream WatchTransfersResponse) {}
rpc WatchApprovals (WatchApprovalsRequest) returns (stream WatchApprovalsResponse) {}
rpc WatchBurns (WatchBurnsRequest) returns (stream WatchBurnsResponse) {}
rpc WatchEscrows (WatchEscrowsRequest) returns (stream WatchEscrowsResponse) {}
}

message GetNameRequest {}

message GetNameResponse {
string name = 1;
}

message GetSymbolRequest {}

message GetSymbolResponse {
string symbol = 1;
}

message GetTotalSupplyRequest {}

message GetTotalSupplyResponse {
bytes total_supply = 1;
}

message GetCommonPoolRequest {}

message GetCommonPoolResponse {
bytes common_pool = 1;
}

message GetAccountsRequest {}

message GetAccountsResponse {
repeated bytes ids = 1;
}

message GetAccountInfoRequest {
bytes id = 1;
}

message GetAccountInfoResponse {
bytes general_balance = 1;
bytes escrow_balance = 2;
uint64 nonce = 3;
}

message GetAllowanceRequest {
bytes owner = 1;
bytes spender = 2;
}

message GetAllowanceResponse {
bytes allowance = 1;
}

message TransferRequest {
bytes signed_transfer = 1;
}

message TransferResponse {}

message ApproveRequest {
bytes signed_approval = 1;
}

message ApproveResponse {}

message WithdrawRequest {
bytes signed_withdrawal = 1;
}

message WithdrawResponse {}

message BurnRequest {
bytes signed_burn = 1;
}

message BurnResponse {}

message AddEscrowRequest {
bytes signed_escrow = 1;
}

message AddEscrowResponse {}

message WatchTransfersRequest {}

message WatchTransfersResponse {
bytes event = 1;
}

message WatchApprovalsRequest {}

message WatchApprovalsResponse {
bytes event = 1;
}

message WatchBurnsRequest {}

message WatchBurnsResponse {
bytes event = 1;
}

message WatchEscrowsRequest {}

message WatchEscrowsResponse {
enum EventType {
ADD = 0;
TAKE = 1;
RELEASE = 2;
}
EventType event_type = 1;
bytes event = 2;
}
49 changes: 13 additions & 36 deletions go/staking/api/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,6 @@ package api
import (
"context"
"errors"
"math/big"

wrerr "github.com/pkg/errors"

"github.com/oasislabs/ekiden/go/common/cbor"
"github.com/oasislabs/ekiden/go/common/crypto/signature"
Expand Down Expand Up @@ -73,6 +70,9 @@ type Backend interface {
// TotalSupply returns the total nmber of tokens.
TotalSupply(ctx context.Context) (*Quantity, error)

// CommonPool returns the common pool balance.
CommonPool(ctx context.Context) (*Quantity, error)

// Accounts returns the IDs of all accounts with a non-zero general
// or escrow balance.
Accounts(ctx context.Context) ([]signature.PublicKey, error)
Expand Down Expand Up @@ -397,39 +397,16 @@ func MoveUpTo(dst, src, n *Quantity) (*Quantity, error) {
// Genesis is the initial ledger balances at genesis for use in the genesis
// block and test cases.
type Genesis struct {
Ledger map[signature.MapKey]*Quantity `codec:"ledger"`
}

// NewGenesis constructs a initial ledger from a hex public key to initial
// balance map.
func NewGenesis(m map[string]string) (*Genesis, error) {
s := &Genesis{
Ledger: make(map[signature.MapKey]*Quantity),
}

for k, v := range m {
var id signature.PublicKey
if err := id.UnmarshalHex(k); err != nil {
return nil, wrerr.Wrap(err, "staking: malformed account ID")
}
TotalSupply Quantity `codec:"total_supply"`
CommonPool Quantity `codec:"common_pool"`

mk := id.ToMapKey()
if s.Ledger[mk] != nil {
return nil, wrerr.New("staking: redundant initial account")
}

var tmp big.Int
if err := tmp.UnmarshalText([]byte(v)); err != nil {
return nil, wrerr.Wrap(err, "staking: malformed initial balance")
}

var initialBalance Quantity
if err := initialBalance.FromBigInt(&tmp); err != nil {
return nil, wrerr.Wrap(err, "staking: invalid initial balance")
}

s.Ledger[mk] = &initialBalance
}
Ledger map[signature.MapKey]*GenesisLedgerEntry `codec:"ledger"`
}

return s, nil
// GenesisLedgerEntry is the per-account ledger entry for the genesis block.
type GenesisLedgerEntry struct {
GeneralBalance Quantity `codec:"general_balance"`
EscrowBalance Quantity `codec:"escrow_balance"`
Nonce uint64 `codec:"nonce"`
Allowances map[signature.MapKey]*Quantity `codec:"allowances,omitempty"`
}
Loading