Browse Source

refactored debora/barak. about to add cli for debora

pull/55/head
Jae Kwon 10 years ago
parent
commit
618cd18f8b
7 changed files with 103 additions and 20 deletions
  1. +15
    -2
      cmd/barak/main.go
  2. +5
    -0
      cmd/barak/types/responses.go
  3. +10
    -0
      cmd/barak/types/validator.go
  4. +4
    -6
      cmd/barak/validate.go
  5. +53
    -0
      cmd/debora/commands.go
  6. +11
    -12
      cmd/debora/main.go
  7. +5
    -0
      rpc/handlers.go

+ 15
- 2
cmd/barak/main.go View File

@ -22,7 +22,8 @@ import (
) )
var Routes = map[string]*rpc.RPCFunc{ var Routes = map[string]*rpc.RPCFunc{
"run": rpc.NewRPCFunc(Run, []string{"auth_command"}),
"status": rpc.NewRPCFunc(Status, []string{}),
"run": rpc.NewRPCFunc(Run, []string{"auth_command"}),
// NOTE: also, two special non-JSONRPC routes called "download" and "upload" // NOTE: also, two special non-JSONRPC routes called "download" and "upload"
} }
@ -72,7 +73,19 @@ func main() {
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// RPC main function
// RPC functions
func Status() (*ResponseStatus, error) {
barak.mtx.Lock()
nonce := barak.nonce
validators := barak.validators
barak.mtx.Unlock()
return &ResponseStatus{
Nonce: nonce,
Validators: validators,
}, nil
}
func Run(authCommand AuthCommand) (interface{}, error) { func Run(authCommand AuthCommand) (interface{}, error) {
command, err := parseValidateCommand(authCommand) command, err := parseValidateCommand(authCommand)


+ 5
- 0
cmd/barak/types/responses.go View File

@ -4,6 +4,11 @@ import (
pcm "github.com/tendermint/tendermint/process" pcm "github.com/tendermint/tendermint/process"
) )
type ResponseStatus struct {
Nonce uint64
Validators []Validator
}
type ResponseRunProcess struct { type ResponseRunProcess struct {
} }


+ 10
- 0
cmd/barak/types/validator.go View File

@ -0,0 +1,10 @@
package types
import (
acm "github.com/tendermint/tendermint/account"
)
type Validator struct {
VotingPower uint64
PubKey acm.PubKey
}

+ 4
- 6
cmd/barak/validate.go View File

@ -1,11 +1,9 @@
package main package main
import acm "github.com/tendermint/tendermint/account"
type Validator struct {
VotingPower uint64
PubKey acm.PubKey
}
import (
acm "github.com/tendermint/tendermint/account"
. "github.com/tendermint/tendermint/cmd/barak/types"
)
func validate(signBytes []byte, validators []Validator, signatures []acm.Signature) bool { func validate(signBytes []byte, validators []Validator, signatures []acm.Signature) bool {
var signedPower uint64 var signedPower uint64


+ 53
- 0
cmd/debora/commands.go View File

@ -0,0 +1,53 @@
package main
import (
acm "github.com/tendermint/tendermint/account"
"github.com/tendermint/tendermint/binary"
btypes "github.com/tendermint/tendermint/cmd/barak/types"
. "github.com/tendermint/tendermint/common"
"github.com/tendermint/tendermint/rpc"
)
// Convenience function for a single validator.
func ListProcesses(privKey acm.PrivKey, remote string) (btypes.ResponseListProcesses, error) {
command := btypes.CommandListProcesses{}
nonce := GetNonce(remote)
commandBytes, signature := SignCommand(privKey, nonce+1, command)
response := btypes.ResponseListProcesses{}
_, err := RunAuthCommand(remote, commandBytes, []acm.Signature{signature}, &response)
return response, err
}
//-----------------------------------------------------------------------------
// Utility method to get nonce from the remote.
// The next command should include the returned nonce+1 as nonce.
func GetNonce(remote string) uint64 {
var err error
response := btypes.ResponseStatus{}
_, err = rpc.Call(remote, "status", Arr(), &response)
if err != nil {
panic(Fmt("Error fetching nonce from remote %v: %v", remote, err))
}
return response.Nonce
}
// Each developer runs this
func SignCommand(privKey acm.PrivKey, nonce uint64, command btypes.Command) ([]byte, acm.Signature) {
noncedCommand := btypes.NoncedCommand{
Nonce: nonce,
Command: command,
}
commandJSONBytes := binary.JSONBytes(noncedCommand)
signature := privKey.Sign(commandJSONBytes)
return commandJSONBytes, signature
}
// Somebody aggregates the signatures and calls this.
func RunAuthCommand(remote string, commandJSONBytes []byte, signatures []acm.Signature, dest interface{}) (interface{}, error) {
authCommand := btypes.AuthCommand{
CommandJSONStr: string(commandJSONBytes),
Signatures: signatures,
}
return rpc.Call(remote, "run", Arr(authCommand), dest)
}

+ 11
- 12
cmd/debora/main.go View File

@ -2,19 +2,18 @@ package main
import ( import (
"fmt" "fmt"
btypes "github.com/tendermint/tendermint/cmd/barak/types"
. "github.com/tendermint/tendermint/common"
"github.com/tendermint/tendermint/rpc"
// ctypes "github.com/tendermint/tendermint/rpc/core/types"
acm "github.com/tendermint/tendermint/account"
"github.com/tendermint/tendermint/binary"
) )
func main() { func main() {
// XXX Need to get PrivAccount somehow to sign the request.
// XXX Actually, more like, how do I even sign these?
// XXX Let's just sign it janky for now and modify later.
response := []btypes.ResponseListProcesses{}
response2, err := rpc.Call("http://127.0.0.1:8082", "list_processes", Arr(), &response)
fmt.Printf("%v\n", response)
fmt.Printf("%v (error: %v)\n", response2, err)
var remote string = "http://127.0.0.1:8082"
var err error
var privKey acm.PrivKey
binary.ReadJSON(&privKey, []byte(`
[1,"PRIVKEYBYTES"]
`), &err)
response, err := ListProcesses(privKey, remote)
fmt.Printf("%v (error: %v)\n", response, err)
} }

+ 5
- 0
rpc/handlers.go View File

@ -3,6 +3,7 @@ package rpc
import ( import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"errors"
"fmt" "fmt"
"github.com/tendermint/tendermint/binary" "github.com/tendermint/tendermint/binary"
"github.com/tendermint/tendermint/events" "github.com/tendermint/tendermint/events"
@ -113,6 +114,10 @@ func makeJSONRPCHandler(funcMap map[string]*RPCFunc) http.HandlerFunc {
// covert a list of interfaces to properly typed values // covert a list of interfaces to properly typed values
func jsonParamsToArgs(rpcFunc *RPCFunc, params []interface{}) ([]reflect.Value, error) { func jsonParamsToArgs(rpcFunc *RPCFunc, params []interface{}) ([]reflect.Value, error) {
if len(rpcFunc.argNames) != len(params) {
return nil, errors.New(fmt.Sprintf("Expected %v parameters (%v), got %v (%v)",
len(rpcFunc.argNames), rpcFunc.argNames, len(params), params))
}
values := make([]reflect.Value, len(params)) values := make([]reflect.Value, len(params))
for i, p := range params { for i, p := range params {
ty := rpcFunc.args[i] ty := rpcFunc.args[i]


Loading…
Cancel
Save