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

plasmacli confirmsig query #185

Open
wants to merge 3 commits into
base: develop
Choose a base branch
from
Open
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
47 changes: 47 additions & 0 deletions client/query.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"github.com/FourthState/plasma-mvp-sidechain/store"
"github.com/cosmos/cosmos-sdk/client/context"
ethcmn "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/rlp"
"math/big"
)

Expand Down Expand Up @@ -154,3 +155,49 @@ func Blocks(ctx context.CLIContext, startingHeight *big.Int) ([]store.Block, err

return blocks, nil
}

// Returns confirm sig results for given position
// Trusts connected full node
func ConfirmSignatures(ctx context.CLIContext, position plasma.Position) ([]byte, error) {
key := store.GetOutputKey(position)
hash, err := ctx.QueryStore(key, store.DataStoreName)
if err != nil {
return nil, err
}

txKey := store.GetTxKey(hash)
txBytes, err := ctx.QueryStore(txKey, store.DataStoreName)

var tx store.Transaction
if err := rlp.DecodeBytes(txBytes, &tx); err != nil {
return nil, fmt.Errorf("transaction decoding failed: %s", err.Error())
}

// Look for confirmation signatures
// Ignore error if no confirm sig currently exists in store
var sigs []byte
if len(tx.SpenderTxs[position.OutputIndex]) > 0 {
queryPath := fmt.Sprintf("custom/%s/%s/%s",
store.QuerierRouteName, store.QueryTx, tx.SpenderTxs[position.OutputIndex])
data, err := ctx.Query(queryPath, nil)
if err != nil {
wesgraham marked this conversation as resolved.
Show resolved Hide resolved
return nil, err
}

var spenderTx store.Transaction
if err := json.Unmarshal(data, &spenderTx); err != nil {
return nil, fmt.Errorf("unmarshaling json query response: %s", err)
}
wesgraham marked this conversation as resolved.
Show resolved Hide resolved

for _, input := range spenderTx.Transaction.Inputs {
if input.Position.String() == position.String() {
for _, sig := range input.ConfirmSignatures {
sigs = append(sigs, sig[:]...)
}
}
}
}

return sigs, nil
}

49 changes: 49 additions & 0 deletions cmd/plasmacli/subcmd/eth/query/confirmsig.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package query

import (
"fmt"
"github.com/FourthState/plasma-mvp-sidechain/client"
"github.com/FourthState/plasma-mvp-sidechain/cmd/plasmacli/config"
"github.com/FourthState/plasma-mvp-sidechain/plasma"
"github.com/cosmos/cosmos-sdk/client/context"
"github.com/spf13/cobra"
)

// SigCmd returns the query confirm sig command
func SigCmd() *cobra.Command {
config.AddPersistentTMFlags(sigCmd)
return sigCmd
}

var sigCmd = &cobra.Command{
Use: "sig <position>",
Short: "Query confirm signature information for a given position",
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
// parse position
pos, err := plasma.FromPositionString(args[0])
if err != nil {
return fmt.Errorf("error parsing position: %s", err)
}

wesgraham marked this conversation as resolved.
Show resolved Hide resolved
var sigs []byte
ctx := context.NewCLIContext()
sigs, err = client.ConfirmSignatures(ctx, pos)
if err != nil {
return fmt.Errorf("failed to retrieve confirm signature information: %s", err)
}

wesgraham marked this conversation as resolved.
Show resolved Hide resolved
cmd.SilenceUsage = true

switch len(sigs) {
case 0:
fmt.Printf("No Confirm Signatures Found")
case 65:
fmt.Printf("Confirmation Signatures: 0x%x\n", sigs[:])
case 130:
fmt.Printf("Confirmation Signatures: 0x%x, 0x%x\n", sigs[:65], sigs[65:])
}

return nil
},
}
1 change: 1 addition & 0 deletions cmd/plasmacli/subcmd/eth/query/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ func RootCmd() *cobra.Command {
BlockCmd(),
DepositCmd(),
ExitsCmd(),
SigCmd(),
RootchainCmd(),
)

Expand Down
2 changes: 1 addition & 1 deletion cmd/plasmacli/subcmd/eth/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ var ethCmd = &cobra.Command{
Short: "Interact with the plasma smart contract",
Long: `Configurations for interacting with the rootchain contract can be specified in <dirpath>/plasma.toml.
An eth node instance needs to be running for this command to work.`,
PreRunE: func(cmd *cobra.Command, args []string) error {
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
fmt.Println("setting up eth connection")
plasma, err := config.GetContractConn()
plasmaContract = plasma
Expand Down