Cosmos PR changes (#158)

* Changes necessary for enforced custom account encoding/decoding and keyring keybase changes

* updates cosmos dependency and fixes inconsistency in gas usage for simulated/real txs

* Update PR changes

* Remove unused password prompt when using OS keyring

* Update from changes to sdk

* Update to merged PR commit :the_horns:

* updated code to handle keyring backend options

* update documentation and replace cosmos-sdk with fork (temporarily)

* update cosmos dependency from fork

* update documentation
This commit is contained in:
Austin Abell
2019-12-13 14:50:19 -05:00
committed by GitHub
parent c2646c7b18
commit ce8a94a98e
13 changed files with 342 additions and 76 deletions
+78
View File
@@ -1,12 +1,15 @@
package types
import (
"encoding/json"
"fmt"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/auth"
"github.com/cosmos/cosmos-sdk/x/auth/exported"
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
tmamino "github.com/tendermint/tendermint/crypto/encoding/amino"
"gopkg.in/yaml.v2"
ethcmn "github.com/ethereum/go-ethereum/common"
)
@@ -102,3 +105,78 @@ func (c Storage) Copy() Storage {
return cpy
}
type ethermintAccountPretty struct {
Address sdk.AccAddress `json:"address" yaml:"address"`
Coins sdk.Coins `json:"coins" yaml:"coins"`
PubKey []byte `json:"public_key" yaml:"public_key"`
AccountNumber uint64 `json:"account_number" yaml:"account_number"`
Sequence uint64 `json:"sequence" yaml:"sequence"`
CodeHash string `json:"code_hash" yaml:"code_hash"`
}
// MarshalYAML returns the YAML representation of an account.
func (acc Account) MarshalYAML() (interface{}, error) {
alias := ethermintAccountPretty{
Address: acc.Address,
Coins: acc.Coins,
AccountNumber: acc.AccountNumber,
Sequence: acc.Sequence,
CodeHash: ethcmn.Bytes2Hex(acc.CodeHash),
}
if acc.PubKey != nil {
alias.PubKey = acc.PubKey.Bytes()
fmt.Println(len(alias.PubKey), alias.PubKey)
}
bz, err := yaml.Marshal(alias)
if err != nil {
return nil, err
}
return string(bz), err
}
// MarshalJSON returns the JSON representation of an Account.
func (acc Account) MarshalJSON() ([]byte, error) {
alias := ethermintAccountPretty{
Address: acc.Address,
Coins: acc.Coins,
AccountNumber: acc.AccountNumber,
Sequence: acc.Sequence,
CodeHash: ethcmn.Bytes2Hex(acc.CodeHash),
}
if acc.PubKey != nil {
alias.PubKey = acc.PubKey.Bytes()
}
return json.Marshal(alias)
}
// UnmarshalJSON unmarshals raw JSON bytes into an Account.
func (acc *Account) UnmarshalJSON(bz []byte) error {
acc.BaseAccount = &authtypes.BaseAccount{}
var alias ethermintAccountPretty
if err := json.Unmarshal(bz, &alias); err != nil {
return err
}
if alias.PubKey != nil {
pubk, err := tmamino.PubKeyFromBytes(alias.PubKey)
if err != nil {
return err
}
acc.BaseAccount.PubKey = pubk
}
acc.BaseAccount.Address = alias.Address
acc.BaseAccount.Coins = alias.Coins
acc.BaseAccount.AccountNumber = alias.AccountNumber
acc.BaseAccount.Sequence = alias.Sequence
acc.CodeHash = ethcmn.Hex2Bytes(alias.CodeHash)
return nil
}
+58
View File
@@ -0,0 +1,58 @@
package types
import (
"encoding/json"
"testing"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/auth"
"github.com/stretchr/testify/require"
tmamino "github.com/tendermint/tendermint/crypto/encoding/amino"
"github.com/tendermint/tendermint/crypto/secp256k1"
emintcrypto "github.com/cosmos/ethermint/crypto"
)
func init() {
tmamino.RegisterKeyType(emintcrypto.PubKeySecp256k1{}, emintcrypto.PubKeyAminoName)
tmamino.RegisterKeyType(emintcrypto.PrivKeySecp256k1{}, emintcrypto.PrivKeyAminoName)
}
func TestEthermintAccountJSON(t *testing.T) {
pubkey := secp256k1.GenPrivKey().PubKey()
addr := sdk.AccAddress(pubkey.Address())
coins := sdk.NewCoins(sdk.NewInt64Coin("test", 5))
baseAcc := auth.NewBaseAccount(addr, coins, pubkey, 10, 50)
ethAcc := Account{BaseAccount: baseAcc, CodeHash: []byte{1, 2}}
bz, err := json.Marshal(ethAcc)
require.NoError(t, err)
bz1, err := ethAcc.MarshalJSON()
require.NoError(t, err)
require.Equal(t, string(bz1), string(bz))
var a Account
require.NoError(t, json.Unmarshal(bz, &a))
require.Equal(t, ethAcc.String(), a.String())
require.Equal(t, ethAcc.PubKey, a.PubKey)
}
func TestEthermintPubKeyJSON(t *testing.T) {
privkey, err := emintcrypto.GenerateKey()
require.NoError(t, err)
bz := privkey.PubKey().Bytes()
pubk, err := tmamino.PubKeyFromBytes(bz)
require.NoError(t, err)
require.Equal(t, pubk, privkey.PubKey())
}
func TestSecpPubKeyJSON(t *testing.T) {
pubkey := secp256k1.GenPrivKey().PubKey()
bz := pubkey.Bytes()
pubk, err := tmamino.PubKeyFromBytes(bz)
require.NoError(t, err)
require.Equal(t, pubk, pubkey)
}