From dcd4fb51d77988a7b9a1bec5cf12485242585b6e Mon Sep 17 00:00:00 2001 From: Hleb Albau Date: Wed, 23 Jan 2019 13:37:42 +0700 Subject: [PATCH 01/38] Update cosmos to latest develop --- app/ante.go | 101 ++++++++++ app/app.go | 98 +++++----- app/export.go | 16 +- app/fee.go | 20 ++ app/{genesis => }/genesis.go | 109 ++++++++--- app/genesis/params.go | 22 --- app/hooks.go | 64 ++++--- app/keys.go | 40 ++-- app/wire.go | 4 +- cli/main.go | 4 +- client/http_client.go | 14 +- daemon/{init => cmd}/add_genesis_acc.go | 7 +- daemon/{init => cmd}/collect.go | 20 +- daemon/{init => cmd}/generate.go | 2 +- daemon/{init => cmd}/generate_accs.go | 9 +- .../{genesis => cmd}/generate_genesis_file.go | 27 ++- daemon/{init => cmd}/gentx.go | 177 ++++++++++++++---- daemon/{init => cmd}/init.go | 19 +- daemon/{init => cmd}/testnet.go | 30 +-- daemon/{init => cmd}/utils.go | 36 ++-- daemon/main.go | 9 +- go.mod | 9 +- go.sum | 15 +- x/bandwidth/genesis.go | 9 +- x/bank/keeper.go | 8 +- x/mint/abci.go | 13 -- x/mint/minter.go | 28 --- x/mint/params.go | 11 -- 28 files changed, 582 insertions(+), 339 deletions(-) create mode 100644 app/ante.go create mode 100644 app/fee.go rename app/{genesis => }/genesis.go (70%) delete mode 100644 app/genesis/params.go rename daemon/{init => cmd}/add_genesis_acc.go (90%) rename daemon/{init => cmd}/collect.go (86%) rename daemon/{init => cmd}/generate.go (97%) rename daemon/{init => cmd}/generate_accs.go (90%) rename daemon/{genesis => cmd}/generate_genesis_file.go (83%) rename daemon/{init => cmd}/gentx.go (50%) rename daemon/{init => cmd}/init.go (86%) rename daemon/{init => cmd}/testnet.go (93%) rename daemon/{init => cmd}/utils.go (80%) delete mode 100644 x/mint/abci.go delete mode 100644 x/mint/minter.go delete mode 100644 x/mint/params.go diff --git a/app/ante.go b/app/ante.go new file mode 100644 index 00000000..bafb2f6f --- /dev/null +++ b/app/ante.go @@ -0,0 +1,101 @@ +package app + +import ( + "fmt" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth" +) + +// should be removed after cosmos refactor +func NewAnteHandler(ak auth.AccountKeeper) sdk.AnteHandler { + return func(ctx sdk.Context, tx sdk.Tx, simulate bool) (newCtx sdk.Context, res sdk.Result, abort bool) { + + //todo really need it? + newCtx = auth.SetGasMeter(true, ctx, 0) + + // all transactions must be of type auth.StdTx + stdTx, ok := tx.(auth.StdTx) + if !ok { + return newCtx, sdk.ErrInternal("tx must be StdTx").Result(), true + } + + params := ak.GetParams(ctx) + if err := tx.ValidateBasic(); err != nil { + return newCtx, err.Result(), true + } + + if res := validateMemo(stdTx, params); !res.IsOK() { + return newCtx, res, true + } + + // stdSigs contains the sequence number, account number, and signatures. + // When simulating, this would just be a 0-length slice. + signerAddrs := stdTx.GetSigners() + stdSigs := stdTx.GetSignatures() + isGenesis := ctx.BlockHeight() == 0 + signerAccs := make([]auth.Account, len(signerAddrs)) + + for i := 0; i < len(stdSigs); i++ { + // skip the fee payer, account is cached and fees were deducted already + if i != 0 { + signerAccs[i], res = auth.GetSignerAcc(newCtx, ak, signerAddrs[i]) + if !res.IsOK() { + return newCtx, res, true + } + } + + // check signature, return account with incremented nonce + signBytes := auth.GetSignBytes(newCtx.ChainID(), stdTx, signerAccs[i], isGenesis) + signerAccs[i], res = processSig(signerAccs[i], stdSigs[i], signBytes, simulate) + if !res.IsOK() { + return newCtx, res, true + } + + ak.SetAccount(newCtx, signerAccs[i]) + } + + return newCtx, sdk.Result{}, false // continue... + } +} + +func validateMemo(stdTx auth.StdTx, params auth.Params) sdk.Result { + memoLength := len(stdTx.GetMemo()) + if uint64(memoLength) > params.MaxMemoCharacters { + return sdk.ErrMemoTooLarge( + fmt.Sprintf( + "maximum number of characters is %d but received %d characters", + params.MaxMemoCharacters, memoLength, + ), + ).Result() + } + + return sdk.Result{} +} + +// verify the signature and increment the sequence. If the account doesn't have a pubkey, set it. +func processSig( + acc auth.Account, sig auth.StdSignature, signBytes []byte, simulate bool, +) (updatedAcc auth.Account, res sdk.Result) { + + pubKey, res := auth.ProcessPubKey(acc, sig, simulate) + if !res.IsOK() { + return nil, res + } + + err := acc.SetPubKey(pubKey) + if err != nil { + return nil, sdk.ErrInternal("setting PubKey on signer's account").Result() + } + + if !simulate && !pubKey.VerifyBytes(signBytes, sig.Signature) { + return nil, sdk.ErrUnauthorized("signature verification failed").Result() + } + + err = acc.SetSequence(acc.GetSequence() + 1) + if err != nil { + // Handle w/ #870 + panic(err) + } + + return acc, res +} diff --git a/app/app.go b/app/app.go index 236e7859..1d5fca15 100644 --- a/app/app.go +++ b/app/app.go @@ -6,12 +6,12 @@ import ( "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth" - sdkbank "github.com/cosmos/cosmos-sdk/x/bank" + "github.com/cosmos/cosmos-sdk/x/bank" distr "github.com/cosmos/cosmos-sdk/x/distribution" + "github.com/cosmos/cosmos-sdk/x/mint" "github.com/cosmos/cosmos-sdk/x/params" "github.com/cosmos/cosmos-sdk/x/slashing" - "github.com/cosmos/cosmos-sdk/x/stake" - . "github.com/cybercongress/cyberd/app/genesis" + "github.com/cosmos/cosmos-sdk/x/staking" "github.com/cybercongress/cyberd/store" "github.com/cybercongress/cyberd/types" cbd "github.com/cybercongress/cyberd/types" @@ -23,7 +23,6 @@ import ( "github.com/cybercongress/cyberd/x/link" "github.com/cybercongress/cyberd/x/link/keeper" lnk "github.com/cybercongress/cyberd/x/link/types" - "github.com/cybercongress/cyberd/x/mint" "github.com/cybercongress/cyberd/x/rank" abci "github.com/tendermint/tendermint/abci/types" cmn "github.com/tendermint/tendermint/libs/common" @@ -70,18 +69,16 @@ type CyberdApp struct { // manage getting and setting app data mainKeeper store.MainKeeper accountKeeper auth.AccountKeeper - feeCollectionKeeper auth.FeeCollectionKeeper + feeCollectionKeeper NoopFeeCollectionKeeper bankKeeper cbdbank.Keeper - stakeKeeper stake.Keeper + stakingKeeper staking.Keeper slashingKeeper slashing.Keeper distrKeeper distr.Keeper paramsKeeper params.Keeper accBandwidthKeeper bw.Keeper + mintKeeper mint.Keeper - //inflation - minter mint.Minter - - // cyberd storages + // cyberd storage linkIndexedKeeper keeper.LinkIndexedKeeper cidNumKeeper keeper.CidNumberKeeper stakeIndex *cbdbank.IndexedKeeper @@ -128,36 +125,40 @@ func NewCyberdApp( computeUnit: computeUnit, } - // define and attach the mappers and keepers - app.accountKeeper = auth.NewAccountKeeper(app.cdc, dbKeys.acc, cbd.NewCyberdAccount) + app.feeCollectionKeeper = NoopFeeCollectionKeeper{} app.paramsKeeper = params.NewKeeper(app.cdc, dbKeys.params, dbKeys.tParams) - app.feeCollectionKeeper = auth.NewFeeCollectionKeeper(app.cdc, dbKeys.fees) + app.accBandwidthKeeper = bandwidth.NewAccBandwidthKeeper(dbKeys.accBandwidth) - var stakeKeeper stake.Keeper + app.accountKeeper = auth.NewAccountKeeper( + app.cdc, dbKeys.acc, + app.paramsKeeper.Subspace(auth.DefaultParamspace), cbd.NewCyberdAccount, + ) - app.bankKeeper = cbdbank.NewBankKeeper(app.accountKeeper, &stakeKeeper) + var stakingKeeper staking.Keeper + app.bankKeeper = cbdbank.NewBankKeeper(app.accountKeeper, &stakingKeeper) app.bankKeeper.AddHook(bandwidth.CollectAddressesWithStakeChange()) - app.accBandwidthKeeper = bandwidth.NewAccBandwidthKeeper(dbKeys.accBandwidth) - - stakeKeeper = stake.NewKeeper( + stakingKeeper = staking.NewKeeper( app.cdc, dbKeys.stake, dbKeys.tStake, app.bankKeeper, - app.paramsKeeper.Subspace(stake.DefaultParamspace), - stake.DefaultCodespace, + app.paramsKeeper.Subspace(staking.DefaultParamspace), + staking.DefaultCodespace, ) app.slashingKeeper = slashing.NewKeeper( app.cdc, dbKeys.slashing, - stakeKeeper, app.paramsKeeper.Subspace(slashing.DefaultParamspace), + stakingKeeper, app.paramsKeeper.Subspace(slashing.DefaultParamspace), slashing.DefaultCodespace, ) app.distrKeeper = distr.NewKeeper( app.cdc, dbKeys.distr, app.paramsKeeper.Subspace(distr.DefaultParamspace), - app.bankKeeper, stakeKeeper, app.feeCollectionKeeper, + app.bankKeeper, stakingKeeper, app.feeCollectionKeeper, distr.DefaultCodespace, ) - app.minter = mint.NewMinter(app.feeCollectionKeeper, stakeKeeper) + app.mintKeeper = mint.NewKeeper(app.cdc, dbKeys.mint, + app.paramsKeeper.Subspace(mint.DefaultParamspace), + &stakingKeeper, app.feeCollectionKeeper, + ) // cyberd keepers app.linkIndexedKeeper = keeper.NewLinkIndexedKeeper(keeper.NewBaseLinkKeeper(ms, dbKeys.links)) @@ -166,9 +167,9 @@ func NewCyberdApp( app.rankState = rank.NewRankState(allowSearch) // register the staking hooks - // NOTE: stakeKeeper above are passed by reference, + // NOTE: stakingKeeper above are passed by reference, // so that it can be modified like below: - app.stakeKeeper = *stakeKeeper.SetHooks( + app.stakingKeeper = *stakingKeeper.SetHooks( NewStakeHooks(app.distrKeeper.Hooks(), app.slashingKeeper.Hooks()), ) @@ -178,20 +179,16 @@ func NewCyberdApp( // register message routes app.Router(). - AddRoute("bank", sdkbank.NewHandler(app.bankKeeper)). AddRoute("link", link.NewLinksHandler(app.cidNumKeeper, &app.linkIndexedKeeper, app.accountKeeper)). - AddRoute("stake", stake.NewHandler(app.stakeKeeper)). - AddRoute("distr", distr.NewHandler(app.distrKeeper)). - AddRoute("slashing", slashing.NewHandler(app.slashingKeeper)) + AddRoute(bank.RouterKey, bank.NewHandler(app.bankKeeper)). + AddRoute(staking.RouterKey, staking.NewHandler(app.stakingKeeper)). + AddRoute(distr.RouterKey, distr.NewHandler(app.distrKeeper)). + AddRoute(slashing.RouterKey, slashing.NewHandler(app.slashingKeeper)) app.QueryRouter(). - AddRoute("stake", stake.NewQuerier(app.stakeKeeper, app.cdc)) - - // perform initialization logic - app.SetInitChainer(app.initChainer) - app.SetBeginBlocker(app.BeginBlocker) - app.SetEndBlocker(app.EndBlocker) - app.SetAnteHandler(auth.NewAnteHandler(app.accountKeeper, app.feeCollectionKeeper)) + AddRoute(distr.QuerierRoute, distr.NewQuerier(app.distrKeeper)). + AddRoute(slashing.QuerierRoute, slashing.NewQuerier(app.slashingKeeper, app.cdc)). + AddRoute(staking.QuerierRoute, staking.NewQuerier(app.stakingKeeper, app.cdc)) // mount the multistore and load the latest state app.MountStores(dbKeys.GetStoreKeys()...) @@ -201,6 +198,12 @@ func NewCyberdApp( cmn.Exit(err.Error()) } + // perform initialization logic + app.SetInitChainer(app.initChainer) + app.SetBeginBlocker(app.BeginBlocker) + app.SetEndBlocker(app.EndBlocker) + app.SetAnteHandler(NewAnteHandler(app.accountKeeper)) + ctx := app.BaseApp.NewContext(true, abci.Header{}) app.latestBlockHeight = int64(ms.GetLatestBlockNumber(ctx)) @@ -238,6 +241,7 @@ func NewCyberdApp( return app } +// todo check staking pool has corrected values // initChainer implements the custom application logic that the BaseApp will // invoke upon initialization. In this case, it will take the application's // state provided by 'req' and attempt to deserialize said state. The state @@ -260,15 +264,22 @@ func (app *CyberdApp) initChainer(ctx sdk.Context, req abci.RequestInitChain) ab app.stakeIndex.UpdateStake(types.AccNumber(acc.AccountNumber), acc.Coins.AmountOf(coin.CBD).Int64()) } + // initialize distribution (must happen before staking) + distr.InitGenesis(ctx, app.distrKeeper, genesisState.DistrData) + // load the initial stake information - validators, err := stake.InitGenesis(ctx, app.stakeKeeper, genesisState.StakeData) + validators, err := staking.InitGenesis(ctx, app.stakingKeeper, genesisState.StakingData) if err != nil { panic(err) } - // initialize module-specific stores - slashing.InitGenesis(ctx, app.slashingKeeper, genesisState.SlashingData, genesisState.StakeData) - distr.InitGenesis(ctx, app.distrKeeper, genesisState.DistrData) + // auth.InitGenesis, but without collected fee + app.accountKeeper.SetParams(ctx, genesisState.AuthData.Params) + + slashing.InitGenesis(ctx, app.slashingKeeper, genesisState.SlashingData, genesisState.StakingData) + mint.InitGenesis(ctx, app.mintKeeper, genesisState.MintData) + bandwidth.InitGenesis(ctx, app.bandwidthMeter, app.accBandwidthKeeper, genesisState.GetAddresses()) + err = CyberdValidateGenesisState(genesisState) if err != nil { panic(err) @@ -289,7 +300,7 @@ func (app *CyberdApp) initChainer(ctx sdk.Context, req abci.RequestInitChain) ab } } - validators = app.stakeKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + validators = app.stakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) } // sanity check @@ -307,7 +318,6 @@ func (app *CyberdApp) initChainer(ctx sdk.Context, req abci.RequestInitChain) ab } } - bandwidth.InitGenesis(ctx, app.bandwidthMeter, app.accBandwidthKeeper, genesisState.Accounts) return abci.ResponseInitChain{ Validators: validators, } @@ -433,7 +443,7 @@ func getSignersTags(tx sdk.Tx) sdk.Tags { func (app *CyberdApp) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock { // mint new tokens for the previous block - mint.BeginBlocker(ctx, app.minter) + mint.BeginBlocker(ctx, app.mintKeeper) // distribute rewards for the previous block distr.BeginBlocker(ctx, req, app.distrKeeper) @@ -455,7 +465,7 @@ func (app *CyberdApp) EndBlocker(ctx sdk.Context, _ abci.RequestEndBlock) abci.R app.latestBlockHeight = ctx.BlockHeight() app.mainKeeper.StoreLatestBlockNumber(ctx, uint64(ctx.BlockHeight())) - validatorUpdates, tags := stake.EndBlocker(ctx, app.stakeKeeper) + validatorUpdates, tags := staking.EndBlocker(ctx, app.stakingKeeper) app.stakeIndex.EndBlocker(ctx) newPrice, totalSpentBandwidth := bandwidth.EndBlocker( diff --git a/app/export.go b/app/export.go index dc73d5ef..e74deece 100644 --- a/app/export.go +++ b/app/export.go @@ -3,11 +3,12 @@ package app import ( "encoding/json" "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth" - "github.com/cosmos/cosmos-sdk/x/distribution" + distr "github.com/cosmos/cosmos-sdk/x/distribution" + "github.com/cosmos/cosmos-sdk/x/mint" "github.com/cosmos/cosmos-sdk/x/slashing" - "github.com/cosmos/cosmos-sdk/x/stake" - . "github.com/cybercongress/cyberd/app/genesis" + "github.com/cosmos/cosmos-sdk/x/staking" abci "github.com/tendermint/tendermint/abci/types" tmtypes "github.com/tendermint/tendermint/types" ) @@ -16,6 +17,7 @@ import ( // various parts of the application's state and set of validators. An error is // returned if any step getting the state or set of validators fails. func (app *CyberdApp) ExportAppStateAndValidators() (appState json.RawMessage, validators []tmtypes.GenesisValidator, err error) { + ctx := app.NewContext(true, abci.Header{}) // iterate to get the accounts @@ -28,14 +30,16 @@ func (app *CyberdApp) ExportAppStateAndValidators() (appState json.RawMessage, v app.accountKeeper.IterateAccounts(ctx, appendAccount) genState := NewGenesisState( accounts, - stake.ExportGenesis(ctx, app.stakeKeeper), - distribution.ExportGenesis(ctx, app.distrKeeper), + auth.NewGenesisState(sdk.Coins{}, app.accountKeeper.GetParams(ctx)), + staking.ExportGenesis(ctx, app.stakingKeeper), + mint.ExportGenesis(ctx, app.mintKeeper), + distr.ExportGenesis(ctx, app.distrKeeper), slashing.ExportGenesis(ctx, app.slashingKeeper), ) appState, err = codec.MarshalJSONIndent(app.cdc, genState) if err != nil { return nil, nil, err } - validators = stake.WriteValidators(ctx, app.stakeKeeper) + validators = staking.WriteValidators(ctx, app.stakingKeeper) return appState, validators, nil } diff --git a/app/fee.go b/app/fee.go new file mode 100644 index 00000000..65ce3527 --- /dev/null +++ b/app/fee.go @@ -0,0 +1,20 @@ +package app + +import sdk "github.com/cosmos/cosmos-sdk/types" + +var noCoins = sdk.Coins{} + +//__________________________________________________________________________________ +// fee collection keeper used only for testing +type NoopFeeCollectionKeeper struct{} + +func (fck NoopFeeCollectionKeeper) AddCollectedFees(sdk.Context, sdk.Coins) sdk.Coins { + return noCoins +} + +func (fck NoopFeeCollectionKeeper) GetCollectedFees(_ sdk.Context) sdk.Coins { + return noCoins +} + +func (fck NoopFeeCollectionKeeper) SetCollectedFees(_ sdk.Coins) {} +func (fck NoopFeeCollectionKeeper) ClearCollectedFees(_ sdk.Context) {} diff --git a/app/genesis/genesis.go b/app/genesis.go similarity index 70% rename from app/genesis/genesis.go rename to app/genesis.go index a738d613..f05bb7e1 100644 --- a/app/genesis/genesis.go +++ b/app/genesis.go @@ -1,4 +1,4 @@ -package genesis +package app import ( "encoding/json" @@ -7,42 +7,57 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth" distr "github.com/cosmos/cosmos-sdk/x/distribution" + "github.com/cosmos/cosmos-sdk/x/mint" "github.com/cosmos/cosmos-sdk/x/slashing" - "github.com/cosmos/cosmos-sdk/x/stake" + "github.com/cosmos/cosmos-sdk/x/staking" + "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/cybercongress/cyberd/types/coin" "github.com/pkg/errors" tmtypes "github.com/tendermint/tendermint/types" - "io/ioutil" "os" "path/filepath" "sort" "strings" + "time" ) // State to Unmarshal type GenesisState struct { Accounts []GenesisAccount `json:"accounts"` + AuthData auth.GenesisState `json:"auth"` DistrData distr.GenesisState `json:"distr"` - StakeData stake.GenesisState `json:"stake"` + MintData mint.GenesisState `json:"mint"` + StakingData staking.GenesisState `json:"staking"` SlashingData slashing.GenesisState `json:"slashing"` GenTxs []json.RawMessage `json:"gentxs"` } +func (gs *GenesisState) GetAddresses() []sdk.AccAddress { + addresses := make([]sdk.AccAddress, 0, len(gs.Accounts)) + for _, acc := range gs.Accounts { + addresses = append(addresses, acc.Address) + } + return addresses +} + func NewGenesisState( - accounts []GenesisAccount, stakeData stake.GenesisState, distrData distr.GenesisState, + accounts []GenesisAccount, authData auth.GenesisState, + stakingData staking.GenesisState, mintData mint.GenesisState, + distrData distr.GenesisState, slashingData slashing.GenesisState, ) GenesisState { return GenesisState{ Accounts: accounts, - StakeData: stakeData, + AuthData: authData, + StakingData: stakingData, + MintData: mintData, DistrData: distrData, SlashingData: slashingData, } } -// nolint type GenesisAccount struct { Address sdk.AccAddress `json:"addr"` Amount int64 `json:"amt"` @@ -70,6 +85,21 @@ func (ga *GenesisAccount) ToAccount() (acc *auth.BaseAccount) { } } +const ( + // defaultUnbondingTime reflects three weeks in seconds as the default + // unbonding time. + defaultUnbondingTime = 60 * 60 * 24 * 3 * time.Second +) + +// DefaultParams returns a default set of parameters. +func DefaultStakingParams() types.Params { + return types.Params{ + UnbondingTime: defaultUnbondingTime, + MaxValidators: 146, + BondDenom: coin.CBD, + } +} + // Create the core parameters for genesis initialization for cyberd // note that the pubkey input is this machines pubkey func CyberdAppGenState(cdc *codec.Codec, genDoc tmtypes.GenesisDoc, appGenTxs []json.RawMessage) ( @@ -84,7 +114,7 @@ func CyberdAppGenState(cdc *codec.Codec, genDoc tmtypes.GenesisDoc, appGenTxs [] return genesisState, errors.New("there must be at least one genesis tx") } - stakeData := genesisState.StakeData + stakeData := genesisState.StakingData for i, genTx := range appGenTxs { var tx auth.StdTx if err := cdc.UnmarshalJSON(genTx, &tx); err != nil { @@ -95,28 +125,28 @@ func CyberdAppGenState(cdc *codec.Codec, genDoc tmtypes.GenesisDoc, appGenTxs [] return genesisState, errors.New( "must provide genesis StdTx with exactly 1 CreateValidator message") } - if _, ok := msgs[0].(stake.MsgCreateValidator); !ok { + if _, ok := msgs[0].(staking.MsgCreateValidator); !ok { return genesisState, fmt.Errorf( "genesis transaction %v does not contain a MsgCreateValidator", i) } } for _, acc := range genesisState.Accounts { - // increase the supply - stakeData.Pool.LooseTokens = stakeData.Pool.LooseTokens.Add(sdk.NewDec(acc.Amount)) + stakeData.Pool.NotBondedTokens = stakeData.Pool.NotBondedTokens.Add(sdk.NewInt(acc.Amount)) } - genesisState.StakeData = stakeData + genesisState.StakingData = stakeData genesisState.GenTxs = appGenTxs return genesisState, nil } +// todo set params for each module // NewDefaultGenesisState generates the default state for cyberd. func NewDefaultGenesisState() GenesisState { return GenesisState{ Accounts: nil, - StakeData: stake.GenesisState{ - Pool: stake.InitialPool(), - Params: DefaultStakeParams(), + StakingData: staking.GenesisState{ + Pool: staking.InitialPool(), + Params: DefaultStakingParams(), }, SlashingData: slashing.DefaultGenesisState(), DistrData: distr.DefaultGenesisState(), @@ -126,15 +156,23 @@ func NewDefaultGenesisState() GenesisState { // CyberdValidateGenesisState ensures that the genesis state obeys the expected invariants func CyberdValidateGenesisState(genesisState GenesisState) (err error) { + err = validateGenesisStateAccounts(genesisState.Accounts) if err != nil { return } - // skip stakeData validation as genesis is created from txs - if len(genesisState.GenTxs) > 0 { - return nil + + if err := staking.ValidateGenesis(genesisState.StakingData); err != nil { + return err + } + if err := mint.ValidateGenesis(genesisState.MintData); err != nil { + return err + } + if err := distr.ValidateGenesis(genesisState.DistrData); err != nil { + return err } - return stake.ValidateGenesis(genesisState.StakeData) + + return staking.ValidateGenesis(genesisState.StakingData) } // Ensures that there are no duplicate accounts in the genesis state, @@ -162,6 +200,7 @@ func CyberdAppGenStateJSON(cdc *codec.Codec, genDoc tmtypes.GenesisDoc, appGenTx return codec.MarshalJSONIndent(cdc, genesisState) } +// todo move to other place?? // CollectStdTxs processes and validates application's genesis StdTxs and returns // the list of appGenTxs, and persistent peers required to generate genesis.json. func CollectStdTxs(cdc *codec.Codec, moniker string, genTxsDir string, genDoc tmtypes.GenesisDoc) ( @@ -223,17 +262,31 @@ func CollectStdTxs(cdc *codec.Codec, moniker string, genTxsDir string, genDoc tm "each genesis transaction must provide a single genesis message") } - // validate the validator address and funds against the accounts in the state - msg := msgs[0].(stake.MsgCreateValidator) - addr := string(sdk.AccAddress(msg.ValidatorAddr)) - acc, ok := addrMap[addr] - if !ok { + msg := msgs[0].(staking.MsgCreateValidator) + // validate delegator and validator addresses and funds against the accounts in the state + delAddr := msg.DelegatorAddr.String() + valAddr := sdk.AccAddress(msg.ValidatorAddr).String() + + delAcc, delOk := addrMap[delAddr] + _, valOk := addrMap[valAddr] + + var accsNotInGenesis []string + if !delOk { + accsNotInGenesis = append(accsNotInGenesis, delAddr) + } + if !valOk { + accsNotInGenesis = append(accsNotInGenesis, valAddr) + } + if len(accsNotInGenesis) != 0 { return appGenTxs, persistentPeers, fmt.Errorf( - "account %v not in genesis.json: %+v", addr, addrMap) + "account(s) %v not in genesis.json: %+v", strings.Join(accsNotInGenesis, " "), addrMap) } - if sdk.NewInt(acc.Amount).LT(msg.Delegation.Amount) { - err = fmt.Errorf("insufficient fund for the delegation: %s < %s", - acc.Amount, msg.Delegation.Amount) + + if sdk.NewInt(delAcc.Amount).LT(msg.Value.Amount) { + return appGenTxs, persistentPeers, fmt.Errorf( + "insufficient fund for delegation %v: %v < %v", + delAcc.Address, sdk.NewInt(delAcc.Amount), msg.Value.Amount, + ) } // exclude itself from persistent peers diff --git a/app/genesis/params.go b/app/genesis/params.go deleted file mode 100644 index ae18e687..00000000 --- a/app/genesis/params.go +++ /dev/null @@ -1,22 +0,0 @@ -package genesis - -import ( - "github.com/cosmos/cosmos-sdk/x/stake/types" - "github.com/cybercongress/cyberd/types/coin" - "time" -) - -const ( - // defaultUnbondingTime reflects three weeks in seconds as the default - // unbonding time. - defaultUnbondingTime = 60 * 60 * 24 * 3 * time.Second -) - -// DefaultParams returns a default set of parameters. -func DefaultStakeParams() types.Params { - return types.Params{ - UnbondingTime: defaultUnbondingTime, - MaxValidators: 146, - BondDenom: coin.CBD, - } -} diff --git a/app/hooks.go b/app/hooks.go index c3f2fee1..97939329 100644 --- a/app/hooks.go +++ b/app/hooks.go @@ -20,39 +20,49 @@ func NewStakeHooks(dh distr.Hooks, sh slashing.Hooks) Hooks { } // nolint -func (h Hooks) OnValidatorCreated(ctx sdk.Context, valAddr sdk.ValAddress) { - h.sh.OnValidatorCreated(ctx, valAddr) - h.dh.OnValidatorCreated(ctx, valAddr) +func (h Hooks) AfterValidatorCreated(ctx sdk.Context, valAddr sdk.ValAddress) { + h.sh.AfterValidatorCreated(ctx, valAddr) + h.dh.AfterValidatorCreated(ctx, valAddr) } -func (h Hooks) OnValidatorModified(ctx sdk.Context, valAddr sdk.ValAddress) { - h.sh.OnValidatorModified(ctx, valAddr) - h.dh.OnValidatorModified(ctx, valAddr) + +func (h Hooks) BeforeValidatorModified(ctx sdk.Context, valAddr sdk.ValAddress) { + h.dh.BeforeValidatorModified(ctx, valAddr) + h.sh.BeforeValidatorModified(ctx, valAddr) +} + +func (h Hooks) AfterValidatorRemoved(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) { + h.dh.AfterValidatorRemoved(ctx, consAddr, valAddr) + h.sh.AfterValidatorRemoved(ctx, consAddr, valAddr) +} +func (h Hooks) AfterValidatorBonded(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) { + h.dh.AfterValidatorBonded(ctx, consAddr, valAddr) + h.sh.AfterValidatorBonded(ctx, consAddr, valAddr) } -func (h Hooks) OnValidatorRemoved(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) { - h.sh.OnValidatorRemoved(ctx, consAddr, valAddr) - h.dh.OnValidatorRemoved(ctx, consAddr, valAddr) +func (h Hooks) AfterValidatorPowerDidChange(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) { + h.dh.AfterValidatorPowerDidChange(ctx, consAddr, valAddr) + h.sh.AfterValidatorPowerDidChange(ctx, consAddr, valAddr) } -func (h Hooks) OnValidatorBonded(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) { - h.sh.OnValidatorBonded(ctx, consAddr, valAddr) - h.dh.OnValidatorBonded(ctx, consAddr, valAddr) +func (h Hooks) AfterValidatorBeginUnbonding(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) { + h.dh.AfterValidatorBeginUnbonding(ctx, consAddr, valAddr) + h.sh.AfterValidatorBeginUnbonding(ctx, consAddr, valAddr) } -func (h Hooks) OnValidatorPowerDidChange(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) { - h.sh.OnValidatorPowerDidChange(ctx, consAddr, valAddr) - h.dh.OnValidatorPowerDidChange(ctx, consAddr, valAddr) +func (h Hooks) BeforeDelegationCreated(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) { + h.dh.BeforeDelegationCreated(ctx, delAddr, valAddr) + h.sh.BeforeDelegationCreated(ctx, delAddr, valAddr) } -func (h Hooks) OnValidatorBeginUnbonding(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) { - h.sh.OnValidatorBeginUnbonding(ctx, consAddr, valAddr) - h.dh.OnValidatorBeginUnbonding(ctx, consAddr, valAddr) +func (h Hooks) BeforeDelegationSharesModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) { + h.dh.BeforeDelegationSharesModified(ctx, delAddr, valAddr) + h.sh.BeforeDelegationSharesModified(ctx, delAddr, valAddr) } -func (h Hooks) OnDelegationCreated(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) { - h.sh.OnDelegationCreated(ctx, delAddr, valAddr) - h.dh.OnDelegationCreated(ctx, delAddr, valAddr) +func (h Hooks) BeforeDelegationRemoved(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) { + h.dh.BeforeDelegationRemoved(ctx, delAddr, valAddr) + h.sh.BeforeDelegationRemoved(ctx, delAddr, valAddr) } -func (h Hooks) OnDelegationSharesModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) { - h.sh.OnDelegationSharesModified(ctx, delAddr, valAddr) - h.dh.OnDelegationSharesModified(ctx, delAddr, valAddr) +func (h Hooks) AfterDelegationModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) { + h.dh.AfterDelegationModified(ctx, delAddr, valAddr) + h.sh.AfterDelegationModified(ctx, delAddr, valAddr) } -func (h Hooks) OnDelegationRemoved(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) { - h.sh.OnDelegationRemoved(ctx, delAddr, valAddr) - h.dh.OnDelegationRemoved(ctx, delAddr, valAddr) +func (h Hooks) BeforeValidatorSlashed(ctx sdk.Context, valAddr sdk.ValAddress, fraction sdk.Dec) { + h.dh.BeforeValidatorSlashed(ctx, valAddr, fraction) + h.sh.BeforeValidatorSlashed(ctx, valAddr, fraction) } diff --git a/app/keys.go b/app/keys.go index 8556dd73..5d2c6167 100644 --- a/app/keys.go +++ b/app/keys.go @@ -1,6 +1,15 @@ package app -import sdk "github.com/cosmos/cosmos-sdk/types" +import ( + bam "github.com/cosmos/cosmos-sdk/baseapp" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth" + distr "github.com/cosmos/cosmos-sdk/x/distribution" + "github.com/cosmos/cosmos-sdk/x/mint" + "github.com/cosmos/cosmos-sdk/x/params" + "github.com/cosmos/cosmos-sdk/x/slashing" + "github.com/cosmos/cosmos-sdk/x/staking" +) type CyberdAppDbKeys struct { main *sdk.KVStoreKey @@ -12,29 +21,34 @@ type CyberdAppDbKeys struct { rank *sdk.KVStoreKey stake *sdk.KVStoreKey tStake *sdk.TransientStoreKey - fees *sdk.KVStoreKey distr *sdk.KVStoreKey + tDistr *sdk.TransientStoreKey slashing *sdk.KVStoreKey + mint *sdk.KVStoreKey params *sdk.KVStoreKey tParams *sdk.TransientStoreKey accBandwidth *sdk.KVStoreKey } func NewCyberdAppDbKeys() CyberdAppDbKeys { + return CyberdAppDbKeys{ - main: sdk.NewKVStoreKey("main"), - acc: sdk.NewKVStoreKey("acc"), + + main: sdk.NewKVStoreKey(bam.MainStoreKey), + acc: sdk.NewKVStoreKey(auth.StoreKey), + stake: sdk.NewKVStoreKey(staking.StoreKey), + tStake: sdk.NewTransientStoreKey(staking.TStoreKey), + mint: sdk.NewKVStoreKey(mint.StoreKey), + distr: sdk.NewKVStoreKey(distr.StoreKey), + tDistr: sdk.NewTransientStoreKey(distr.TStoreKey), + slashing: sdk.NewKVStoreKey(slashing.StoreKey), + params: sdk.NewKVStoreKey(params.StoreKey), + tParams: sdk.NewTransientStoreKey(params.TStoreKey), + cidNum: sdk.NewKVStoreKey("cid_index"), cidNumReverse: sdk.NewKVStoreKey("cid_index_reverse"), links: sdk.NewKVStoreKey("links"), rank: sdk.NewKVStoreKey("rank"), - stake: sdk.NewKVStoreKey("stake"), - fees: sdk.NewKVStoreKey("fee"), - tStake: sdk.NewTransientStoreKey("transient_stake"), - distr: sdk.NewKVStoreKey("distr"), - slashing: sdk.NewKVStoreKey("slashing"), - params: sdk.NewKVStoreKey("params"), - tParams: sdk.NewTransientStoreKey("transient_params"), accBandwidth: sdk.NewKVStoreKey("acc_bandwidth"), } } @@ -42,12 +56,12 @@ func NewCyberdAppDbKeys() CyberdAppDbKeys { func (k CyberdAppDbKeys) GetStoreKeys() []*sdk.KVStoreKey { return []*sdk.KVStoreKey{ k.main, k.acc, k.cidNum, k.cidNumReverse, k.links, k.rank, k.stake, - k.slashing, k.params, k.distr, k.fees, k.accBandwidth, + k.slashing, k.params, k.distr, k.mint, k.accBandwidth, } } func (k CyberdAppDbKeys) GetTransientStoreKeys() []*sdk.TransientStoreKey { return []*sdk.TransientStoreKey{ - k.tStake, k.tParams, + k.tStake, k.tParams, k.tDistr, } } diff --git a/app/wire.go b/app/wire.go index cb382e1c..6c02a389 100644 --- a/app/wire.go +++ b/app/wire.go @@ -8,7 +8,7 @@ import ( distr "github.com/cosmos/cosmos-sdk/x/distribution" "github.com/cosmos/cosmos-sdk/x/ibc" "github.com/cosmos/cosmos-sdk/x/slashing" - "github.com/cosmos/cosmos-sdk/x/stake" + "github.com/cosmos/cosmos-sdk/x/staking" "github.com/cybercongress/cyberd/x/link" ) @@ -23,7 +23,7 @@ func MakeCodec() *codec.Codec { ibc.RegisterCodec(cdc) distr.RegisterCodec(cdc) auth.RegisterCodec(cdc) - stake.RegisterCodec(cdc) + staking.RegisterCodec(cdc) slashing.RegisterCodec(cdc) link.RegisterCodec(cdc) diff --git a/cli/main.go b/cli/main.go index dd8b7527..513cc8cb 100644 --- a/cli/main.go +++ b/cli/main.go @@ -21,7 +21,7 @@ import ( distClient "github.com/cosmos/cosmos-sdk/x/distribution/client" govClient "github.com/cosmos/cosmos-sdk/x/gov/client" slashingClient "github.com/cosmos/cosmos-sdk/x/slashing/client" - stakeClient "github.com/cosmos/cosmos-sdk/x/stake/client" + stakingClient "github.com/cosmos/cosmos-sdk/x/staking/client" ) const ( @@ -48,7 +48,7 @@ func main() { mc := []sdk.ModuleClients{ govClient.NewModuleClient(storeGov, cdc), distClient.NewModuleClient(storeDist, cdc), - stakeClient.NewModuleClient(storeStake, cdc), + stakingClient.NewModuleClient(storeStake, cdc), slashingClient.NewModuleClient(storeSlashing, cdc), } diff --git a/client/http_client.go b/client/http_client.go index 69b07c17..3b05ea8a 100644 --- a/client/http_client.go +++ b/client/http_client.go @@ -67,13 +67,10 @@ func NewHttpCyberdClient(nodeUrl string, passphrase string, singAddr string) Cyb panic(err) } - txBuilder := authtxb.TxBuilder{ - Gas: 10000000000, - ChainID: status.NodeInfo.Network, - AccountNumber: accountNumber, - TxEncoder: utils.GetTxEncoder(cdc), - Sequence: seq, - } + txBuilder := authtxb.NewTxBuilder( + utils.GetTxEncoder(cdc), accountNumber, seq, 0, 0.0, false, status.NodeInfo.Network, + "", sdk.Coins{}, sdk.NewDecCoins(sdk.Coins{}), + ) return HttpCyberdClient{ tdmClient: tdmHttpClient, @@ -162,7 +159,8 @@ func (c HttpCyberdClient) BroadcastTx(msgs []sdk.Msg) error { if result.Code != 0 { return errors.New(string(result.Log)) } - c.txBuilder.Sequence = c.txBuilder.Sequence + 1 + newBuilder := c.txBuilder.WithSequence(c.txBuilder.GetSequence() + 1) + c.txBuilder = &newBuilder return nil } diff --git a/daemon/init/add_genesis_acc.go b/daemon/cmd/add_genesis_acc.go similarity index 90% rename from daemon/init/add_genesis_acc.go rename to daemon/cmd/add_genesis_acc.go index 04b5bc9a..c55f3014 100644 --- a/daemon/init/add_genesis_acc.go +++ b/daemon/cmd/add_genesis_acc.go @@ -1,9 +1,8 @@ -package init +package cmd import ( "fmt" "github.com/cybercongress/cyberd/app" - . "github.com/cybercongress/cyberd/app/genesis" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/server" @@ -44,14 +43,14 @@ func AddGenesisAccountCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command return err } - var appState GenesisState + var appState app.GenesisState if err = cdc.UnmarshalJSON(genDoc.AppState, &appState); err != nil { return err } acc := auth.NewBaseAccountWithAddress(addr) acc.Coins = coins - appState.Accounts = append(appState.Accounts, NewGenesisAccount(&acc)) + appState.Accounts = append(appState.Accounts, app.NewGenesisAccount(&acc)) appStateJSON, err := cdc.MarshalJSON(appState) if err != nil { diff --git a/daemon/init/collect.go b/daemon/cmd/collect.go similarity index 86% rename from daemon/init/collect.go rename to daemon/cmd/collect.go index e6a4c8d7..ede4610f 100644 --- a/daemon/init/collect.go +++ b/daemon/cmd/collect.go @@ -1,10 +1,10 @@ -package init +package cmd import ( "encoding/json" + "fmt" "github.com/cybercongress/cyberd/app" - . "github.com/cybercongress/cyberd/app/genesis" - + "os" "path/filepath" "github.com/cosmos/cosmos-sdk/client" @@ -77,6 +77,16 @@ func CollectGenTxsCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command { return cmd } +// nolint: errcheck +func displayInfo(cdc *codec.Codec, info printInfo) error { + out, err := codec.MarshalJSONIndent(cdc, info) + if err != nil { + return err + } + _, _ = fmt.Fprintf(os.Stderr, "%s\n", string(out)) + return nil +} + func genAppStateFromConfig( cdc *codec.Codec, config *cfg.Config, initCfg initConfig, genDoc types.GenesisDoc, ) (appState json.RawMessage, err error) { @@ -90,7 +100,7 @@ func genAppStateFromConfig( ) // process genesis transactions, else create default genesis.json - appGenTxs, persistentPeers, err = CollectStdTxs(cdc, config.Moniker, initCfg.GenTxsDir, genDoc) + appGenTxs, persistentPeers, err = app.CollectStdTxs(cdc, config.Moniker, initCfg.GenTxsDir, genDoc) if err != nil { return } @@ -108,7 +118,7 @@ func genAppStateFromConfig( cfg.WriteConfigFile(filepath.Join(config.RootDir, "config", "config.toml"), config) - appState, err = CyberdAppGenStateJSON(cdc, genDoc, genTxs) + appState, err = app.CyberdAppGenStateJSON(cdc, genDoc, genTxs) if err != nil { return } diff --git a/daemon/init/generate.go b/daemon/cmd/generate.go similarity index 97% rename from daemon/init/generate.go rename to daemon/cmd/generate.go index af5e4424..b69c3410 100644 --- a/daemon/init/generate.go +++ b/daemon/cmd/generate.go @@ -1,4 +1,4 @@ -package init +package cmd import ( "fmt" diff --git a/daemon/init/generate_accs.go b/daemon/cmd/generate_accs.go similarity index 90% rename from daemon/init/generate_accs.go rename to daemon/cmd/generate_accs.go index 5d003d6c..4c4272aa 100644 --- a/daemon/init/generate_accs.go +++ b/daemon/cmd/generate_accs.go @@ -1,11 +1,10 @@ -package init +package cmd import ( "fmt" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/go-bip39" "github.com/cybercongress/cyberd/app" - . "github.com/cybercongress/cyberd/app/genesis" "sync" "github.com/cosmos/cosmos-sdk/codec" @@ -44,14 +43,14 @@ func GenerateAccountsCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command { return err } - var appState GenesisState + var appState app.GenesisState if err = cdc.UnmarshalJSON(genDoc.AppState, &appState); err != nil { return err } amount := int64(10) kb := client.MockKeyBase() - addresses := make([]GenesisAccount, count.Int64()) + addresses := make([]app.GenesisAccount, count.Int64()) var wg sync.WaitGroup wg.Add(int(count.Int64())) @@ -61,7 +60,7 @@ func GenerateAccountsCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command { entropySeed, _ := bip39.NewEntropy(256) mnemonic, _ := bip39.NewMnemonic(entropySeed[:]) info, _ := kb.CreateKey(string(position), mnemonic, "") - addresses[position] = GenesisAccount{Address: info.GetAddress(), Amount: amount} + addresses[position] = app.GenesisAccount{Address: info.GetAddress(), Amount: amount} }(i) } wg.Wait() diff --git a/daemon/genesis/generate_genesis_file.go b/daemon/cmd/generate_genesis_file.go similarity index 83% rename from daemon/genesis/generate_genesis_file.go rename to daemon/cmd/generate_genesis_file.go index 1c1f8b32..96b055f0 100644 --- a/daemon/genesis/generate_genesis_file.go +++ b/daemon/cmd/generate_genesis_file.go @@ -1,4 +1,4 @@ -package genesis +package cmd import ( "bufio" @@ -6,8 +6,7 @@ import ( "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/server" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cybercongress/cyberd/app/genesis" - "github.com/cybercongress/cyberd/x/mint" + "github.com/cybercongress/cyberd/app" "github.com/spf13/cobra" "github.com/tendermint/tendermint/types" "io" @@ -20,11 +19,11 @@ import ( var ( bitcoinHeightZeroTime = time.Unix(1231006505, 0).UTC() // 2009-01-03 18:15:05 +0000 UTC chainId = "euler" - genesisSupply = mint.GenesisSupply + genesisSupply = int64(10 * 1000 * 1000 * 1000 * 1000 * 1000) // 10^16 pocPercentage = 0.7 ) -func GenerateEulerGenesisFile(ctx *server.Context, cdc *codec.Codec) *cobra.Command { +func GenerateEulerGenesisFileCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command { cmd := &cobra.Command{ Use: "generate-euler-genesis-block", Short: "Generate genesis file for euler testnet.", @@ -36,7 +35,7 @@ func GenerateEulerGenesisFile(ctx *server.Context, cdc *codec.Codec) *cobra.Comm return err } - appState := genesis.NewDefaultGenesisState() + appState := app.NewDefaultGenesisState() appState.Accounts = append(appState.Accounts, getGenesisAccs()...) appState.Accounts = append(appState.Accounts, pouAccs...) @@ -50,13 +49,13 @@ func GenerateEulerGenesisFile(ctx *server.Context, cdc *codec.Codec) *cobra.Comm addrMap[strAddr] += acc.Amount } - addrAsArray := make([]genesis.GenesisAccount, 0) + addrAsArray := make([]app.GenesisAccount, 0) for k, v := range addrMap { - addrAsArray = append(addrAsArray, genesis.GenesisAccount{Address: addr(k), Amount: v}) + addrAsArray = append(addrAsArray, app.GenesisAccount{Address: addr(k), Amount: v}) } appState.Accounts = addrAsArray - appState.StakeData.Pool.LooseTokens = sdk.NewDec(genesisSupply) + appState.StakingData.Pool.NotBondedTokens = sdk.NewInt(genesisSupply) stateAsJson, err := codec.MarshalJSONIndent(cdc, appState) if err != nil { return err @@ -76,9 +75,9 @@ func GenerateEulerGenesisFile(ctx *server.Context, cdc *codec.Codec) *cobra.Comm return cmd } -func readPouAccounts() ([]genesis.GenesisAccount, error) { +func readPouAccounts() ([]app.GenesisAccount, error) { - accs := make([]genesis.GenesisAccount, 0) + accs := make([]app.GenesisAccount, 0) pocFile, err := os.Open("/home/hlb/.cyberd/proof-of-code") if err != nil { return nil, err @@ -106,7 +105,7 @@ func readPouAccounts() ([]genesis.GenesisAccount, error) { return nil, err } - accs = append(accs, genesis.GenesisAccount{ + accs = append(accs, app.GenesisAccount{ Address: accAddress, Amount: amt(accAmtPercent), }) @@ -116,8 +115,8 @@ func readPouAccounts() ([]genesis.GenesisAccount, error) { } // Returns all, except genesis poc accs -func getGenesisAccs() []genesis.GenesisAccount { - accs := []genesis.GenesisAccount{ +func getGenesisAccs() []app.GenesisAccount { + accs := []app.GenesisAccount{ {Address: addr("cbd1f9yjqmxh6prsmgpcaqj8lmjnxg644n50qjl4vw"), Amount: amt(8.288000001)}, {Address: addr("cbd1hlu0kqwvxmhjjsezr00jdrvs2k537mqhrv02ja"), Amount: amt(3.045611111)}, {Address: addr("cbd1myeyqp96pz3tayjdctflrxpwf45dq3xyj56yk0"), Amount: amt(2.1153)}, diff --git a/daemon/init/gentx.go b/daemon/cmd/gentx.go similarity index 50% rename from daemon/init/gentx.go rename to daemon/cmd/gentx.go index d6eed1c7..dc9ff8a1 100644 --- a/daemon/init/gentx.go +++ b/daemon/cmd/gentx.go @@ -1,23 +1,32 @@ -package init +package cmd import ( + "bytes" "fmt" - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/server" - sdk "github.com/cosmos/cosmos-sdk/types" - authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli" - "github.com/cosmos/cosmos-sdk/x/stake/client/cli" - "github.com/cybercongress/cyberd/app" + "io" + "io/ioutil" + "os" + "path/filepath" + "github.com/spf13/cobra" "github.com/spf13/viper" + cfg "github.com/tendermint/tendermint/config" "github.com/tendermint/tendermint/crypto" tmcli "github.com/tendermint/tendermint/libs/cli" "github.com/tendermint/tendermint/libs/common" - "io/ioutil" - "os" - "path/filepath" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/context" + "github.com/cosmos/cosmos-sdk/client/keys" + "github.com/cosmos/cosmos-sdk/client/utils" + "github.com/cosmos/cosmos-sdk/cmd/gaia/app" + "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/server" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth" + authtxb "github.com/cosmos/cosmos-sdk/x/auth/client/txbuilder" + "github.com/cosmos/cosmos-sdk/x/staking/client/cli" ) const ( @@ -56,6 +65,27 @@ following delegation and commission default parameters: return err } + genDoc, err := loadGenesisDoc(cdc, config.GenesisFile()) + if err != nil { + return err + } + + genesisState := app.GenesisState{} + if err = cdc.UnmarshalJSON(genDoc.AppState, &genesisState); err != nil { + return err + } + + kb, err := keys.GetKeyBaseFromDir(viper.GetString(flagClientHome)) + if err != nil { + return err + } + + name := viper.GetString(client.FlagName) + key, err := kb.Get(name) + if err != nil { + return err + } + // Read --pubkey, if empty take it from priv_validator.json if valPubKeyString := viper.GetString(cli.FlagPubKey); valPubKeyString != "" { valPubKey, err = sdk.GetConsPubKeyBech32(valPubKeyString) @@ -76,35 +106,70 @@ following delegation and commission default parameters: chainId = genDoc.ChainID } - // Run cyberd create-validator + // Set flags for creating gentx prepareFlagsForTxCreateValidator(config, nodeID, ip, chainId, valPubKey) - createValidatorCmd := cli.GetCmdCreateValidator(cdc) - w, err := ioutil.TempFile("", "gentx") + // Fetch the amount of coins staked + amount := viper.GetString(cli.FlagAmount) + coins, err := sdk.ParseCoins(amount) + if err != nil { + return err + } + + err = accountInGenesis(genesisState, key.GetAddress(), coins) if err != nil { return err } - unsignedGenTxFilename := w.Name() - defer os.Remove(unsignedGenTxFilename) - os.Stdout = w - if err = createValidatorCmd.RunE(nil, args); err != nil { + + // Run cyberd tx create-validator + txBldr := authtxb.NewTxBuilderFromCLI().WithTxEncoder(utils.GetTxEncoder(cdc)) + cliCtx := context.NewCLIContext().WithCodec(cdc) + txBldr, msg, err := cli.BuildCreateValidatorMsg(cliCtx, txBldr) + if err != nil { + return err + } + + // write the unsigned transaction to the buffer + w := bytes.NewBuffer([]byte{}) + if err := utils.PrintUnsignedStdTx(w, txBldr, cliCtx, []sdk.Msg{msg}, true); err != nil { + return err + } + + // read the transaction + stdTx, err := readUnsignedGenTxFile(cdc, w) + if err != nil { return err } - w.Close() - prepareFlagsForTxSign() - signCmd := authcmd.GetSignCommand(cdc) - if w, err = prepareOutputFile(config.RootDir, nodeID); err != nil { + // sign the transaction and write it to the output file + signedTx, err := utils.SignStdTx(txBldr, cliCtx, name, stdTx, false, true) + if err != nil { + return err + } + + // Fetch output file name + outputDocument := viper.GetString(client.FlagOutputDocument) + if outputDocument == "" { + outputDocument, err = makeOutputFilepath(config.RootDir, nodeID) + if err != nil { + return err + } + } + + if err := writeSignedGenTx(cdc, outputDocument, signedTx); err != nil { return err } - os.Stdout = w - return signCmd.RunE(nil, []string{unsignedGenTxFilename}) + + fmt.Fprintf(os.Stderr, "Genesis transaction written to %q\n", outputDocument) + return nil }, } cmd.Flags().String(tmcli.HomeFlag, app.DefaultNodeHome, "node's home directory") cmd.Flags().String(flagClientHome, app.DefaultCLIHome, "client's home directory") cmd.Flags().String(client.FlagName, "", "name of private key with which to sign the gentx") + cmd.Flags().String(client.FlagOutputDocument, "", + "write the genesis transaction JSON document to the given file instead of the default location") cmd.Flags().String(client.FlagChainID, "euler-dev", "current chain-id") cmd.Flags().String(cli.FlagMoniker, "anonymous", "validator display name") cmd.Flags().AddFlagSet(cli.FsCommissionCreate) @@ -114,6 +179,34 @@ following delegation and commission default parameters: return cmd } +func accountInGenesis(genesisState app.GenesisState, key sdk.AccAddress, coins sdk.Coins) error { + accountIsInGenesis := false + bondDenom := genesisState.StakingData.Params.BondDenom + + // Check if the account is in genesis + for _, acc := range genesisState.Accounts { + // Ensure that account is in genesis + if acc.Address.Equals(key) { + + // Ensure account contains enough funds of default bond denom + if coins.AmountOf(bondDenom).GT(acc.Coins.AmountOf(bondDenom)) { + return fmt.Errorf( + "account %v is in genesis, but it only has %v%v available to stake, not %v%v", + key.String(), acc.Coins.AmountOf(bondDenom), bondDenom, coins.AmountOf(bondDenom), bondDenom, + ) + } + accountIsInGenesis = true + break + } + } + + if accountIsInGenesis { + return nil + } + + return fmt.Errorf("account %s in not in the app_state.accounts array of genesis.json", key) +} + func prepareFlagsForTxCreateValidator(config *cfg.Config, nodeID, ip, chainID string, valPubKey crypto.PubKey) { viper.Set(tmcli.HomeFlag, viper.GetString(flagClientHome)) // --home @@ -141,15 +234,35 @@ func prepareFlagsForTxCreateValidator(config *cfg.Config, nodeID, ip, chainID st } } -func prepareFlagsForTxSign() { - viper.Set("offline", true) +func makeOutputFilepath(rootDir, nodeID string) (string, error) { + writePath := filepath.Join(rootDir, "config", "gentx") + if err := common.EnsureDir(writePath, 0700); err != nil { + return "", err + } + return filepath.Join(writePath, fmt.Sprintf("gentx-%v.json", nodeID)), nil } -func prepareOutputFile(rootDir, nodeID string) (w *os.File, err error) { - writePath := filepath.Join(rootDir, "config", "gentx") - if err = common.EnsureDir(writePath, 0700); err != nil { - return +func readUnsignedGenTxFile(cdc *codec.Codec, r io.Reader) (auth.StdTx, error) { + var stdTx auth.StdTx + bytes, err := ioutil.ReadAll(r) + if err != nil { + return stdTx, err + } + err = cdc.UnmarshalJSON(bytes, &stdTx) + return stdTx, err +} + +// nolint: errcheck +func writeSignedGenTx(cdc *codec.Codec, outputDocument string, tx auth.StdTx) error { + outputFile, err := os.OpenFile(outputDocument, os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0644) + if err != nil { + return err + } + defer outputFile.Close() + json, err := cdc.MarshalJSON(tx) + if err != nil { + return err } - filename := filepath.Join(writePath, fmt.Sprintf("gentx-%v.json", nodeID)) - return os.Create(filename) + _, err = fmt.Fprintf(outputFile, "%s\n", json) + return err } diff --git a/daemon/init/init.go b/daemon/cmd/init.go similarity index 86% rename from daemon/init/init.go rename to daemon/cmd/init.go index cea94d50..ca136b0a 100644 --- a/daemon/init/init.go +++ b/daemon/cmd/init.go @@ -1,10 +1,9 @@ -package init +package cmd import ( "encoding/json" "fmt" "github.com/cybercongress/cyberd/app" - "os" "path/filepath" "github.com/cosmos/cosmos-sdk/client" @@ -30,16 +29,6 @@ type printInfo struct { AppMessage json.RawMessage `json:"app_message"` } -// nolint: errcheck -func displayInfo(cdc *codec.Codec, info printInfo) error { - out, err := codec.MarshalJSONIndent(cdc, info) - if err != nil { - return err - } - fmt.Fprintf(os.Stderr, "%s\n", string(out)) - return nil -} - // get cmd to initialize all files for tendermint and application // nolint func InitCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command { @@ -60,9 +49,7 @@ func InitCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command { return err } - if viper.GetString(flagMoniker) != "" { - config.Moniker = viper.GetString(flagMoniker) - } + config.Moniker = viper.GetString(flagMoniker) var appState json.RawMessage genFile := config.GenesisFile() @@ -83,5 +70,7 @@ func InitCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command { cmd.Flags().BoolP(flagOverwrite, "o", false, "overwrite the genesis.json file") cmd.Flags().String(client.FlagChainID, "", "genesis file chain-id, if left blank will be randomly created") cmd.Flags().String(flagMoniker, "", "set the validator's moniker") + cmd.MarkFlagRequired(flagMoniker) + return cmd } diff --git a/daemon/init/testnet.go b/daemon/cmd/testnet.go similarity index 93% rename from daemon/init/testnet.go rename to daemon/cmd/testnet.go index 9e7e5f41..53a59453 100644 --- a/daemon/init/testnet.go +++ b/daemon/cmd/testnet.go @@ -1,10 +1,9 @@ -package init +package cmd import ( "encoding/json" "fmt" "github.com/cybercongress/cyberd/app" - . "github.com/cybercongress/cyberd/app/genesis" "net" "os" "path/filepath" @@ -14,16 +13,16 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth" authtx "github.com/cosmos/cosmos-sdk/x/auth/client/txbuilder" - "github.com/cosmos/cosmos-sdk/x/stake" - - "github.com/cosmos/cosmos-sdk/server" + "github.com/cosmos/cosmos-sdk/x/staking" "github.com/spf13/cobra" "github.com/spf13/viper" - cfg "github.com/tendermint/tendermint/config" + tmconfig "github.com/tendermint/tendermint/config" "github.com/tendermint/tendermint/crypto" cmn "github.com/tendermint/tendermint/libs/common" "github.com/tendermint/tendermint/types" tmtime "github.com/tendermint/tendermint/types/time" + + "github.com/cosmos/cosmos-sdk/server" ) var ( @@ -80,8 +79,9 @@ Example: return cmd } -func initTestnet(config *cfg.Config, cdc *codec.Codec) error { +func initTestnet(config *tmconfig.Config, cdc *codec.Codec) error { var chainID string + outDir := viper.GetString(flagOutputDir) numValidators := viper.GetInt(flagNumValidators) @@ -95,7 +95,7 @@ func initTestnet(config *cfg.Config, cdc *codec.Codec) error { valPubKeys := make([]crypto.PubKey, numValidators) var ( - accs []GenesisAccount + accs []app.GenesisAccount genFiles []string ) @@ -176,17 +176,17 @@ func initTestnet(config *cfg.Config, cdc *codec.Codec) error { return err } - accs = append(accs, GenesisAccount{ + accs = append(accs, app.GenesisAccount{ Address: addr, Amount: 100, }) - msg := stake.NewMsgCreateValidator( + msg := staking.NewMsgCreateValidator( sdk.ValAddress(addr), valPubKeys[i], sdk.NewInt64Coin("CBD", 100), - stake.NewDescription(nodeDirName, "", "", ""), - stake.NewCommissionMsg(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec()), + staking.NewDescription(nodeDirName, "", "", ""), + staking.NewCommissionMsg(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec()), ) tx := auth.NewStdTx([]sdk.Msg{msg}, auth.StdFee{}, []auth.StdSignature{}, memo) txBldr := authtx.NewTxBuilderFromCLI().WithChainID(chainID).WithMemo(memo) @@ -228,11 +228,11 @@ func initTestnet(config *cfg.Config, cdc *codec.Codec) error { } func initGenFiles( - cdc *codec.Codec, chainID string, accs []GenesisAccount, + cdc *codec.Codec, chainID string, accs []app.GenesisAccount, genFiles []string, numValidators int, ) error { - appGenState := NewDefaultGenesisState() + appGenState := app.NewDefaultGenesisState() appGenState.Accounts = accs appGenStateJSON, err := codec.MarshalJSONIndent(cdc, appGenState) @@ -257,7 +257,7 @@ func initGenFiles( } func collectGenFiles( - cdc *codec.Codec, config *cfg.Config, chainID string, + cdc *codec.Codec, config *tmconfig.Config, chainID string, monikers, nodeIDs []string, valPubKeys []crypto.PubKey, numValidators int, outDir, nodeDirPrefix, nodeDaemonHomeName string, ) error { diff --git a/daemon/init/utils.go b/daemon/cmd/utils.go similarity index 80% rename from daemon/init/utils.go rename to daemon/cmd/utils.go index 8ca2ec4d..95faaaaf 100644 --- a/daemon/init/utils.go +++ b/daemon/cmd/utils.go @@ -1,10 +1,12 @@ -package init +package cmd import ( "encoding/json" "fmt" - . "github.com/cybercongress/cyberd/app/genesis" + "github.com/cosmos/cosmos-sdk/server" + "github.com/cybercongress/cyberd/app" "io/ioutil" + "path/filepath" "time" "github.com/cosmos/cosmos-sdk/codec" @@ -57,20 +59,6 @@ func ExportGenesisFileWithTime( return genDoc.SaveAs(genFile) } -// read of create the private key file for this config -func ReadOrCreatePrivValidator(privValFile string) crypto.PubKey { - var privValidator *privval.FilePV - - if common.FileExists(privValFile) { - privValidator = privval.LoadFilePV(privValFile) - } else { - privValidator = privval.GenFilePV(privValFile) - privValidator.Save() - } - - return privValidator.GetPubKey() -} - // InitializeNodeValidatorFiles creates private validator and p2p configuration files. func InitializeNodeValidatorFiles( config *cfg.Config) (nodeID string, valPubKey crypto.PubKey, err error, @@ -82,7 +70,19 @@ func InitializeNodeValidatorFiles( } nodeID = string(nodeKey.ID()) - valPubKey = ReadOrCreatePrivValidator(config.PrivValidatorFile()) + server.UpgradeOldPrivValFile(config) + + pvKeyFile := config.PrivValidatorKeyFile() + if err := common.EnsureDir(filepath.Dir(pvKeyFile), 0777); err != nil { + return nodeID, valPubKey, nil + } + + pvStateFile := config.PrivValidatorStateFile() + if err := common.EnsureDir(filepath.Dir(pvStateFile), 0777); err != nil { + return nodeID, valPubKey, nil + } + + valPubKey = privval.LoadOrGenFilePV(pvKeyFile, pvStateFile).GetPubKey() return nodeID, valPubKey, nil } @@ -108,5 +108,5 @@ func initializeEmptyGenesis( return nil, fmt.Errorf("genesis.json file already exists: %v", genFile) } - return codec.MarshalJSONIndent(cdc, NewDefaultGenesisState()) + return codec.MarshalJSONIndent(cdc, app.NewDefaultGenesisState()) } diff --git a/daemon/main.go b/daemon/main.go index 60f2ab52..88af2ece 100644 --- a/daemon/main.go +++ b/daemon/main.go @@ -4,9 +4,9 @@ import ( "encoding/json" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/server" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cybercongress/cyberd/app" - "github.com/cybercongress/cyberd/daemon/genesis" - initCyberd "github.com/cybercongress/cyberd/daemon/init" + initCyberd "github.com/cybercongress/cyberd/daemon/cmd" "github.com/cybercongress/cyberd/daemon/rpc" "github.com/cybercongress/cyberd/x/rank" "github.com/spf13/cobra" @@ -46,7 +46,7 @@ func main() { rootCmd.AddCommand(initCyberd.TestnetFilesCmd(ctx, cdc)) rootCmd.AddCommand(initCyberd.GenTxCmd(ctx, cdc)) rootCmd.AddCommand(initCyberd.AddGenesisAccountCmd(ctx, cdc)) - rootCmd.AddCommand(genesis.GenerateEulerGenesisFile(ctx, cdc)) + rootCmd.AddCommand(initCyberd.GenerateEulerGenesisFileCmd(ctx, cdc)) server.AddCommands(ctx, cdc, rootCmd, newApp, exportAppStateAndTMValidators) for _, c := range rootCmd.Commands() { @@ -68,7 +68,8 @@ func main() { } func newApp(logger log.Logger, db dbm.DB, storeTracer io.Writer) abci.Application { - pruning := baseapp.SetPruning(viper.GetString("pruning")) + // todo use constant here + pruning := baseapp.SetPruning(sdk.NewPruningOptions(60*60*24, 0)) computeUnit := rank.CPU if viper.GetBool(flagGpuEnabled) { computeUnit = rank.GPU diff --git a/go.mod b/go.mod index 368f9e44..612e311b 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,6 @@ module github.com/cybercongress/cyberd require ( github.com/BurntSushi/toml v0.3.1 // indirect - github.com/TV4/graceful v0.3.3 github.com/VividCortex/gohistogram v1.0.0 // indirect github.com/ZondaX/hid-go v0.0.0-20180905224704-48b08affede2 // indirect github.com/bartekn/go-bip39 v0.0.0-20171116152956-a05967ea095d // indirect @@ -10,7 +9,7 @@ require ( github.com/bgentry/speakeasy v0.1.0 // indirect github.com/btcsuite/btcd v0.0.0-20180903232927-cff30e1d23fc // indirect github.com/btcsuite/btcutil v0.0.0-20180706230648-ab6388e0c60a // indirect - github.com/cosmos/cosmos-sdk v0.29.0 + github.com/cosmos/cosmos-sdk v0.28.2-0.20190123020839-b2ae4ed57319 github.com/cosmos/go-bip39 v0.0.0-20180618194314-52158e4697b8 github.com/fortytw2/leaktest v1.2.0 // indirect github.com/go-kit/kit v0.7.0 // indirect @@ -47,7 +46,7 @@ require ( github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e // indirect github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273 // indirect github.com/rcrowley/go-metrics v0.0.0-20180503174638-e2704e165165 // indirect - github.com/rs/cors v1.6.0 + github.com/rs/cors v1.6.0 // indirect github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 // indirect github.com/spf13/afero v1.1.2 // indirect github.com/spf13/cast v1.2.0 // indirect @@ -60,9 +59,9 @@ require ( github.com/tendermint/btcd v0.0.0-20180816174608-e5840949ff4f github.com/tendermint/go-amino v0.14.1 github.com/tendermint/iavl v0.12.0 // indirect - github.com/tendermint/tendermint v0.27.4 + github.com/tendermint/tendermint v0.29.0 github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc // indirect - github.com/zondax/ledger-goclient v0.1.0 // indirect + github.com/zondax/ledger-cosmos-go v0.1.0 // indirect golang.org/x/crypto v0.0.0-20181015023909-0c41d7ab0a0e // indirect golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3 // indirect google.golang.org/grpc v1.15.0 // indirect diff --git a/go.sum b/go.sum index 0aea74b5..d1d627df 100644 --- a/go.sum +++ b/go.sum @@ -1,8 +1,6 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/TV4/graceful v0.3.3 h1:+kLzId/e9m+oVML5nq7mWZzUWzqO4HKD0+Ey9nNJo9I= -github.com/TV4/graceful v0.3.3/go.mod h1:FCdf8hfXvxOSAQy0C0dBTCSCuMgowS++HzwYL7TIjf4= github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/ZondaX/hid-go v0.0.0-20180905224704-48b08affede2 h1:PHjIxgGjCf4bt63vdJmQ88/ISoFvCT2H8x5Dzpw0ygI= @@ -18,8 +16,8 @@ github.com/btcsuite/btcd v0.0.0-20180903232927-cff30e1d23fc/go.mod h1:Dmm/EzmjnC github.com/btcsuite/btcutil v0.0.0-20180706230648-ab6388e0c60a h1:RQMUrEILyYJEoAT34XS/kLu40vC0+po/UfxrBBA4qZE= github.com/btcsuite/btcutil v0.0.0-20180706230648-ab6388e0c60a/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cosmos/cosmos-sdk v0.29.0 h1:0tClCHjWsFLxRPoThH5gwzqjvVfBpP708CCLjP3Hz58= -github.com/cosmos/cosmos-sdk v0.29.0/go.mod h1:JrX/JpJunJQXBI5PEX2zELHMFzQr/159jDjIhesOh2c= +github.com/cosmos/cosmos-sdk v0.28.2-0.20190123020839-b2ae4ed57319 h1:T2U3Z5ftqqECTF6y8lHiWS5ld4ZXon2/tYSnc+flWUo= +github.com/cosmos/cosmos-sdk v0.28.2-0.20190123020839-b2ae4ed57319/go.mod h1:JrX/JpJunJQXBI5PEX2zELHMFzQr/159jDjIhesOh2c= github.com/cosmos/go-bip39 v0.0.0-20180618194314-52158e4697b8 h1:Iwin12wRQtyZhH6FV3ykFcdGNlYEzoeR0jN8Vn+JWsI= github.com/cosmos/go-bip39 v0.0.0-20180618194314-52158e4697b8/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -58,6 +56,7 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/ipfs/go-cid v0.9.0 h1:EdO7meRzk9MpAo8DbOmPDU3Yh2BQ4ABc0xN2wgEtREA= github.com/ipfs/go-cid v0.9.0/go.mod h1:DEZAg7ik3SR8PY77P+hNaWtHtBirqeEgHbfmePL8WJA= @@ -134,12 +133,12 @@ github.com/tendermint/go-amino v0.14.1 h1:o2WudxNfdLNBwMyl2dqOJxiro5rfrEaU0Ugs6o github.com/tendermint/go-amino v0.14.1/go.mod h1:i/UKE5Uocn+argJJBb12qTZsCDBcAYMbR92AaJVmKso= github.com/tendermint/iavl v0.12.0 h1:xcaFAr+ycqCj7WN1RzL2EfcBioRDOHcU1oWcg83K028= github.com/tendermint/iavl v0.12.0/go.mod h1:EoKMMv++tDOL5qKKVnoIqtVPshRrEPeJ0WsgDOLAauM= -github.com/tendermint/tendermint v0.27.4 h1:rytK6+o/TYPhLJJu/tRaq6PBx/25VGAwiee2qdNnFsY= -github.com/tendermint/tendermint v0.27.4/go.mod h1:ymcPyWblXCplCPQjbOYbrF1fWnpslATMVqiGgWbZrlc= +github.com/tendermint/tendermint v0.29.0 h1:zaJwtaAQVUC4QxqImtpPlCpMGroVvPU0g75ZTlvmFg8= +github.com/tendermint/tendermint v0.29.0/go.mod h1:ymcPyWblXCplCPQjbOYbrF1fWnpslATMVqiGgWbZrlc= github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc h1:BCPnHtcboadS0DvysUuJXZ4lWVv5Bh5i7+tbIyi+ck4= github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc/go.mod h1:r45hJU7yEoA81k6MWNhpMj/kms0n14dkzkxYHoB96UM= -github.com/zondax/ledger-goclient v0.1.0 h1:9JZVE1s565asON/yvxvpDB6k+xfel1BGuvlNflLCu+o= -github.com/zondax/ledger-goclient v0.1.0/go.mod h1:ILyu7qO5zsod0bzyxY9NCMlFTb8AXZzJAJf0T85b2jA= +github.com/zondax/ledger-cosmos-go v0.1.0 h1:Qf4OrBXabhUrDqTtq47QSBLqWV4QYQDQwJQ2qZCbzT8= +github.com/zondax/ledger-cosmos-go v0.1.0/go.mod h1:uhu/ldrtzhUH7RoWoTKK4MxBi/CXfyViVA0OCYTiHdM= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= diff --git a/x/bandwidth/genesis.go b/x/bandwidth/genesis.go index 99048988..4efc03fb 100644 --- a/x/bandwidth/genesis.go +++ b/x/bandwidth/genesis.go @@ -2,15 +2,14 @@ package bandwidth import ( sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cybercongress/cyberd/app/genesis" "github.com/cybercongress/cyberd/x/bandwidth/types" ) // Genesis accounts should contains fully restored bandwidth on block 0 -func InitGenesis(ctx sdk.Context, bwHandler types.BandwidthMeter, bwKeeper types.Keeper, accs []genesis.GenesisAccount) { +func InitGenesis(ctx sdk.Context, bwHandler types.BandwidthMeter, bwKeeper types.Keeper, addresses []sdk.AccAddress) { - for _, acc := range accs { - accMaxBw := bwHandler.GetAccMaxBandwidth(ctx, acc.Address) - bwKeeper.SetAccBandwidth(ctx, types.NewGenesisAccBandwidth(acc.Address, accMaxBw)) + for _, address := range addresses { + accMaxBw := bwHandler.GetAccMaxBandwidth(ctx, address) + bwKeeper.SetAccBandwidth(ctx, types.NewGenesisAccBandwidth(address, accMaxBw)) } } diff --git a/x/bank/keeper.go b/x/bank/keeper.go index b55629e1..1f5e2b9b 100644 --- a/x/bank/keeper.go +++ b/x/bank/keeper.go @@ -4,7 +4,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/bank" - "github.com/cosmos/cosmos-sdk/x/stake" + "github.com/cosmos/cosmos-sdk/x/staking" "github.com/cybercongress/cyberd/types/coin" ) @@ -12,12 +12,12 @@ type Keeper struct { bank.Keeper ak auth.AccountKeeper - sk *stake.Keeper + sk *staking.Keeper coinsTransferHooks []CoinsTransferHook } -func NewBankKeeper(ak auth.AccountKeeper, sk *stake.Keeper) Keeper { +func NewBankKeeper(ak auth.AccountKeeper, sk *staking.Keeper) Keeper { return Keeper{ Keeper: bank.NewBaseKeeper(ak), ak: ak, @@ -118,5 +118,5 @@ func (k Keeper) GetAccStakePercentage(ctx sdk.Context, addr sdk.AccAddress) floa func (k Keeper) GetTotalSupply(ctx sdk.Context) int64 { pool := k.sk.GetPool(ctx) - return pool.BondedTokens.RoundInt64() + pool.LooseTokens.RoundInt64() + return pool.TokenSupply().Int64() } diff --git a/x/mint/abci.go b/x/mint/abci.go deleted file mode 100644 index e06096e6..00000000 --- a/x/mint/abci.go +++ /dev/null @@ -1,13 +0,0 @@ -package mint - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cybercongress/cyberd/types/coin" -) - -// Inflate every block -func BeginBlocker(ctx sdk.Context, m Minter) { - mintedCoin := sdk.NewInt64Coin(coin.CBD, int64(m.blockReward)) - m.fck.AddCollectedFees(ctx, sdk.Coins{mintedCoin}) - m.stakeKeeper.InflateSupply(ctx, sdk.NewDecFromInt(mintedCoin.Amount)) -} diff --git a/x/mint/minter.go b/x/mint/minter.go deleted file mode 100644 index fe96dc11..00000000 --- a/x/mint/minter.go +++ /dev/null @@ -1,28 +0,0 @@ -package mint - -import ( - "github.com/cosmos/cosmos-sdk/x/auth" - "github.com/cosmos/cosmos-sdk/x/stake/keeper" -) - -// mint new cbd tokens for every block -type Minter struct { - fck auth.FeeCollectionKeeper - stakeKeeper keeper.Keeper - blockReward uint64 -} - -func NewMinter(fck auth.FeeCollectionKeeper, stakeKeeper keeper.Keeper) Minter { - - // for 1sec block and 1kkk genesis will be 31 - blockReward := (GenesisSupply / BlocksPerYear) * InflationRatePerYear - return Minter{ - fck: fck, - stakeKeeper: stakeKeeper, - blockReward: uint64(blockReward), - } -} - -func (m *Minter) BlockReward() uint64 { - return m.blockReward -} diff --git a/x/mint/params.go b/x/mint/params.go deleted file mode 100644 index ee4c9a37..00000000 --- a/x/mint/params.go +++ /dev/null @@ -1,11 +0,0 @@ -package mint - -const ( - // 31_536_000 - // assuming 1 second block times - BlocksPerYear = 60 * 60 * 24 * 365 - // todo hardcoded - GenesisSupply = int64(10 * 1000 * 1000 * 1000 * 1000 * 1000) // 1*10^15 - // percentage value 0....1, 1 means 100% year inflation - InflationRatePerYear = 2 -) From 97552044c0ecd3b6064f15f3a1ad0fecdd315a20 Mon Sep 17 00:00:00 2001 From: Hleb Albau Date: Wed, 23 Jan 2019 18:09:07 +0700 Subject: [PATCH 02/38] #181 Change mint module to default cosmos module --- app/ante.go | 10 +-- app/app.go | 11 +-- app/fee.go | 8 +- app/genesis.go | 174 ++++++++++-------------------------------- daemon/cmd/collect.go | 2 +- daemon/cmd/testnet.go | 7 +- daemon/cmd/utils.go | 119 +++++++++++++++++++++++++++-- types/coin/coins.go | 2 +- 8 files changed, 174 insertions(+), 159 deletions(-) diff --git a/app/ante.go b/app/ante.go index bafb2f6f..28029308 100644 --- a/app/ante.go +++ b/app/ante.go @@ -36,12 +36,10 @@ func NewAnteHandler(ak auth.AccountKeeper) sdk.AnteHandler { signerAccs := make([]auth.Account, len(signerAddrs)) for i := 0; i < len(stdSigs); i++ { - // skip the fee payer, account is cached and fees were deducted already - if i != 0 { - signerAccs[i], res = auth.GetSignerAcc(newCtx, ak, signerAddrs[i]) - if !res.IsOK() { - return newCtx, res, true - } + + signerAccs[i], res = auth.GetSignerAcc(newCtx, ak, signerAddrs[i]) + if !res.IsOK() { + return newCtx, res, true } // check signature, return account with incremented nonce diff --git a/app/app.go b/app/app.go index 1d5fca15..c6be23fe 100644 --- a/app/app.go +++ b/app/app.go @@ -193,17 +193,18 @@ func NewCyberdApp( // mount the multistore and load the latest state app.MountStores(dbKeys.GetStoreKeys()...) app.MountStoresTransient(dbKeys.GetTransientStoreKeys()...) - err := app.LoadLatestVersion(dbKeys.main) - if err != nil { - cmn.Exit(err.Error()) - } - // perform initialization logic app.SetInitChainer(app.initChainer) app.SetBeginBlocker(app.BeginBlocker) app.SetEndBlocker(app.EndBlocker) app.SetAnteHandler(NewAnteHandler(app.accountKeeper)) + // perform initialization logic + err := app.LoadLatestVersion(dbKeys.main) + if err != nil { + cmn.Exit(err.Error()) + } + ctx := app.BaseApp.NewContext(true, abci.Header{}) app.latestBlockHeight = int64(ms.GetLatestBlockNumber(ctx)) diff --git a/app/fee.go b/app/fee.go index 65ce3527..4abf71e5 100644 --- a/app/fee.go +++ b/app/fee.go @@ -1,6 +1,9 @@ package app -import sdk "github.com/cosmos/cosmos-sdk/types" +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "log" +) var noCoins = sdk.Coins{} @@ -8,7 +11,8 @@ var noCoins = sdk.Coins{} // fee collection keeper used only for testing type NoopFeeCollectionKeeper struct{} -func (fck NoopFeeCollectionKeeper) AddCollectedFees(sdk.Context, sdk.Coins) sdk.Coins { +func (fck NoopFeeCollectionKeeper) AddCollectedFees(_ sdk.Context, c sdk.Coins) sdk.Coins { + log.Println(c.String()) return noCoins } diff --git a/app/genesis.go b/app/genesis.go index f05bb7e1..1973ae16 100644 --- a/app/genesis.go +++ b/app/genesis.go @@ -14,11 +14,6 @@ import ( "github.com/cybercongress/cyberd/types/coin" "github.com/pkg/errors" tmtypes "github.com/tendermint/tendermint/types" - "io/ioutil" - "os" - "path/filepath" - "sort" - "strings" "time" ) @@ -91,12 +86,37 @@ const ( defaultUnbondingTime = 60 * 60 * 24 * 3 * time.Second ) -// DefaultParams returns a default set of parameters. -func DefaultStakingParams() types.Params { - return types.Params{ - UnbondingTime: defaultUnbondingTime, - MaxValidators: 146, - BondDenom: coin.CBD, +// todo set params for each module +// NewDefaultGenesisState generates the default state for cyberd. +func NewDefaultGenesisState() GenesisState { + return GenesisState{ + Accounts: nil, + AuthData: auth.GenesisState{ + Params: auth.Params{ + MaxMemoCharacters: 256, + }, + }, + MintData: mint.GenesisState{ + Params: mint.Params{ + MintDenom: coin.CBD, + InflationRateChange: sdk.NewDecWithPrec(0, 2), + InflationMax: sdk.NewDecWithPrec(200, 2), + InflationMin: sdk.NewDecWithPrec(200, 2), + GoalBonded: sdk.NewDecWithPrec(99, 2), + BlocksPerYear: uint64(60 * 60 * 24 * 365), // assuming 1 second block times + }, + }, + StakingData: staking.GenesisState{ + Pool: staking.InitialPool(), + Params: types.Params{ + UnbondingTime: defaultUnbondingTime, + MaxValidators: 146, + BondDenom: coin.CBD, + }, + }, + SlashingData: slashing.DefaultGenesisState(), + DistrData: distr.DefaultGenesisState(), + GenTxs: nil, } } @@ -139,19 +159,15 @@ func CyberdAppGenState(cdc *codec.Codec, genDoc tmtypes.GenesisDoc, appGenTxs [] return genesisState, nil } -// todo set params for each module -// NewDefaultGenesisState generates the default state for cyberd. -func NewDefaultGenesisState() GenesisState { - return GenesisState{ - Accounts: nil, - StakingData: staking.GenesisState{ - Pool: staking.InitialPool(), - Params: DefaultStakingParams(), - }, - SlashingData: slashing.DefaultGenesisState(), - DistrData: distr.DefaultGenesisState(), - GenTxs: nil, +// CyberdAppGenState but with JSON +func CyberdAppGenStateJSON(cdc *codec.Codec, genDoc tmtypes.GenesisDoc, appGenTxs []json.RawMessage) ( + appState json.RawMessage, err error) { + // create the final app state + genesisState, err := CyberdAppGenState(cdc, genDoc, appGenTxs) + if err != nil { + return nil, err } + return codec.MarshalJSONIndent(cdc, genesisState) } // CyberdValidateGenesisState ensures that the genesis state obeys the expected invariants @@ -188,115 +204,3 @@ func validateGenesisStateAccounts(accs []GenesisAccount) (err error) { } return } - -// CyberdAppGenState but with JSON -func CyberdAppGenStateJSON(cdc *codec.Codec, genDoc tmtypes.GenesisDoc, appGenTxs []json.RawMessage) ( - appState json.RawMessage, err error) { - // create the final app state - genesisState, err := CyberdAppGenState(cdc, genDoc, appGenTxs) - if err != nil { - return nil, err - } - return codec.MarshalJSONIndent(cdc, genesisState) -} - -// todo move to other place?? -// CollectStdTxs processes and validates application's genesis StdTxs and returns -// the list of appGenTxs, and persistent peers required to generate genesis.json. -func CollectStdTxs(cdc *codec.Codec, moniker string, genTxsDir string, genDoc tmtypes.GenesisDoc) ( - appGenTxs []auth.StdTx, persistentPeers string, err error) { - - var fos []os.FileInfo - fos, err = ioutil.ReadDir(genTxsDir) - if err != nil { - return appGenTxs, persistentPeers, err - } - - // prepare a map of all accounts in genesis state to then validate - // against the validators addresses - var appState GenesisState - if err := cdc.UnmarshalJSON(genDoc.AppState, &appState); err != nil { - return appGenTxs, persistentPeers, err - } - addrMap := make(map[string]GenesisAccount, len(appState.Accounts)) - for i := 0; i < len(appState.Accounts); i++ { - acc := appState.Accounts[i] - strAddr := string(acc.Address) - addrMap[strAddr] = acc - } - - // addresses and IPs (and port) validator server info - var addressesIPs []string - - for _, fo := range fos { - filename := filepath.Join(genTxsDir, fo.Name()) - if !fo.IsDir() && (filepath.Ext(filename) != ".json") { - continue - } - - // get the genStdTx - var jsonRawTx []byte - if jsonRawTx, err = ioutil.ReadFile(filename); err != nil { - return appGenTxs, persistentPeers, err - } - var genStdTx auth.StdTx - if err = cdc.UnmarshalJSON(jsonRawTx, &genStdTx); err != nil { - return appGenTxs, persistentPeers, err - } - appGenTxs = append(appGenTxs, genStdTx) - - // the memo flag is used to store - // the ip and node-id, for example this may be: - // "528fd3df22b31f4969b05652bfe8f0fe921321d5@192.168.2.37:26656" - nodeAddrIP := genStdTx.GetMemo() - if len(nodeAddrIP) == 0 { - return appGenTxs, persistentPeers, fmt.Errorf( - "couldn't find node's address and IP in %s", fo.Name()) - } - - // genesis transactions must be single-message - msgs := genStdTx.GetMsgs() - if len(msgs) != 1 { - - return appGenTxs, persistentPeers, errors.New( - "each genesis transaction must provide a single genesis message") - } - - msg := msgs[0].(staking.MsgCreateValidator) - // validate delegator and validator addresses and funds against the accounts in the state - delAddr := msg.DelegatorAddr.String() - valAddr := sdk.AccAddress(msg.ValidatorAddr).String() - - delAcc, delOk := addrMap[delAddr] - _, valOk := addrMap[valAddr] - - var accsNotInGenesis []string - if !delOk { - accsNotInGenesis = append(accsNotInGenesis, delAddr) - } - if !valOk { - accsNotInGenesis = append(accsNotInGenesis, valAddr) - } - if len(accsNotInGenesis) != 0 { - return appGenTxs, persistentPeers, fmt.Errorf( - "account(s) %v not in genesis.json: %+v", strings.Join(accsNotInGenesis, " "), addrMap) - } - - if sdk.NewInt(delAcc.Amount).LT(msg.Value.Amount) { - return appGenTxs, persistentPeers, fmt.Errorf( - "insufficient fund for delegation %v: %v < %v", - delAcc.Address, sdk.NewInt(delAcc.Amount), msg.Value.Amount, - ) - } - - // exclude itself from persistent peers - if msg.Description.Moniker != moniker { - addressesIPs = append(addressesIPs, nodeAddrIP) - } - } - - sort.Strings(addressesIPs) - persistentPeers = strings.Join(addressesIPs, ",") - - return appGenTxs, persistentPeers, nil -} diff --git a/daemon/cmd/collect.go b/daemon/cmd/collect.go index ede4610f..f856086d 100644 --- a/daemon/cmd/collect.go +++ b/daemon/cmd/collect.go @@ -100,7 +100,7 @@ func genAppStateFromConfig( ) // process genesis transactions, else create default genesis.json - appGenTxs, persistentPeers, err = app.CollectStdTxs(cdc, config.Moniker, initCfg.GenTxsDir, genDoc) + appGenTxs, persistentPeers, err = CollectStdTxs(cdc, config.Moniker, initCfg.GenTxsDir, genDoc) if err != nil { return } diff --git a/daemon/cmd/testnet.go b/daemon/cmd/testnet.go index 53a59453..4331edd5 100644 --- a/daemon/cmd/testnet.go +++ b/daemon/cmd/testnet.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" "github.com/cybercongress/cyberd/app" + "github.com/cybercongress/cyberd/types/coin" "net" "os" "path/filepath" @@ -178,20 +179,20 @@ func initTestnet(config *tmconfig.Config, cdc *codec.Codec) error { accs = append(accs, app.GenesisAccount{ Address: addr, - Amount: 100, + Amount: 10000000000000000, }) msg := staking.NewMsgCreateValidator( sdk.ValAddress(addr), valPubKeys[i], - sdk.NewInt64Coin("CBD", 100), + sdk.NewInt64Coin(coin.CBD, 10000000000000000), staking.NewDescription(nodeDirName, "", "", ""), staking.NewCommissionMsg(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec()), ) tx := auth.NewStdTx([]sdk.Msg{msg}, auth.StdFee{}, []auth.StdSignature{}, memo) txBldr := authtx.NewTxBuilderFromCLI().WithChainID(chainID).WithMemo(memo) - signedTx, err := txBldr.SignStdTx(nodeDirName, app.DefaultKeyPass, tx, false) + signedTx, err := txBldr.SignStdTx(nodeDirName, keyPass, tx, false) if err != nil { _ = os.RemoveAll(outDir) return err diff --git a/daemon/cmd/utils.go b/daemon/cmd/utils.go index 95faaaaf..d71a994f 100644 --- a/daemon/cmd/utils.go +++ b/daemon/cmd/utils.go @@ -4,28 +4,35 @@ import ( "encoding/json" "fmt" "github.com/cosmos/cosmos-sdk/server" + "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/cosmos/cosmos-sdk/x/staking" "github.com/cybercongress/cyberd/app" "io/ioutil" + "os" "path/filepath" + "sort" + "strings" "time" "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/pkg/errors" "github.com/tendermint/go-amino" cfg "github.com/tendermint/tendermint/config" "github.com/tendermint/tendermint/crypto" "github.com/tendermint/tendermint/libs/common" "github.com/tendermint/tendermint/p2p" "github.com/tendermint/tendermint/privval" - "github.com/tendermint/tendermint/types" + tmtypes "github.com/tendermint/tendermint/types" ) // ExportGenesisFile creates and writes the genesis configuration to disk. An // error is returned if building or writing the configuration to file fails. func ExportGenesisFile( - genFile, chainID string, validators []types.GenesisValidator, appState json.RawMessage, + genFile, chainID string, validators []tmtypes.GenesisValidator, appState json.RawMessage, ) error { - genDoc := types.GenesisDoc{ + genDoc := tmtypes.GenesisDoc{ ChainID: chainID, Validators: validators, AppState: appState, @@ -41,11 +48,11 @@ func ExportGenesisFile( // ExportGenesisFileWithTime creates and writes the genesis configuration to disk. // An error is returned if building or writing the configuration to file fails. func ExportGenesisFileWithTime( - genFile, chainID string, validators []types.GenesisValidator, + genFile, chainID string, validators []tmtypes.GenesisValidator, appState json.RawMessage, genTime time.Time, ) error { - genDoc := types.GenesisDoc{ + genDoc := tmtypes.GenesisDoc{ GenesisTime: genTime, ChainID: chainID, Validators: validators, @@ -87,7 +94,7 @@ func InitializeNodeValidatorFiles( return nodeID, valPubKey, nil } -func loadGenesisDoc(cdc *amino.Codec, genFile string) (genDoc types.GenesisDoc, err error) { +func loadGenesisDoc(cdc *amino.Codec, genFile string) (genDoc tmtypes.GenesisDoc, err error) { genContents, err := ioutil.ReadFile(genFile) if err != nil { return genDoc, err @@ -110,3 +117,103 @@ func initializeEmptyGenesis( return codec.MarshalJSONIndent(cdc, app.NewDefaultGenesisState()) } + +// CollectStdTxs processes and validates application's genesis StdTxs and returns +// the list of appGenTxs, and persistent peers required to generate genesis.json. +func CollectStdTxs(cdc *codec.Codec, moniker string, genTxsDir string, genDoc tmtypes.GenesisDoc) ( + appGenTxs []auth.StdTx, persistentPeers string, err error) { + + var fos []os.FileInfo + fos, err = ioutil.ReadDir(genTxsDir) + if err != nil { + return appGenTxs, persistentPeers, err + } + + // prepare a map of all accounts in genesis state to then validate + // against the validators addresses + var appState app.GenesisState + if err := cdc.UnmarshalJSON(genDoc.AppState, &appState); err != nil { + return appGenTxs, persistentPeers, err + } + addrMap := make(map[string]app.GenesisAccount, len(appState.Accounts)) + for i := 0; i < len(appState.Accounts); i++ { + acc := appState.Accounts[i] + strAddr := acc.Address.String() + addrMap[strAddr] = acc + } + + // addresses and IPs (and port) validator server info + var addressesIPs []string + + for _, fo := range fos { + filename := filepath.Join(genTxsDir, fo.Name()) + if !fo.IsDir() && (filepath.Ext(filename) != ".json") { + continue + } + + // get the genStdTx + var jsonRawTx []byte + if jsonRawTx, err = ioutil.ReadFile(filename); err != nil { + return appGenTxs, persistentPeers, err + } + var genStdTx auth.StdTx + if err = cdc.UnmarshalJSON(jsonRawTx, &genStdTx); err != nil { + return appGenTxs, persistentPeers, err + } + appGenTxs = append(appGenTxs, genStdTx) + + // the memo flag is used to store + // the ip and node-id, for example this may be: + // "528fd3df22b31f4969b05652bfe8f0fe921321d5@192.168.2.37:26656" + nodeAddrIP := genStdTx.GetMemo() + if len(nodeAddrIP) == 0 { + return appGenTxs, persistentPeers, fmt.Errorf( + "couldn't find node's address and IP in %s", fo.Name()) + } + + // genesis transactions must be single-message + msgs := genStdTx.GetMsgs() + if len(msgs) != 1 { + + return appGenTxs, persistentPeers, errors.New( + "each genesis transaction must provide a single genesis message") + } + + msg := msgs[0].(staking.MsgCreateValidator) + // validate delegator and validator addresses and funds against the accounts in the state + delAddr := msg.DelegatorAddr.String() + valAddr := sdk.AccAddress(msg.ValidatorAddr).String() + + delAcc, delOk := addrMap[delAddr] + _, valOk := addrMap[valAddr] + + var accsNotInGenesis []string + if !delOk { + accsNotInGenesis = append(accsNotInGenesis, delAddr) + } + if !valOk { + accsNotInGenesis = append(accsNotInGenesis, valAddr) + } + if len(accsNotInGenesis) != 0 { + return appGenTxs, persistentPeers, fmt.Errorf( + "account(s) %v not in genesis.json: %+v", strings.Join(accsNotInGenesis, " "), addrMap) + } + + if sdk.NewInt(delAcc.Amount).LT(msg.Value.Amount) { + return appGenTxs, persistentPeers, fmt.Errorf( + "insufficient fund for delegation %v: %v < %v", + delAcc.Address, sdk.NewInt(delAcc.Amount), msg.Value.Amount, + ) + } + + // exclude itself from persistent peers + if msg.Description.Moniker != moniker { + addressesIPs = append(addressesIPs, nodeAddrIP) + } + } + + sort.Strings(addressesIPs) + persistentPeers = strings.Join(addressesIPs, ",") + + return appGenTxs, persistentPeers, nil +} diff --git a/types/coin/coins.go b/types/coin/coins.go index 2b7bc3c4..736e1ac4 100644 --- a/types/coin/coins.go +++ b/types/coin/coins.go @@ -1,5 +1,5 @@ package coin const ( - CBD = "CBD" + CBD = "cbd" ) From a405b4d88d0f48aa746706b074f02e50d7105493 Mon Sep 17 00:00:00 2001 From: Artur Albov Date: Tue, 22 Jan 2019 12:59:18 +0700 Subject: [PATCH 03/38] #179 Change Bandwidth Price to Average for 24h Sliding Window. Refactoring --- app/app.go | 103 +++++--------------------------------- x/rank/state.go | 128 ++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 119 insertions(+), 112 deletions(-) diff --git a/app/app.go b/app/app.go index c6be23fe..7f4dbc63 100644 --- a/app/app.go +++ b/app/app.go @@ -86,14 +86,7 @@ type CyberdApp struct { latestBlockHeight int64 - computeUnit rank.ComputeUnit - // TODO: move to RankState??? - rankCalculationFinished bool - cidCount int64 - - rankCalcChan chan rank.Rank - rankErrChan chan error } // NewBasecoinApp returns a reference to a new CyberdApp given a @@ -117,12 +110,11 @@ func NewCyberdApp( // create your application type var app = &CyberdApp{ - cdc: cdc, - txDecoder: txDecoder, - BaseApp: baseapp.NewBaseApp(appName, logger, db, txDecoder, baseAppOptions...), - dbKeys: dbKeys, - mainKeeper: ms, - computeUnit: computeUnit, + cdc: cdc, + txDecoder: txDecoder, + BaseApp: baseapp.NewBaseApp(appName, logger, db, txDecoder, baseAppOptions...), + dbKeys: dbKeys, + mainKeeper: ms, } app.feeCollectionKeeper = NoopFeeCollectionKeeper{} @@ -164,7 +156,10 @@ func NewCyberdApp( app.linkIndexedKeeper = keeper.NewLinkIndexedKeeper(keeper.NewBaseLinkKeeper(ms, dbKeys.links)) app.cidNumKeeper = keeper.NewBaseCidNumberKeeper(ms, dbKeys.cidNum, dbKeys.cidNumReverse) app.stakeIndex = cbdbank.NewIndexedKeeper(&app.bankKeeper, app.accountKeeper) - app.rankState = rank.NewRankState(allowSearch) + app.rankState = rank.NewRankState( + allowSearch, app.mainKeeper, app.stakeIndex, + app.linkIndexedKeeper, app.cidNumKeeper, computeUnit, + ) // register the staking hooks // NOTE: stakingKeeper above are passed by reference, @@ -225,18 +220,7 @@ func NewCyberdApp( app.curBlockSpentBandwidth = 0 // RANK PARAMS - app.rankState.Load(ctx, app.mainKeeper) - app.rankCalculationFinished = true - app.rankCalcChan = make(chan rank.Rank, 1) - app.cidCount = int64(app.mainKeeper.GetCidsCount(ctx)) - app.rankErrChan = make(chan error) - - // if we have fallen and need to start new rank calculation - // todo: what if rank didn't changed in new calculation??? - if app.latestBlockHeight != 0 && !app.rankState.NextRankReady() { - app.startRankCalculation(ctx) - app.rankCalculationFinished = false - } + app.rankState.Load(ctx, app.latestBlockHeight, app.Logger) app.Seal() return app @@ -477,58 +461,8 @@ func (app *CyberdApp) EndBlocker(ctx sdk.Context, _ abci.RequestEndBlock) abci.R app.currentCreditPrice = newPrice app.curBlockSpentBandwidth = 0 - // START RANK CALCULATION - - currentCidsCount := app.mainKeeper.GetCidsCount(ctx) - app.linkIndexedKeeper.EndBlocker() - if ctx.BlockHeight()%rank.CalculationPeriod == 0 || ctx.BlockHeight() == 1 { - - if !app.rankCalculationFinished { - select { - case newRank := <-app.rankCalcChan: - app.handleNewRank(ctx, newRank) - case err := <-app.rankErrChan: - // DUMB ERROR HANDLING - app.BaseApp.Logger.Error("Error during rank calculation " + err.Error()) - panic(err.Error()) - } - } - - app.rankState.ApplyNextRank() - // Recalculate index - // todo state copied - outLinksCopy := lnk.Links(app.linkIndexedKeeper.GetOutLinks()).Copy() - go app.rankState.BuildCidRankedLinksIndexInParallel(app.cidCount, outLinksCopy) - - app.mainKeeper.StoreLastCalculatedRankHash(ctx, app.rankState.GetNetworkRankHash()) - - // start new calculation - app.rankCalculationFinished = false - app.cidCount = int64(currentCidsCount) - app.linkIndexedKeeper.FixLinks() - app.stakeIndex.FixUserStake() - app.startRankCalculation(ctx) - - } else if !app.rankCalculationFinished { - - select { - case newRank := <-app.rankCalcChan: - app.handleNewRank(ctx, newRank) - case err := <-app.rankErrChan: - // DUMB ERROR HANDLING - app.BaseApp.Logger.Error("Error during rank calculation " + err.Error()) - panic(err.Error()) - default: - } - - } - - //CHECK INDEX BUILDING FOR ERROR: - app.rankState.AddNewCids(currentCidsCount) - app.mainKeeper.StoreLatestMerkleTree(ctx, app.rankState.GetNetworkMerkleTreeAsBytes()) - app.rankState.CheckBuildIndexError(app.BaseApp.Logger) - - // END RANK CALCULATION + // RANK CALCULATION + app.rankState.EndBlocker(ctx, app.Logger) return abci.ResponseEndBlock{ ValidatorUpdates: validatorUpdates, @@ -536,19 +470,6 @@ func (app *CyberdApp) EndBlocker(ctx sdk.Context, _ abci.RequestEndBlock) abci.R } } -func (app *CyberdApp) startRankCalculation(ctx sdk.Context) { - calcCtx := rank.NewCalcContext( - ctx, app.linkIndexedKeeper, app.cidNumKeeper, app.stakeIndex, app.rankState.SearchAllowed(), - ) - go rank.CalculateRankInParallel(calcCtx, app.rankCalcChan, app.rankErrChan, app.computeUnit, app.BaseApp.Logger) -} - -func (app *CyberdApp) handleNewRank(ctx sdk.Context, newRank rank.Rank) { - app.rankState.SetNextRank(newRank) - app.mainKeeper.StoreNextMerkleTree(ctx, app.rankState.GetNextMerkleTreeAsBytes()) - app.rankCalculationFinished = true -} - // Implements ABCI func (app *CyberdApp) Commit() (res abci.ResponseCommit) { diff --git a/x/rank/state.go b/x/rank/state.go index 46cca54c..cadf89fc 100644 --- a/x/rank/state.go +++ b/x/rank/state.go @@ -7,6 +7,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cybercongress/cyberd/merkle" "github.com/cybercongress/cyberd/store" + "github.com/cybercongress/cyberd/x/bank" + "github.com/cybercongress/cyberd/x/link/keeper" . "github.com/cybercongress/cyberd/x/link/types" "github.com/tendermint/tendermint/libs/log" "sort" @@ -27,22 +29,100 @@ type RankState struct { lastCalculatedRankHash []byte + rankCalculationFinished bool + cidCount int64 + + rankCalcChan chan Rank + rankErrChan chan error allowSearch bool indexErrChan chan error + computeUnit ComputeUnit + + // keepers + mainKeeper store.MainKeeper + stakeIndex *bank.IndexedKeeper + cidNumKeeper keeper.CidNumberKeeper + linkIndexedKeeper keeper.LinkIndexedKeeper } -func NewRankState(allowSearch bool) *RankState { +func NewRankState( + allowSearch bool, mainKeeper store.MainKeeper, stakeIndex *bank.IndexedKeeper, + linkIndexedKeeper keeper.LinkIndexedKeeper, cidNumKeeper keeper.CidNumberKeeper, + unit ComputeUnit, +) *RankState { return &RankState{ - allowSearch: allowSearch, indexErrChan: make(chan error), + allowSearch: allowSearch, indexErrChan: make(chan error), rankCalcChan: make(chan Rank, 1), + rankErrChan: make(chan error), rankCalculationFinished: true, mainKeeper: mainKeeper, + stakeIndex: stakeIndex, linkIndexedKeeper: linkIndexedKeeper, cidNumKeeper: cidNumKeeper, + computeUnit: unit, } } -func (s *RankState) Load(ctx sdk.Context, mainKeeper store.MainKeeper) { - s.lastCalculatedRankHash = mainKeeper.GetLastCalculatedRankHash(ctx) +func (s *RankState) Load(ctx sdk.Context, latestBlockHeight int64, log log.Logger) { + s.lastCalculatedRankHash = s.mainKeeper.GetLastCalculatedRankHash(ctx) s.networkCidRank = Rank{Values: nil, MerkleTree: merkle.NewTree(sha256.New(), false)} s.nextCidRank = Rank{Values: nil, MerkleTree: merkle.NewTree(sha256.New(), false)} - s.networkCidRank.MerkleTree.ImportSubtreesRoots(mainKeeper.GetLatestMerkleTree(ctx)) - s.nextCidRank.MerkleTree.ImportSubtreesRoots(mainKeeper.GetNextMerkleTree(ctx)) + s.networkCidRank.MerkleTree.ImportSubtreesRoots(s.mainKeeper.GetLatestMerkleTree(ctx)) + s.nextCidRank.MerkleTree.ImportSubtreesRoots(s.mainKeeper.GetNextMerkleTree(ctx)) + + s.cidCount = int64(s.mainKeeper.GetCidsCount(ctx)) + + // if we have fallen and need to start new rank calculation + // todo: what if rank didn't changed in new calculation??? + if latestBlockHeight != 0 && !s.nextRankReady() { + s.startRankCalculation(ctx, log) + s.rankCalculationFinished = false + } +} + +func (s *RankState) EndBlocker(ctx sdk.Context, log log.Logger) { + currentCidsCount := s.mainKeeper.GetCidsCount(ctx) + s.linkIndexedKeeper.EndBlocker() + if ctx.BlockHeight()%CalculationPeriod == 0 || ctx.BlockHeight() == 1 { + + if !s.rankCalculationFinished { + select { + case newRank := <-s.rankCalcChan: + s.handleNewRank(ctx, newRank) + case err := <-s.rankErrChan: + // DUMB ERROR HANDLING + log.Error("Error during rank calculation " + err.Error()) + panic(err.Error()) + } + } + + s.applyNextRank() + // Recalculate index + // todo state copied + outLinksCopy := Links(s.linkIndexedKeeper.GetOutLinks()).Copy() + go s.buildCidRankedLinksIndexInParallel(s.cidCount, outLinksCopy) + + s.mainKeeper.StoreLastCalculatedRankHash(ctx, s.GetNetworkRankHash()) + + // start new calculation + s.rankCalculationFinished = false + s.cidCount = int64(currentCidsCount) + s.linkIndexedKeeper.FixLinks() + s.stakeIndex.FixUserStake() + s.startRankCalculation(ctx, log) + + } else if !s.rankCalculationFinished { + + select { + case newRank := <-s.rankCalcChan: + s.handleNewRank(ctx, newRank) + case err := <-s.rankErrChan: + // DUMB ERROR HANDLING + log.Error("Error during rank calculation " + err.Error()) + panic(err.Error()) + default: + } + + } + //CHECK INDEX BUILDING FOR ERROR: + s.addNewCids(currentCidsCount) + s.mainKeeper.StoreLatestMerkleTree(ctx, s.getNetworkMerkleTreeAsBytes()) + s.checkBuildIndexError(log) } func (s *RankState) GetCidRankedLinks(cidNumber CidNumber, page, perPage int) ([]RankedCidNumber, int, error) { @@ -76,22 +156,33 @@ func (s *RankState) GetCidRankedLinks(cidNumber CidNumber, page, perPage int) ([ return resultSet, totalSize, nil } -func (s *RankState) SetNextRank(newRank Rank) { +func (s *RankState) startRankCalculation(ctx sdk.Context, log log.Logger) { + calcCtx := NewCalcContext(ctx, s.linkIndexedKeeper, s.cidNumKeeper, s.stakeIndex, s.allowSearch) + go CalculateRankInParallel(calcCtx, s.rankCalcChan, s.rankErrChan, s.computeUnit, log) +} + +func (s *RankState) handleNewRank(ctx sdk.Context, newRank Rank) { + s.setNextRank(newRank) + s.mainKeeper.StoreNextMerkleTree(ctx, s.getNextMerkleTreeAsBytes()) + s.rankCalculationFinished = true +} + +func (s *RankState) setNextRank(newRank Rank) { s.nextCidRank = newRank } -func (s *RankState) ApplyNextRank() { +func (s *RankState) applyNextRank() { s.networkCidRank = s.nextCidRank s.lastCalculatedRankHash = s.nextCidRank.MerkleTree.RootHash() s.nextCidRank.Reset() } // add new cids to rank with 0 value -func (s *RankState) AddNewCids(cidCount uint64) { +func (s *RankState) addNewCids(cidCount uint64) { s.networkCidRank.AddNewCids(cidCount) } -func (s *RankState) BuildCidRankedLinksIndex(cidsCount int64, outLinks Links) { +func (s *RankState) buildCidRankedLinksIndex(cidsCount int64, outLinks Links) { // If search on this node is not allowed then we don't need to build index if !s.allowSearch || s.networkCidRank.Values == nil { return @@ -109,17 +200,17 @@ func (s *RankState) BuildCidRankedLinksIndex(cidsCount int64, outLinks Links) { } // Used for building index in parallel -func (s *RankState) BuildCidRankedLinksIndexInParallel(cidsCount int64, outLinks Links) { +func (s *RankState) buildCidRankedLinksIndexInParallel(cidsCount int64, outLinks Links) { defer func() { if r := recover(); r != nil { s.indexErrChan <- r.(error) } }() - s.BuildCidRankedLinksIndex(cidsCount, outLinks) + s.buildCidRankedLinksIndex(cidsCount, outLinks) } -func (s *RankState) CheckBuildIndexError(logger log.Logger) { +func (s *RankState) checkBuildIndexError(logger log.Logger) { if s.allowSearch { select { case err := <-s.indexErrChan: @@ -144,24 +235,19 @@ func (s *RankState) getLinksSortedByRank(cidOutLinks CidLinks) cidRankedLinks { // // GETTERS -//rank index -func (s *RankState) SearchAllowed() bool { - return s.allowSearch -} - func (s *RankState) GetNetworkRankHash() []byte { return s.networkCidRank.MerkleTree.RootHash() } -func (s *RankState) GetNetworkMerkleTreeAsBytes() []byte { +func (s *RankState) getNetworkMerkleTreeAsBytes() []byte { return s.networkCidRank.MerkleTree.ExportSubtreesRoots() } -func (s *RankState) GetNextMerkleTreeAsBytes() []byte { +func (s *RankState) getNextMerkleTreeAsBytes() []byte { return s.nextCidRank.MerkleTree.ExportSubtreesRoots() } -func (s *RankState) NextRankReady() bool { +func (s *RankState) nextRankReady() bool { return s.lastCalculatedRankHash != nil && !bytes.Equal(s.nextCidRank.MerkleTree.RootHash(), s.lastCalculatedRankHash) } From b12c05194b32fb3d43999584ded4bea350c9ad19 Mon Sep 17 00:00:00 2001 From: Artur Albov Date: Wed, 23 Jan 2019 21:39:43 +0700 Subject: [PATCH 04/38] #179 Change Bandwidth Price to Average for 24h Sliding Window --- app/app.go | 36 ++++-------- app/fee.go | 4 -- app/keys.go | 61 +++++++++---------- app/rpc.go | 2 +- wiki/cid.go | 19 ------ wiki/index.go | 83 -------------------------- wiki/wiki.go | 53 ----------------- x/bandwidth/abci.go | 22 +------ x/bandwidth/keeper.go | 39 ++++++++++++ x/bandwidth/meter.go | 114 ++++++++++++++++++++++++++++-------- x/bandwidth/params.go | 6 +- x/bandwidth/types/keeper.go | 5 ++ x/bandwidth/types/meter.go | 12 +++- 13 files changed, 197 insertions(+), 259 deletions(-) delete mode 100644 wiki/cid.go delete mode 100644 wiki/index.go delete mode 100644 wiki/wiki.go diff --git a/app/app.go b/app/app.go index 7f4dbc63..9d466e7a 100644 --- a/app/app.go +++ b/app/app.go @@ -22,13 +22,11 @@ import ( cbdbank "github.com/cybercongress/cyberd/x/bank" "github.com/cybercongress/cyberd/x/link" "github.com/cybercongress/cyberd/x/link/keeper" - lnk "github.com/cybercongress/cyberd/x/link/types" "github.com/cybercongress/cyberd/x/rank" abci "github.com/tendermint/tendermint/abci/types" cmn "github.com/tendermint/tendermint/libs/common" dbm "github.com/tendermint/tendermint/libs/db" "github.com/tendermint/tendermint/libs/log" - "math" "os" "sort" "time" @@ -57,11 +55,8 @@ type CyberdApp struct { txDecoder sdk.TxDecoder // bandwidth - bandwidthMeter bw.BandwidthMeter - //todo 3 fields below should be in bw meter - curBlockSpentBandwidth uint64 //resets every block - lastTotalSpentBandwidth uint64 //resets every bandwidth price adjustment interval - currentCreditPrice float64 + bandwidthMeter bw.BandwidthMeter + blockBandwidthKeeper bw.BlockSpentBandwidthKeeper // keys to access the multistore dbKeys CyberdAppDbKeys @@ -85,8 +80,6 @@ type CyberdApp struct { rankState *rank.RankState latestBlockHeight int64 - - // TODO: move to RankState??? } // NewBasecoinApp returns a reference to a new CyberdApp given a @@ -120,6 +113,7 @@ func NewCyberdApp( app.feeCollectionKeeper = NoopFeeCollectionKeeper{} app.paramsKeeper = params.NewKeeper(app.cdc, dbKeys.params, dbKeys.tParams) app.accBandwidthKeeper = bandwidth.NewAccBandwidthKeeper(dbKeys.accBandwidth) + app.blockBandwidthKeeper = bandwidth.NewBlockSpentBandwidthKeeper(dbKeys.blockBandwidth) app.accountKeeper = auth.NewAccountKeeper( app.cdc, dbKeys.acc, @@ -169,7 +163,8 @@ func NewCyberdApp( ) app.bandwidthMeter = bandwidth.NewBaseMeter( - app.accountKeeper, app.bankKeeper, app.accBandwidthKeeper, bandwidth.MsgBandwidthCosts, + app.mainKeeper, app.accountKeeper, app.bankKeeper, app.accBandwidthKeeper, bandwidth.MsgBandwidthCosts, + app.blockBandwidthKeeper, ) // register message routes @@ -202,6 +197,7 @@ func NewCyberdApp( ctx := app.BaseApp.NewContext(true, abci.Header{}) app.latestBlockHeight = int64(ms.GetLatestBlockNumber(ctx)) + ctx = ctx.WithBlockHeight(app.latestBlockHeight) // build context for current rank calculation round rankRoundBlockNumber := (app.latestBlockHeight / rank.CalculationPeriod) * rank.CalculationPeriod @@ -214,10 +210,8 @@ func NewCyberdApp( app.stakeIndex.Load(rankCtx, ctx) app.BaseApp.Logger.Info("App loaded", "time", time.Since(start)) - // BANDWIDTH PARAMS - app.lastTotalSpentBandwidth = ms.GetSpentBandwidth(ctx) - app.currentCreditPrice = math.Float64frombits(ms.GetBandwidthPrice(ctx, bandwidth.BaseCreditPrice)) - app.curBlockSpentBandwidth = 0 + // BANDWIDTH LOAD + app.bandwidthMeter.Load(ctx) // RANK PARAMS app.rankState.Load(ctx, app.latestBlockHeight, app.Logger) @@ -315,7 +309,7 @@ func (app *CyberdApp) CheckTx(txBytes []byte) (res abci.ResponseCheckTx) { if err == nil { - txCost := app.bandwidthMeter.GetTxCost(ctx, app.currentCreditPrice, tx) + txCost := app.bandwidthMeter.GetTxCost(ctx, tx) accBw := app.bandwidthMeter.GetCurrentAccBandwidth(ctx, acc) if !accBw.HasEnoughRemained(txCost) { @@ -348,7 +342,7 @@ func (app *CyberdApp) DeliverTx(txBytes []byte) (res abci.ResponseDeliverTx) { if err == nil { - txCost := app.bandwidthMeter.GetTxCost(ctx, app.currentCreditPrice, tx) + txCost := app.bandwidthMeter.GetTxCost(ctx, tx) accBw := app.bandwidthMeter.GetCurrentAccBandwidth(ctx, acc) if !accBw.HasEnoughRemained(txCost) { @@ -357,7 +351,7 @@ func (app *CyberdApp) DeliverTx(txBytes []byte) (res abci.ResponseDeliverTx) { resp := app.BaseApp.DeliverTx(txBytes) app.bandwidthMeter.ConsumeAccBandwidth(ctx, accBw, txCost) - app.curBlockSpentBandwidth = app.curBlockSpentBandwidth + uint64(txCost) + app.bandwidthMeter.AddToBlockBandwidth(uint64(txCost)) return abci.ResponseDeliverTx{ Code: uint32(resp.Code), @@ -453,13 +447,7 @@ func (app *CyberdApp) EndBlocker(ctx sdk.Context, _ abci.RequestEndBlock) abci.R validatorUpdates, tags := staking.EndBlocker(ctx, app.stakingKeeper) app.stakeIndex.EndBlocker(ctx) - newPrice, totalSpentBandwidth := bandwidth.EndBlocker( - ctx, app.lastTotalSpentBandwidth+app.curBlockSpentBandwidth, app.currentCreditPrice, - app.mainKeeper, app.bandwidthMeter, - ) - app.lastTotalSpentBandwidth = totalSpentBandwidth - app.currentCreditPrice = newPrice - app.curBlockSpentBandwidth = 0 + bandwidth.EndBlocker(ctx, app.bandwidthMeter) // RANK CALCULATION app.rankState.EndBlocker(ctx, app.Logger) diff --git a/app/fee.go b/app/fee.go index 4abf71e5..5d2e576a 100644 --- a/app/fee.go +++ b/app/fee.go @@ -2,17 +2,13 @@ package app import ( sdk "github.com/cosmos/cosmos-sdk/types" - "log" ) var noCoins = sdk.Coins{} -//__________________________________________________________________________________ -// fee collection keeper used only for testing type NoopFeeCollectionKeeper struct{} func (fck NoopFeeCollectionKeeper) AddCollectedFees(_ sdk.Context, c sdk.Coins) sdk.Coins { - log.Println(c.String()) return noCoins } diff --git a/app/keys.go b/app/keys.go index 5d2c6167..2c490c45 100644 --- a/app/keys.go +++ b/app/keys.go @@ -12,51 +12,52 @@ import ( ) type CyberdAppDbKeys struct { - main *sdk.KVStoreKey - acc *sdk.KVStoreKey - accIndex *sdk.KVStoreKey - cidNum *sdk.KVStoreKey - cidNumReverse *sdk.KVStoreKey - links *sdk.KVStoreKey - rank *sdk.KVStoreKey - stake *sdk.KVStoreKey - tStake *sdk.TransientStoreKey - distr *sdk.KVStoreKey - tDistr *sdk.TransientStoreKey - slashing *sdk.KVStoreKey + main *sdk.KVStoreKey + acc *sdk.KVStoreKey + accIndex *sdk.KVStoreKey + cidNum *sdk.KVStoreKey + cidNumReverse *sdk.KVStoreKey + links *sdk.KVStoreKey + rank *sdk.KVStoreKey + stake *sdk.KVStoreKey + tStake *sdk.TransientStoreKey + distr *sdk.KVStoreKey + tDistr *sdk.TransientStoreKey + slashing *sdk.KVStoreKey mint *sdk.KVStoreKey - params *sdk.KVStoreKey - tParams *sdk.TransientStoreKey - accBandwidth *sdk.KVStoreKey + params *sdk.KVStoreKey + tParams *sdk.TransientStoreKey + accBandwidth *sdk.KVStoreKey + blockBandwidth *sdk.KVStoreKey } func NewCyberdAppDbKeys() CyberdAppDbKeys { return CyberdAppDbKeys{ - - main: sdk.NewKVStoreKey(bam.MainStoreKey), - acc: sdk.NewKVStoreKey(auth.StoreKey), - stake: sdk.NewKVStoreKey(staking.StoreKey), - tStake: sdk.NewTransientStoreKey(staking.TStoreKey), - mint: sdk.NewKVStoreKey(mint.StoreKey), - distr: sdk.NewKVStoreKey(distr.StoreKey), + main: sdk.NewKVStoreKey(bam.MainStoreKey), + acc: sdk.NewKVStoreKey(auth.StoreKey), + stake: sdk.NewKVStoreKey(staking.StoreKey), + tStake: sdk.NewTransientStoreKey(staking.TStoreKey), + mint: sdk.NewKVStoreKey(mint.StoreKey), + distr: sdk.NewKVStoreKey(distr.StoreKey), tDistr: sdk.NewTransientStoreKey(distr.TStoreKey), - slashing: sdk.NewKVStoreKey(slashing.StoreKey), - params: sdk.NewKVStoreKey(params.StoreKey), - tParams: sdk.NewTransientStoreKey(params.TStoreKey), + slashing: sdk.NewKVStoreKey(slashing.StoreKey), + params: sdk.NewKVStoreKey(params.StoreKey), + tParams: sdk.NewTransientStoreKey(params.TStoreKey), - cidNum: sdk.NewKVStoreKey("cid_index"), - cidNumReverse: sdk.NewKVStoreKey("cid_index_reverse"), + cidNum: sdk.NewKVStoreKey("cid_index"), + cidNumReverse: sdk.NewKVStoreKey("cid_index_reverse"), links: sdk.NewKVStoreKey("links"), - rank: sdk.NewKVStoreKey("rank"), - accBandwidth: sdk.NewKVStoreKey("acc_bandwidth"), + rank: sdk.NewKVStoreKey("rank"), + accBandwidth: sdk.NewKVStoreKey("acc_bandwidth"), + blockBandwidth: sdk.NewKVStoreKey("block_spent_bandwidth"), } } func (k CyberdAppDbKeys) GetStoreKeys() []*sdk.KVStoreKey { return []*sdk.KVStoreKey{ k.main, k.acc, k.cidNum, k.cidNumReverse, k.links, k.rank, k.stake, - k.slashing, k.params, k.distr, k.mint, k.accBandwidth, + k.slashing, k.params, k.distr, k.mint, k.accBandwidth, k.blockBandwidth, } } diff --git a/app/rpc.go b/app/rpc.go index dea92a1b..8b2c9677 100644 --- a/app/rpc.go +++ b/app/rpc.go @@ -67,7 +67,7 @@ func (app *CyberdApp) IsLinkExist(from cbdlink.Cid, to cbdlink.Cid, address sdk. } func (app *CyberdApp) CurrentBandwidthPrice() float64 { - return app.currentCreditPrice + return app.bandwidthMeter.GetCurrentCreditPrice() } func (app *CyberdApp) CidsCount() uint64 { diff --git a/wiki/cid.go b/wiki/cid.go deleted file mode 100644 index e736d7b6..00000000 --- a/wiki/cid.go +++ /dev/null @@ -1,19 +0,0 @@ -package main - -import ( - links "github.com/cybercongress/cyberd/x/link/types" - "github.com/ipfs/go-cid" - "github.com/multiformats/go-multihash" -) - -var pref = cid.Prefix{ - Version: 0, - Codec: cid.Raw, - MhType: multihash.SHA2_256, - MhLength: -1, // default length -} - -func Cid(data string) links.Cid { - result, _ := pref.Sum([]byte(data)) - return links.Cid(result.String()) -} diff --git a/wiki/index.go b/wiki/index.go deleted file mode 100644 index 3b209fa6..00000000 --- a/wiki/index.go +++ /dev/null @@ -1,83 +0,0 @@ -package main - -import ( - "bufio" - "fmt" - "github.com/cybercongress/cyberd/client" - "os" - "regexp" - "strings" - "unicode" -) - -func ContinueIndex(cbdClient client.CyberdClient) { - - startArticleId := int64(1) - - f, err := os.OpenFile("enwiki-latest-all-titles", 0, 0) - if err != nil { - panic(err) - } - br := bufio.NewReader(f) - defer f.Close() - - reg, err := regexp.Compile("[^a-zA-Z0-9]+") - - counter := int64(0) - links := make([]client.Link, 0, 1000) - for { - - line, err := br.ReadString('\n') - - if err != nil { - break - } - - if counter < startArticleId { - counter++ - continue - } - - split := strings.Split(strings.TrimSuffix(line, "\n"), "\t") - ids := strings.Split(split[1], "_") - - idsSet := make(map[string]struct{}) - for _, id := range ids { - idsSet[id] = struct{}{} - } - - for id := range idsSet { - - id = reg.ReplaceAllString(id, "") - id = strings.ToLower(id) - - if len(id) == 0 || id == "" { - continue - } - - if len(id) == 1 && unicode.IsSymbol(rune(id[0])) { - continue - } - - page := split[1] + ".wiki" - links = append(links, client.Link{From: Cid(id), To: Cid(page)}) - counter++ - - if len(links) == 1000 { - fmt.Printf("%d %s\n", counter, split[1]) - - accBw, err := cbdClient.GetAccountBandwidth() - if err == nil { - per := int64(100 * float64(accBw.RemainedValue) / float64(accBw.MaxValue)) - fmt.Printf("Remaining acc bw: %d %v%%\n", accBw.RemainedValue, per) - } - - err = cbdClient.SubmitLinksSync(links) - if err != nil { - panic(err.Error()) - } - links = make([]client.Link, 0, 1000) - } - } - } -} diff --git a/wiki/wiki.go b/wiki/wiki.go deleted file mode 100644 index 4b598d74..00000000 --- a/wiki/wiki.go +++ /dev/null @@ -1,53 +0,0 @@ -package main - -import ( - "fmt" - "github.com/cybercongress/cyberd/client" - "github.com/mitchellh/go-homedir" - "github.com/spf13/cobra" - "github.com/spf13/viper" - "os" -) - -/* -./wiki start ---node=127.0.0.1:34657 --passphrase=1q2w3e4r \ ---address=cosmos1g7e74lxpwlcsza8v0nca2hwahluqcv4r4d3p8p \ -*/ - -func main() { - - homeDir, err := homedir.Dir() - if err != nil { - fmt.Println(err) - os.Exit(1) - } - - cmd := &cobra.Command{ - Use: "start", - Short: "Start wiki indexing", - RunE: func(cmd *cobra.Command, args []string) error { - address := viper.GetString(client.FlagAddress) - nodeUrl := viper.GetString(client.FlagNode) - pasphrase := viper.GetString(client.FlagPassphrase) - cyberdClient := client.NewHttpCyberdClient(nodeUrl, pasphrase, address) - ContinueIndex(cyberdClient) - return nil - }, - } - - cmd.Flags().String(client.FlagAddress, "", "Account to sign transactions") - cmd.Flags().String(client.FlagPassphrase, "", "Passphrase of account") - cmd.Flags().String(client.FlagNode, "127.0.0.1:26657", "Url of node communicate with") - cmd.Flags().String(client.FlagHome, homeDir+"/.cyberdcli", "Cyberd CLI home folder") - - _ = viper.BindPFlag(client.FlagPassphrase, cmd.Flags().Lookup(client.FlagPassphrase)) - _ = viper.BindPFlag(client.FlagAddress, cmd.Flags().Lookup(client.FlagAddress)) - _ = viper.BindPFlag(client.FlagNode, cmd.Flags().Lookup(client.FlagNode)) - _ = viper.BindPFlag(client.FlagHome, cmd.Flags().Lookup(client.FlagHome)) - - if err := cmd.Execute(); err != nil { - fmt.Println(err) - os.Exit(1) - } -} diff --git a/x/bandwidth/abci.go b/x/bandwidth/abci.go index 41042ced..c8865aa2 100644 --- a/x/bandwidth/abci.go +++ b/x/bandwidth/abci.go @@ -2,9 +2,7 @@ package bandwidth import ( sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cybercongress/cyberd/store" "github.com/cybercongress/cyberd/x/bandwidth/types" - "math" ) var accsToUpdate = make([]sdk.AccAddress, 0) @@ -37,25 +35,11 @@ func CollectAddressesWithStakeChange() func(ctx sdk.Context, from sdk.AccAddress // 2. For accs with updated on current block stake adjust max bandwidth. Why not update on `onCoinsTransfer`? // Cuz for some bound related operations, coins already added/reduced from acc, but not added to // validator\delegator pool. -func EndBlocker( - ctx sdk.Context, totalSpentForPeriod uint64, curPrice float64, ms store.MainKeeper, meter types.BandwidthMeter, -) (newPrice float64, totalSpent uint64) { +func EndBlocker(ctx sdk.Context, meter types.BandwidthMeter) { - newPrice = curPrice if ctx.BlockHeight() != 0 && ctx.BlockHeight()%AdjustPricePeriod == 0 { - averageSpentValue := DesirableNetworkBandwidthForRecoveryPeriod / (RecoveryPeriod / AdjustPricePeriod) - newPrice = float64(totalSpentForPeriod) / float64(averageSpentValue) - - if newPrice < 0.01*BaseCreditPrice { - newPrice = 0.01 * BaseCreditPrice - } - - ms.StoreBandwidthPrice(ctx, math.Float64bits(newPrice)) - ms.StoreSpentBandwidth(ctx, 0) - totalSpentForPeriod = 0 + meter.AdjustPrice(ctx) } - - ms.StoreSpentBandwidth(ctx, totalSpentForPeriod) + meter.CommitBlockBandwidth(ctx) updateAccMaxBandwidth(ctx, meter) - return newPrice, totalSpentForPeriod } diff --git a/x/bandwidth/keeper.go b/x/bandwidth/keeper.go index 8db26b47..5670b614 100644 --- a/x/bandwidth/keeper.go +++ b/x/bandwidth/keeper.go @@ -1,6 +1,7 @@ package bandwidth import ( + "encoding/binary" "encoding/json" sdk "github.com/cosmos/cosmos-sdk/types" . "github.com/cybercongress/cyberd/x/bandwidth/types" @@ -38,3 +39,41 @@ func (bk BaseAccBandwidthKeeper) GetAccBandwidth(ctx sdk.Context, addr sdk.AccAd } return } + +type BaseBlockSpentBandwidthKeeper struct { + key *sdk.KVStoreKey +} + +func NewBlockSpentBandwidthKeeper(key *sdk.KVStoreKey) BaseBlockSpentBandwidthKeeper { + return BaseBlockSpentBandwidthKeeper{key: key} +} + +func (bk BaseBlockSpentBandwidthKeeper) SetBlockSpentBandwidth(ctx sdk.Context, blockNumber uint64, value uint64) { + keyAsBytes := make([]byte, 8) + binary.LittleEndian.PutUint64(keyAsBytes, blockNumber) + valueAsBytes := make([]byte, 8) + binary.LittleEndian.PutUint64(valueAsBytes, value) + ctx.KVStore(bk.key).Set(keyAsBytes, valueAsBytes) +} + +func (bk BaseBlockSpentBandwidthKeeper) GetValuesForPeriod(ctx sdk.Context, period int64) map[uint64]uint64 { + + startKey := make([]byte, 8) + binary.LittleEndian.PutUint64(startKey, uint64(ctx.BlockHeight()-period+1)) + + endKey := make([]byte, 8) + binary.LittleEndian.PutUint64(endKey, uint64(ctx.BlockHeight())) + + iterator := ctx.KVStore(bk.key).Iterator(startKey, sdk.PrefixEndBytes(endKey)) + defer iterator.Close() + + result := make(map[uint64]uint64) + for iterator.Valid() { + blockNumber := binary.LittleEndian.Uint64(iterator.Key()) + value := binary.LittleEndian.Uint64(iterator.Value()) + result[blockNumber] = value + iterator.Next() + } + + return result +} diff --git a/x/bandwidth/meter.go b/x/bandwidth/meter.go index d1625478..73009864 100644 --- a/x/bandwidth/meter.go +++ b/x/bandwidth/meter.go @@ -3,56 +3,120 @@ package bandwidth import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/cybercongress/cyberd/store" "github.com/cybercongress/cyberd/x/bandwidth/types" + "math" ) var _ types.BandwidthMeter = BaseBandwidthMeter{} type BaseBandwidthMeter struct { // data providers - accKeeper auth.AccountKeeper - stakeProvider types.AccStakeProvider - bwKeeper types.Keeper + accKeeper auth.AccountKeeper + stakeProvider types.AccStakeProvider + bwKeeper types.Keeper + mainKeeper store.MainKeeper + blockBandwidthKeeper types.BlockSpentBandwidthKeeper // bw configuration msgCost types.MsgBandwidthCost + + // price adjustment fields + curBlockSpentBandwidth *uint64 //resets every block + currentCreditPrice *float64 + bandwidthSpent map[uint64]uint64 // bandwidth spent by blocks + totalSpentForSlidingWindow *uint64 } func NewBaseMeter( - ak auth.AccountKeeper, sp types.AccStakeProvider, bwKeeper types.Keeper, msgCost types.MsgBandwidthCost, + mainKeeper store.MainKeeper, ak auth.AccountKeeper, sp types.AccStakeProvider, bwKeeper types.Keeper, + msgCost types.MsgBandwidthCost, blockBandwidthKeeper types.BlockSpentBandwidthKeeper, ) BaseBandwidthMeter { return BaseBandwidthMeter{ - accKeeper: ak, - stakeProvider: sp, - bwKeeper: bwKeeper, - msgCost: msgCost, + mainKeeper: mainKeeper, + blockBandwidthKeeper: blockBandwidthKeeper, + accKeeper: ak, + stakeProvider: sp, + bwKeeper: bwKeeper, + msgCost: msgCost, + curBlockSpentBandwidth: new(uint64), + currentCreditPrice: new(float64), + totalSpentForSlidingWindow: new(uint64), + bandwidthSpent: make(map[uint64]uint64), } } -func (h BaseBandwidthMeter) GetTxCost(ctx sdk.Context, price float64, tx sdk.Tx) int64 { +func (m BaseBandwidthMeter) Load(ctx sdk.Context) { + *m.totalSpentForSlidingWindow = 0 + for blockNum, spentBandwidth := range m.blockBandwidthKeeper.GetValuesForPeriod(ctx, SlidingWindowSize) { + m.bandwidthSpent[blockNum] = spentBandwidth + *m.totalSpentForSlidingWindow += spentBandwidth + } + *m.currentCreditPrice = math.Float64frombits(m.mainKeeper.GetBandwidthPrice(ctx, BaseCreditPrice)) + *m.curBlockSpentBandwidth = 0 +} + +func (m BaseBandwidthMeter) AddToBlockBandwidth(value uint64) { + // we have to divide by price here to get base price value + *m.curBlockSpentBandwidth += uint64(float64(value) / *m.currentCreditPrice) +} + +// Here we move bandwidth window: +// Remove first block of window and add new block to window end +func (m BaseBandwidthMeter) CommitBlockBandwidth(ctx sdk.Context) { + *m.totalSpentForSlidingWindow += *m.curBlockSpentBandwidth + + newWindowEnd := ctx.BlockHeight() + windowStart := newWindowEnd - SlidingWindowSize + if windowStart < 0 { // check needed cause it will be casted to uint and can cause overflow + windowStart = 0 + } + windowStartValue, exists := m.bandwidthSpent[uint64(windowStart)] + if exists { + *m.totalSpentForSlidingWindow -= windowStartValue + delete(m.bandwidthSpent, uint64(windowStart)) + } + m.blockBandwidthKeeper.SetBlockSpentBandwidth(ctx, uint64(ctx.BlockHeight()), *m.curBlockSpentBandwidth) + m.bandwidthSpent[uint64(newWindowEnd)] = *m.curBlockSpentBandwidth + *m.curBlockSpentBandwidth = 0 +} + +func (m BaseBandwidthMeter) AdjustPrice(ctx sdk.Context) { + + newPrice := float64(*m.totalSpentForSlidingWindow) / float64(ShouldBeSpentPerSlidingWindow) + + if newPrice < 0.01*BaseCreditPrice { + newPrice = 0.01 * BaseCreditPrice + } + + *m.currentCreditPrice = newPrice + m.mainKeeper.StoreBandwidthPrice(ctx, math.Float64bits(newPrice)) +} + +func (m BaseBandwidthMeter) GetTxCost(ctx sdk.Context, tx sdk.Tx) int64 { bandwidthForTx := TxCost for _, msg := range tx.GetMsgs() { - bandwidthForTx = bandwidthForTx + h.msgCost(msg) + bandwidthForTx = bandwidthForTx + m.msgCost(msg) } - return int64(float64(bandwidthForTx) * price) + return int64(float64(bandwidthForTx) * *m.currentCreditPrice) } -func (h BaseBandwidthMeter) GetAccMaxBandwidth(ctx sdk.Context, addr sdk.AccAddress) int64 { - accStakePercentage := h.stakeProvider.GetAccStakePercentage(ctx, addr) +func (m BaseBandwidthMeter) GetAccMaxBandwidth(ctx sdk.Context, addr sdk.AccAddress) int64 { + accStakePercentage := m.stakeProvider.GetAccStakePercentage(ctx, addr) return int64(accStakePercentage * float64(DesirableNetworkBandwidthForRecoveryPeriod)) } -func (h BaseBandwidthMeter) GetCurrentAccBandwidth(ctx sdk.Context, address sdk.AccAddress) types.AcсBandwidth { - accBw := h.bwKeeper.GetAccBandwidth(ctx, address) - accMaxBw := h.GetAccMaxBandwidth(ctx, address) +func (m BaseBandwidthMeter) GetCurrentAccBandwidth(ctx sdk.Context, address sdk.AccAddress) types.AcсBandwidth { + accBw := m.bwKeeper.GetAccBandwidth(ctx, address) + accMaxBw := m.GetAccMaxBandwidth(ctx, address) accBw.UpdateMax(accMaxBw, ctx.BlockHeight(), RecoveryPeriod) return accBw } -func (h BaseBandwidthMeter) UpdateAccMaxBandwidth(ctx sdk.Context, address sdk.AccAddress) { - bw := h.GetCurrentAccBandwidth(ctx, address) - h.bwKeeper.SetAccBandwidth(ctx, bw) +func (m BaseBandwidthMeter) UpdateAccMaxBandwidth(ctx sdk.Context, address sdk.AccAddress) { + bw := m.GetCurrentAccBandwidth(ctx, address) + m.bwKeeper.SetAccBandwidth(ctx, bw) } // @@ -63,9 +127,13 @@ func (h BaseBandwidthMeter) UpdateAccMaxBandwidth(ctx sdk.Context, address sdk.A // bw := getCurrentBw(addr) // bwCost := deliverTx(tx) // consumeBw(bw, bwCost) -func (h BaseBandwidthMeter) ConsumeAccBandwidth(ctx sdk.Context, bw types.AcсBandwidth, amt int64) { +func (m BaseBandwidthMeter) ConsumeAccBandwidth(ctx sdk.Context, bw types.AcсBandwidth, amt int64) { bw.Consume(amt) - h.bwKeeper.SetAccBandwidth(ctx, bw) - bw = h.GetCurrentAccBandwidth(ctx, bw.Address) - h.bwKeeper.SetAccBandwidth(ctx, bw) + m.bwKeeper.SetAccBandwidth(ctx, bw) + bw = m.GetCurrentAccBandwidth(ctx, bw.Address) + m.bwKeeper.SetAccBandwidth(ctx, bw) +} + +func (m BaseBandwidthMeter) GetCurrentCreditPrice() float64 { + return *m.currentCreditPrice } diff --git a/x/bandwidth/params.go b/x/bandwidth/params.go index 84a9921e..04227e5a 100644 --- a/x/bandwidth/params.go +++ b/x/bandwidth/params.go @@ -12,6 +12,8 @@ const ( // Number of blocks to recover full bandwidth RecoveryPeriod = 60 * 60 * 24 // Number of blocks before next adjust price - AdjustPricePeriod = 60 * 10 - BaseCreditPrice float64 = 1.0 + AdjustPricePeriod = 60 * 10 + BaseCreditPrice float64 = 1.0 + SlidingWindowSize = RecoveryPeriod / 2 + ShouldBeSpentPerSlidingWindow = float64(DesirableNetworkBandwidthForRecoveryPeriod) / (float64(RecoveryPeriod) / float64(SlidingWindowSize)) ) diff --git a/x/bandwidth/types/keeper.go b/x/bandwidth/types/keeper.go index 90bc076a..fa596996 100644 --- a/x/bandwidth/types/keeper.go +++ b/x/bandwidth/types/keeper.go @@ -8,3 +8,8 @@ type Keeper interface { SetAccBandwidth(ctx sdk.Context, bandwidth AcсBandwidth) GetAccBandwidth(ctx sdk.Context, address sdk.AccAddress) (bw AcсBandwidth) } + +type BlockSpentBandwidthKeeper interface { + SetBlockSpentBandwidth(ctx sdk.Context, blockNumber uint64, value uint64) + GetValuesForPeriod(ctx sdk.Context, period int64) map[uint64]uint64 +} \ No newline at end of file diff --git a/x/bandwidth/types/meter.go b/x/bandwidth/types/meter.go index 638fc9fe..ed979c01 100644 --- a/x/bandwidth/types/meter.go +++ b/x/bandwidth/types/meter.go @@ -15,6 +15,16 @@ type AccStakeProvider interface { // 4. Consume bw and save with old max bw value // 5. Load bw with new max value and save it type BandwidthMeter interface { + // load current bandwidth state after restart + Load(ctx sdk.Context) + // add value to consumed bandwidth for current block + AddToBlockBandwidth(value uint64) + // adjust price based on 24h loading + AdjustPrice(ctx sdk.Context) + // get current bandwidth price + GetCurrentCreditPrice() float64 + // commit bandwidth value spent for current block + CommitBlockBandwidth(ctx sdk.Context) // Update acc max bandwidth for current stake. Also, performs recover. UpdateAccMaxBandwidth(ctx sdk.Context, address sdk.AccAddress) // Returns recovered to current block height acc bandwidth @@ -22,7 +32,7 @@ type BandwidthMeter interface { // Returns acc max bandwidth GetAccMaxBandwidth(ctx sdk.Context, address sdk.AccAddress) int64 // Returns tx bandwidth cost - GetTxCost(ctx sdk.Context, price float64, tx sdk.Tx) int64 + GetTxCost(ctx sdk.Context, tx sdk.Tx) int64 // // Performs bw consumption for given acc // To get right number, should be called after tx delivery with bw state obtained prior delivery From 97e1d8bf86f4a634bea1f57f8eaa106bec63514d Mon Sep 17 00:00:00 2001 From: Artur Albov Date: Thu, 24 Jan 2019 12:21:45 +0700 Subject: [PATCH 05/38] #179 Change Bandwidth Price to Average for 24h Sliding Window. Notes fixes --- app/app.go | 6 ++-- x/bandwidth/keeper.go | 6 +++- x/bandwidth/meter.go | 72 +++++++++++++++++++------------------- x/bandwidth/types/meter.go | 6 ++-- 4 files changed, 48 insertions(+), 42 deletions(-) diff --git a/app/app.go b/app/app.go index 9d466e7a..b77610c3 100644 --- a/app/app.go +++ b/app/app.go @@ -309,7 +309,7 @@ func (app *CyberdApp) CheckTx(txBytes []byte) (res abci.ResponseCheckTx) { if err == nil { - txCost := app.bandwidthMeter.GetTxCost(ctx, tx) + txCost := app.bandwidthMeter.GetPricedTxCost(tx) accBw := app.bandwidthMeter.GetCurrentAccBandwidth(ctx, acc) if !accBw.HasEnoughRemained(txCost) { @@ -342,7 +342,7 @@ func (app *CyberdApp) DeliverTx(txBytes []byte) (res abci.ResponseDeliverTx) { if err == nil { - txCost := app.bandwidthMeter.GetTxCost(ctx, tx) + txCost := app.bandwidthMeter.GetPricedTxCost(tx) accBw := app.bandwidthMeter.GetCurrentAccBandwidth(ctx, acc) if !accBw.HasEnoughRemained(txCost) { @@ -351,7 +351,7 @@ func (app *CyberdApp) DeliverTx(txBytes []byte) (res abci.ResponseDeliverTx) { resp := app.BaseApp.DeliverTx(txBytes) app.bandwidthMeter.ConsumeAccBandwidth(ctx, accBw, txCost) - app.bandwidthMeter.AddToBlockBandwidth(uint64(txCost)) + app.bandwidthMeter.AddToBlockBandwidth(app.bandwidthMeter.GetTxCost(tx)) return abci.ResponseDeliverTx{ Code: uint32(resp.Code), diff --git a/x/bandwidth/keeper.go b/x/bandwidth/keeper.go index 5670b614..2e3a45e9 100644 --- a/x/bandwidth/keeper.go +++ b/x/bandwidth/keeper.go @@ -59,7 +59,11 @@ func (bk BaseBlockSpentBandwidthKeeper) SetBlockSpentBandwidth(ctx sdk.Context, func (bk BaseBlockSpentBandwidthKeeper) GetValuesForPeriod(ctx sdk.Context, period int64) map[uint64]uint64 { startKey := make([]byte, 8) - binary.LittleEndian.PutUint64(startKey, uint64(ctx.BlockHeight()-period+1)) + windowStart := ctx.BlockHeight() - period + 1 + if windowStart < 0 { // check needed cause it will be casted to uint and can cause overflow + windowStart = 0 + } + binary.LittleEndian.PutUint64(startKey, uint64(windowStart)) endKey := make([]byte, 8) binary.LittleEndian.PutUint64(endKey, uint64(ctx.BlockHeight())) diff --git a/x/bandwidth/meter.go b/x/bandwidth/meter.go index 73009864..4dcf4f77 100644 --- a/x/bandwidth/meter.go +++ b/x/bandwidth/meter.go @@ -8,7 +8,7 @@ import ( "math" ) -var _ types.BandwidthMeter = BaseBandwidthMeter{} +var _ types.BandwidthMeter = &BaseBandwidthMeter{} type BaseBandwidthMeter struct { // data providers @@ -22,50 +22,46 @@ type BaseBandwidthMeter struct { msgCost types.MsgBandwidthCost // price adjustment fields - curBlockSpentBandwidth *uint64 //resets every block - currentCreditPrice *float64 + curBlockSpentBandwidth uint64 //resets every block + currentCreditPrice float64 bandwidthSpent map[uint64]uint64 // bandwidth spent by blocks - totalSpentForSlidingWindow *uint64 + totalSpentForSlidingWindow uint64 } func NewBaseMeter( mainKeeper store.MainKeeper, ak auth.AccountKeeper, sp types.AccStakeProvider, bwKeeper types.Keeper, msgCost types.MsgBandwidthCost, blockBandwidthKeeper types.BlockSpentBandwidthKeeper, -) BaseBandwidthMeter { +) *BaseBandwidthMeter { - return BaseBandwidthMeter{ + return &BaseBandwidthMeter{ mainKeeper: mainKeeper, blockBandwidthKeeper: blockBandwidthKeeper, accKeeper: ak, stakeProvider: sp, bwKeeper: bwKeeper, msgCost: msgCost, - curBlockSpentBandwidth: new(uint64), - currentCreditPrice: new(float64), - totalSpentForSlidingWindow: new(uint64), bandwidthSpent: make(map[uint64]uint64), } } -func (m BaseBandwidthMeter) Load(ctx sdk.Context) { - *m.totalSpentForSlidingWindow = 0 - for blockNum, spentBandwidth := range m.blockBandwidthKeeper.GetValuesForPeriod(ctx, SlidingWindowSize) { - m.bandwidthSpent[blockNum] = spentBandwidth - *m.totalSpentForSlidingWindow += spentBandwidth +func (m *BaseBandwidthMeter) Load(ctx sdk.Context) { + m.totalSpentForSlidingWindow = 0 + m.bandwidthSpent = m.blockBandwidthKeeper.GetValuesForPeriod(ctx, SlidingWindowSize) + for _, spentBandwidth := range m.bandwidthSpent { + m.totalSpentForSlidingWindow += spentBandwidth } - *m.currentCreditPrice = math.Float64frombits(m.mainKeeper.GetBandwidthPrice(ctx, BaseCreditPrice)) - *m.curBlockSpentBandwidth = 0 + m.currentCreditPrice = math.Float64frombits(m.mainKeeper.GetBandwidthPrice(ctx, BaseCreditPrice)) + m.curBlockSpentBandwidth = 0 } -func (m BaseBandwidthMeter) AddToBlockBandwidth(value uint64) { - // we have to divide by price here to get base price value - *m.curBlockSpentBandwidth += uint64(float64(value) / *m.currentCreditPrice) +func (m *BaseBandwidthMeter) AddToBlockBandwidth(value int64) { + m.curBlockSpentBandwidth += uint64(value) } // Here we move bandwidth window: // Remove first block of window and add new block to window end -func (m BaseBandwidthMeter) CommitBlockBandwidth(ctx sdk.Context) { - *m.totalSpentForSlidingWindow += *m.curBlockSpentBandwidth +func (m *BaseBandwidthMeter) CommitBlockBandwidth(ctx sdk.Context) { + m.totalSpentForSlidingWindow += m.curBlockSpentBandwidth newWindowEnd := ctx.BlockHeight() windowStart := newWindowEnd - SlidingWindowSize @@ -74,47 +70,51 @@ func (m BaseBandwidthMeter) CommitBlockBandwidth(ctx sdk.Context) { } windowStartValue, exists := m.bandwidthSpent[uint64(windowStart)] if exists { - *m.totalSpentForSlidingWindow -= windowStartValue + m.totalSpentForSlidingWindow -= windowStartValue delete(m.bandwidthSpent, uint64(windowStart)) } - m.blockBandwidthKeeper.SetBlockSpentBandwidth(ctx, uint64(ctx.BlockHeight()), *m.curBlockSpentBandwidth) - m.bandwidthSpent[uint64(newWindowEnd)] = *m.curBlockSpentBandwidth - *m.curBlockSpentBandwidth = 0 + m.blockBandwidthKeeper.SetBlockSpentBandwidth(ctx, uint64(ctx.BlockHeight()), m.curBlockSpentBandwidth) + m.bandwidthSpent[uint64(newWindowEnd)] = m.curBlockSpentBandwidth + m.curBlockSpentBandwidth = 0 } -func (m BaseBandwidthMeter) AdjustPrice(ctx sdk.Context) { +func (m *BaseBandwidthMeter) AdjustPrice(ctx sdk.Context) { - newPrice := float64(*m.totalSpentForSlidingWindow) / float64(ShouldBeSpentPerSlidingWindow) + newPrice := float64(m.totalSpentForSlidingWindow) / float64(ShouldBeSpentPerSlidingWindow) if newPrice < 0.01*BaseCreditPrice { newPrice = 0.01 * BaseCreditPrice } - *m.currentCreditPrice = newPrice + m.currentCreditPrice = newPrice m.mainKeeper.StoreBandwidthPrice(ctx, math.Float64bits(newPrice)) } -func (m BaseBandwidthMeter) GetTxCost(ctx sdk.Context, tx sdk.Tx) int64 { +func (m *BaseBandwidthMeter) GetTxCost(tx sdk.Tx) int64 { bandwidthForTx := TxCost for _, msg := range tx.GetMsgs() { bandwidthForTx = bandwidthForTx + m.msgCost(msg) } - return int64(float64(bandwidthForTx) * *m.currentCreditPrice) + return bandwidthForTx } -func (m BaseBandwidthMeter) GetAccMaxBandwidth(ctx sdk.Context, addr sdk.AccAddress) int64 { +func (m *BaseBandwidthMeter) GetPricedTxCost(tx sdk.Tx) int64 { + return int64(float64(m.GetTxCost(tx)) * m.currentCreditPrice) +} + +func (m *BaseBandwidthMeter) GetAccMaxBandwidth(ctx sdk.Context, addr sdk.AccAddress) int64 { accStakePercentage := m.stakeProvider.GetAccStakePercentage(ctx, addr) return int64(accStakePercentage * float64(DesirableNetworkBandwidthForRecoveryPeriod)) } -func (m BaseBandwidthMeter) GetCurrentAccBandwidth(ctx sdk.Context, address sdk.AccAddress) types.AcсBandwidth { +func (m *BaseBandwidthMeter) GetCurrentAccBandwidth(ctx sdk.Context, address sdk.AccAddress) types.AcсBandwidth { accBw := m.bwKeeper.GetAccBandwidth(ctx, address) accMaxBw := m.GetAccMaxBandwidth(ctx, address) accBw.UpdateMax(accMaxBw, ctx.BlockHeight(), RecoveryPeriod) return accBw } -func (m BaseBandwidthMeter) UpdateAccMaxBandwidth(ctx sdk.Context, address sdk.AccAddress) { +func (m *BaseBandwidthMeter) UpdateAccMaxBandwidth(ctx sdk.Context, address sdk.AccAddress) { bw := m.GetCurrentAccBandwidth(ctx, address) m.bwKeeper.SetAccBandwidth(ctx, bw) } @@ -127,13 +127,13 @@ func (m BaseBandwidthMeter) UpdateAccMaxBandwidth(ctx sdk.Context, address sdk.A // bw := getCurrentBw(addr) // bwCost := deliverTx(tx) // consumeBw(bw, bwCost) -func (m BaseBandwidthMeter) ConsumeAccBandwidth(ctx sdk.Context, bw types.AcсBandwidth, amt int64) { +func (m *BaseBandwidthMeter) ConsumeAccBandwidth(ctx sdk.Context, bw types.AcсBandwidth, amt int64) { bw.Consume(amt) m.bwKeeper.SetAccBandwidth(ctx, bw) bw = m.GetCurrentAccBandwidth(ctx, bw.Address) m.bwKeeper.SetAccBandwidth(ctx, bw) } -func (m BaseBandwidthMeter) GetCurrentCreditPrice() float64 { - return *m.currentCreditPrice +func (m *BaseBandwidthMeter) GetCurrentCreditPrice() float64 { + return m.currentCreditPrice } diff --git a/x/bandwidth/types/meter.go b/x/bandwidth/types/meter.go index ed979c01..98ca46ed 100644 --- a/x/bandwidth/types/meter.go +++ b/x/bandwidth/types/meter.go @@ -18,7 +18,7 @@ type BandwidthMeter interface { // load current bandwidth state after restart Load(ctx sdk.Context) // add value to consumed bandwidth for current block - AddToBlockBandwidth(value uint64) + AddToBlockBandwidth(value int64) // adjust price based on 24h loading AdjustPrice(ctx sdk.Context) // get current bandwidth price @@ -32,7 +32,9 @@ type BandwidthMeter interface { // Returns acc max bandwidth GetAccMaxBandwidth(ctx sdk.Context, address sdk.AccAddress) int64 // Returns tx bandwidth cost - GetTxCost(ctx sdk.Context, tx sdk.Tx) int64 + GetTxCost(tx sdk.Tx) int64 + // Return tx bandwidth cost considering the price + GetPricedTxCost(tx sdk.Tx) int64 // // Performs bw consumption for given acc // To get right number, should be called after tx delivery with bw state obtained prior delivery From dcff256c10b0a88fe37562f8266b2294b73b4581 Mon Sep 17 00:00:00 2001 From: Hleb Albau Date: Thu, 24 Jan 2019 16:47:16 +0700 Subject: [PATCH 06/38] Fix rank calculation context data --- app/app.go | 4 ++-- x/link/keeper/link_index.go | 4 ++-- x/rank/context.go | 2 +- x/rank/state.go | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/app.go b/app/app.go index b77610c3..b0c5581c 100644 --- a/app/app.go +++ b/app/app.go @@ -74,7 +74,7 @@ type CyberdApp struct { mintKeeper mint.Keeper // cyberd storage - linkIndexedKeeper keeper.LinkIndexedKeeper + linkIndexedKeeper *keeper.LinkIndexedKeeper cidNumKeeper keeper.CidNumberKeeper stakeIndex *cbdbank.IndexedKeeper rankState *rank.RankState @@ -169,7 +169,7 @@ func NewCyberdApp( // register message routes app.Router(). - AddRoute("link", link.NewLinksHandler(app.cidNumKeeper, &app.linkIndexedKeeper, app.accountKeeper)). + AddRoute("link", link.NewLinksHandler(app.cidNumKeeper, app.linkIndexedKeeper, app.accountKeeper)). AddRoute(bank.RouterKey, bank.NewHandler(app.bankKeeper)). AddRoute(staking.RouterKey, staking.NewHandler(app.stakingKeeper)). AddRoute(distr.RouterKey, distr.NewHandler(app.distrKeeper)). diff --git a/x/link/keeper/link_index.go b/x/link/keeper/link_index.go index b70dd701..d594c5c1 100644 --- a/x/link/keeper/link_index.go +++ b/x/link/keeper/link_index.go @@ -22,8 +22,8 @@ type LinkIndexedKeeper struct { currentBlockLinks []Link } -func NewLinkIndexedKeeper(keeper LinkKeeper) LinkIndexedKeeper { - return LinkIndexedKeeper{LinkKeeper: keeper} +func NewLinkIndexedKeeper(keeper LinkKeeper) *LinkIndexedKeeper { + return &LinkIndexedKeeper{LinkKeeper: keeper} } func (i *LinkIndexedKeeper) Load(rankCtx sdk.Context, freshCtx sdk.Context) { diff --git a/x/rank/context.go b/x/rank/context.go index 2afbba92..d01ba8b9 100644 --- a/x/rank/context.go +++ b/x/rank/context.go @@ -22,7 +22,7 @@ type CalculationContext struct { } func NewCalcContext( - ctx sdk.Context, linkIndex keeper.LinkIndexedKeeper, + ctx sdk.Context, linkIndex *keeper.LinkIndexedKeeper, numberKeeper keeper.CidNumberKeeper, indexedKeeper *bank.IndexedKeeper, fullTree bool, ) *CalculationContext { diff --git a/x/rank/state.go b/x/rank/state.go index cadf89fc..cad31462 100644 --- a/x/rank/state.go +++ b/x/rank/state.go @@ -42,12 +42,12 @@ type RankState struct { mainKeeper store.MainKeeper stakeIndex *bank.IndexedKeeper cidNumKeeper keeper.CidNumberKeeper - linkIndexedKeeper keeper.LinkIndexedKeeper + linkIndexedKeeper *keeper.LinkIndexedKeeper } func NewRankState( allowSearch bool, mainKeeper store.MainKeeper, stakeIndex *bank.IndexedKeeper, - linkIndexedKeeper keeper.LinkIndexedKeeper, cidNumKeeper keeper.CidNumberKeeper, + linkIndexedKeeper *keeper.LinkIndexedKeeper, cidNumKeeper keeper.CidNumberKeeper, unit ComputeUnit, ) *RankState { return &RankState{ From e30ee3a1f719a90f8d986a76e84966a8493ccbef Mon Sep 17 00:00:00 2001 From: Artur Albov Date: Thu, 24 Jan 2019 17:14:30 +0700 Subject: [PATCH 07/38] #171 Tx size reduction: switch to more compact links tx encoding --- cli/commands/linktx.go | 2 +- cli/main.go | 2 ++ client/helpers.go | 27 -------------------------- client/http_client.go | 6 +++--- client/spec.go | 9 ++------- types/errors.go | 7 +++++++ x/link/handler.go | 38 ++++++++++++++++++++++++++++--------- x/link/keeper/link.go | 12 ++++++------ x/link/keeper/link_index.go | 8 ++++---- x/link/msgs.go | 29 +++++++++++++++++++--------- x/link/types/cid.go | 2 +- x/link/types/filter.go | 23 ++++++++++++++++++++++ x/link/types/link.go | 15 ++++++++++----- 13 files changed, 108 insertions(+), 72 deletions(-) delete mode 100644 client/helpers.go create mode 100644 x/link/types/filter.go diff --git a/cli/commands/linktx.go b/cli/commands/linktx.go index 5af55aba..5372fed4 100644 --- a/cli/commands/linktx.go +++ b/cli/commands/linktx.go @@ -58,7 +58,7 @@ func LinkTxCmd(cdc *codec.Codec) *cobra.Command { } // build and sign the transaction, then broadcast to Tendermint - msg := link.NewMsg(from, cidFrom, cidTo) + msg := link.NewMsg(from, []cbdlink.Link{{From: cidFrom, To: cidTo}}) return utils.CompleteAndBroadcastTxCli(txCtx, cliCtx, []sdk.Msg{msg}) }, diff --git a/cli/main.go b/cli/main.go index 513cc8cb..d3249c8b 100644 --- a/cli/main.go +++ b/cli/main.go @@ -71,6 +71,8 @@ func main() { // todo: hack till we don't handle with all merkle proofs viper.SetDefault(client.FlagTrustNode, true) + cyberdcli.PersistentFlags().String(client.FlagChainID, "", "Chain ID of cyberd node") + executor := cli.PrepareMainCmd(cyberdcli, "CBD", os.ExpandEnv("$HOME/.cyberdcli")) err := executor.Execute() if err != nil { diff --git a/client/helpers.go b/client/helpers.go deleted file mode 100644 index f33dd280..00000000 --- a/client/helpers.go +++ /dev/null @@ -1,27 +0,0 @@ -package client - -import ( - cbdlink "github.com/cybercongress/cyberd/x/link/types" -) - -type CidsFilter map[cbdlink.Cid]map[cbdlink.Cid]struct{} - -func (cf CidsFilter) Put(from cbdlink.Cid, to cbdlink.Cid) { - - cidLinks := cf[from] - if cidLinks == nil { - cidLinks = make(map[cbdlink.Cid]struct{}) - } - cidLinks[to] = struct{}{} - cf[from] = cidLinks -} - -func (cf CidsFilter) Contains(from cbdlink.Cid, to cbdlink.Cid) bool { - - cidLinks := cf[from] - if cidLinks == nil { - return false - } - _, contains := cidLinks[to] - return contains -} diff --git a/client/http_client.go b/client/http_client.go index 3b05ea8a..359a629c 100644 --- a/client/http_client.go +++ b/client/http_client.go @@ -13,7 +13,7 @@ import ( "github.com/cybercongress/cyberd/daemon/rpc" bwtps "github.com/cybercongress/cyberd/x/bandwidth/types" "github.com/cybercongress/cyberd/x/link" - cbdlink "github.com/cybercongress/cyberd/x/link/types" + . "github.com/cybercongress/cyberd/x/link/types" tdmClient "github.com/tendermint/tendermint/rpc/client" "github.com/tendermint/tendermint/rpc/lib/client" "os" @@ -89,7 +89,7 @@ func (c HttpCyberdClient) GetChainId() string { return c.chainId } -func (c HttpCyberdClient) IsLinkExist(from cbdlink.Cid, to cbdlink.Cid, addr sdk.AccAddress) (result bool, err error) { +func (c HttpCyberdClient) IsLinkExist(from Cid, to Cid, addr sdk.AccAddress) (result bool, err error) { _, err = c.httpClient.Call("is_link_exist", map[string]interface{}{"from": from, "to": to, "address": addr.String()}, &result, @@ -130,7 +130,7 @@ func (c HttpCyberdClient) SubmitLinksSync(links []Link) error { return err } if !exists { - msges = append(msges, link.NewMsg(c.fromAddress, l.From, l.To)) + msges = append(msges, link.NewMsg(c.fromAddress, []Link{{From: l.From, To: l.To}})) } filter.Put(l.From, l.To) } diff --git a/client/spec.go b/client/spec.go index 44d3d108..d817d870 100644 --- a/client/spec.go +++ b/client/spec.go @@ -3,14 +3,9 @@ package client import ( sdk "github.com/cosmos/cosmos-sdk/types" bwtps "github.com/cybercongress/cyberd/x/bandwidth/types" - cbdlink "github.com/cybercongress/cyberd/x/link/types" + . "github.com/cybercongress/cyberd/x/link/types" ) -type Link struct { - From cbdlink.Cid - To cbdlink.Cid -} - type CyberdClient interface { // Cyberd Client Specification @@ -18,7 +13,7 @@ type CyberdClient interface { GetChainId() string // returns, if given link already exists - IsLinkExist(from cbdlink.Cid, to cbdlink.Cid, addr sdk.AccAddress) (result bool, err error) + IsLinkExist(from Cid, to Cid, addr sdk.AccAddress) (result bool, err error) // get current bandwidth credits price // price 1 is price for situation, when all users use all their bandwidth (all blocks are filled for 100%) diff --git a/types/errors.go b/types/errors.go index 0336e641..f09d1f1f 100644 --- a/types/errors.go +++ b/types/errors.go @@ -12,6 +12,7 @@ const ( CodeInvalidCid sdk.CodeType = 2 CodeCidNotFound sdk.CodeType = 3 CodeNotEnoughBandwidth sdk.CodeType = 4 + CodeDuplicatedLink sdk.CodeType = 5 // Code space CodespaceCbd sdk.CodespaceType = "cyberd" @@ -27,6 +28,8 @@ func codeToDefaultMsg(code sdk.CodeType) string { return "link already exists" case CodeNotEnoughBandwidth: return "not enough bandwidth to make transaction" + case CodeDuplicatedLink: + return "duplicated link" default: return fmt.Sprintf("unknown error: code %d", code) } @@ -47,6 +50,10 @@ func ErrCidNotFound() sdk.Error { return newError(CodespaceCbd, CodeCidNotFound) } +func ErrDuplicatedLink() sdk.Error { + return newError(CodespaceCbd, CodeDuplicatedLink) +} + func newError(codespace sdk.CodespaceType, code sdk.CodeType) sdk.Error { msg := codeToDefaultMsg(code) return sdk.NewError(codespace, code, msg) diff --git a/x/link/handler.go b/x/link/handler.go index fcfd75c2..eb5a1d0a 100644 --- a/x/link/handler.go +++ b/x/link/handler.go @@ -18,19 +18,39 @@ func NewLinksHandler(cis keeper.CidNumberKeeper, ls *keeper.LinkIndexedKeeper, a return func(ctx sdk.Context, msg sdk.Msg) sdk.Result { linkMsg := msg.(Msg) - fromCidNumber := cis.GetOrPutCidNumber(ctx, linkMsg.From) - toCidNumber := cis.GetOrPutCidNumber(ctx, linkMsg.To) - accNumber := cbd.AccNumber(as.GetAccount(ctx, linkMsg.Address).GetAccountNumber()) - link := cbdlink.NewLink(fromCidNumber, toCidNumber, accNumber) - if ls.IsLinkExist(ctx, link) { - return sdk.Result{Code: cbd.CodeLinkAlreadyExist, Codespace: cbd.CodespaceCbd} + //validations + //todo: optimize + for _, link := range linkMsg.Links { + // if cid not exists it automatically means that this is new link + fromCidNumber, exists := cis.GetCidNumber(ctx, link.From) + if !exists { + continue + } + toCidNumber, exists := cis.GetCidNumber(ctx, link.To) + if !exists { + continue + } + + accNumber := cbd.AccNumber(as.GetAccount(ctx, linkMsg.Address).GetAccountNumber()) + compactLink := cbdlink.NewLink(fromCidNumber, toCidNumber, accNumber) + + if ls.IsLinkExist(ctx, compactLink) { + return sdk.Result{Code: cbd.CodeLinkAlreadyExist, Codespace: cbd.CodespaceCbd} + } } - if !ctx.IsCheckTx() { - ls.PutIntoIndex(link) + for _, link := range linkMsg.Links { + fromCidNumber := cis.GetOrPutCidNumber(ctx, link.From) + toCidNumber := cis.GetOrPutCidNumber(ctx, link.To) + accNumber := cbd.AccNumber(as.GetAccount(ctx, linkMsg.Address).GetAccountNumber()) + compactLink := cbdlink.NewLink(fromCidNumber, toCidNumber, accNumber) + + if !ctx.IsCheckTx() { + ls.PutIntoIndex(compactLink) + } + ls.PutLink(ctx, compactLink) } - ls.PutLink(ctx, link) return sdk.Result{Code: cbd.CodeOK, Codespace: cbd.CodespaceCbd} } diff --git a/x/link/keeper/link.go b/x/link/keeper/link.go index 9f6753a5..3dc8ebf4 100644 --- a/x/link/keeper/link.go +++ b/x/link/keeper/link.go @@ -9,8 +9,8 @@ import ( ) type LinkKeeper interface { - PutLink(ctx sdk.Context, link Link) - IsLinkExist(ctx sdk.Context, link Link) bool + PutLink(ctx sdk.Context, link CompactLink) + IsLinkExist(ctx sdk.Context, link CompactLink) bool GetAllLinks(ctx sdk.Context) (Links, Links, error) GetLinksCount(ctx sdk.Context) uint64 } @@ -27,14 +27,14 @@ func NewBaseLinkKeeper(ms store.MainKeeper, key *sdk.KVStoreKey) LinkKeeper { } } -func (lk BaseLinkKeeper) PutLink(ctx sdk.Context, link Link) { +func (lk BaseLinkKeeper) PutLink(ctx sdk.Context, link CompactLink) { store := ctx.KVStore(lk.key) linkAsBytes := marshalLink(link) store.Set(linkAsBytes, []byte{}) lk.ms.IncrementLinksCount(ctx) } -func (lk BaseLinkKeeper) IsLinkExist(ctx sdk.Context, link Link) bool { +func (lk BaseLinkKeeper) IsLinkExist(ctx sdk.Context, link CompactLink) bool { store := ctx.KVStore(lk.key) linkAsBytes := marshalLink(link) return store.Get(linkAsBytes) != nil @@ -63,7 +63,7 @@ func (lk BaseLinkKeeper) GetLinksCount(ctx sdk.Context) uint64 { return lk.ms.GetLinksCount(ctx) } -func unmarshalLink(b []byte) Link { +func unmarshalLink(b []byte) CompactLink { return NewLink( CidNumber(binary.LittleEndian.Uint64(b[0:8])), CidNumber(binary.LittleEndian.Uint64(b[8:16])), @@ -71,7 +71,7 @@ func unmarshalLink(b []byte) Link { ) } -func marshalLink(l Link) []byte { +func marshalLink(l CompactLink) []byte { b := make([]byte, 24) binary.LittleEndian.PutUint64(b[0:8], uint64(l.From())) binary.LittleEndian.PutUint64(b[8:16], uint64(l.To())) diff --git a/x/link/keeper/link_index.go b/x/link/keeper/link_index.go index d594c5c1..d6691130 100644 --- a/x/link/keeper/link_index.go +++ b/x/link/keeper/link_index.go @@ -19,7 +19,7 @@ type LinkIndexedKeeper struct { nextRankInLinks map[CidNumber]CidLinks nextRankOutLinks map[CidNumber]CidLinks - currentBlockLinks []Link + currentBlockLinks []CompactLink } func NewLinkIndexedKeeper(keeper LinkKeeper) *LinkIndexedKeeper { @@ -55,10 +55,10 @@ func (i *LinkIndexedKeeper) EndBlocker() { Links(i.nextRankOutLinks).Put(link.From(), link.To(), link.Acc()) Links(i.nextRankInLinks).Put(link.To(), link.From(), link.Acc()) } - i.currentBlockLinks = make([]Link, 0, 1000) // todo: 1000 hardcoded value + i.currentBlockLinks = make([]CompactLink, 0, 1000) // todo: 1000 hardcoded value } -func (i *LinkIndexedKeeper) PutIntoIndex(link Link) { +func (i *LinkIndexedKeeper) PutIntoIndex(link CompactLink) { i.currentBlockLinks = append(i.currentBlockLinks, link) } @@ -70,6 +70,6 @@ func (i *LinkIndexedKeeper) GetInLinks() map[CidNumber]CidLinks { return i.currentRankInLinks } -func (i *LinkIndexedKeeper) GetCurrentBlockLinks() []Link { +func (i *LinkIndexedKeeper) GetCurrentBlockLinks() []CompactLink { return i.currentBlockLinks } diff --git a/x/link/msgs.go b/x/link/msgs.go index 1dde771e..390f8313 100644 --- a/x/link/msgs.go +++ b/x/link/msgs.go @@ -9,14 +9,13 @@ import ( type Msg struct { Address sdk.AccAddress `json:"address"` - From Cid `json:"cid1"` - To Cid `json:"cid2"` + Links []Link `json:"links"` } var _ sdk.Msg = Msg{} -func NewMsg(address sdk.AccAddress, fromCid Cid, toCid Cid) Msg { - return Msg{Address: address, From: fromCid, To: toCid} +func NewMsg(address sdk.AccAddress, links []Link) Msg { + return Msg{Address: address, Links: links} } func (msg Msg) Name() string { return "link" } @@ -30,18 +29,30 @@ func (msg Msg) ValidateBasic() sdk.Error { return sdk.ErrInvalidAddress(msg.Address.String()) } - if _, err := cid.Decode(string(msg.From)); err != nil { - return cbd.ErrInvalidCid() - } + var filter = make(CidsFilter) + + for _, link := range msg.Links { + + if _, err := cid.Decode(string(link.From)); err != nil { + return cbd.ErrInvalidCid() + } - if _, err := cid.Decode(string(msg.To)); err != nil { - return cbd.ErrInvalidCid() + if _, err := cid.Decode(string(link.To)); err != nil { + return cbd.ErrInvalidCid() + } + + if filter.Contains(link.From, link.To) { + return cbd.ErrDuplicatedLink() + } + + filter.Put(link.From, link.To) } return nil } func (msg Msg) GetSignBytes() []byte { + b, err := msgCdc.MarshalJSON(msg) if err != nil { panic(err) diff --git a/x/link/types/cid.go b/x/link/types/cid.go index 8200516c..45e77170 100644 --- a/x/link/types/cid.go +++ b/x/link/types/cid.go @@ -7,7 +7,7 @@ import . "github.com/cybercongress/cyberd/types" type Links map[CidNumber]CidLinks type CidLinks map[CidNumber]map[AccNumber]struct{} -type Cid string +type Cid string // 32 byte string type CidNumber uint64 func (links Links) Put(from CidNumber, to CidNumber, acc AccNumber) { diff --git a/x/link/types/filter.go b/x/link/types/filter.go new file mode 100644 index 00000000..b990e95a --- /dev/null +++ b/x/link/types/filter.go @@ -0,0 +1,23 @@ +package types + +type CidsFilter map[Cid]map[Cid]struct{} + +func (cf CidsFilter) Put(from Cid, to Cid) { + + cidLinks := cf[from] + if cidLinks == nil { + cidLinks = make(map[Cid]struct{}) + } + cidLinks[to] = struct{}{} + cf[from] = cidLinks +} + +func (cf CidsFilter) Contains(from Cid, to Cid) bool { + + cidLinks := cf[from] + if cidLinks == nil { + return false + } + _, contains := cidLinks[to] + return contains +} diff --git a/x/link/types/link.go b/x/link/types/link.go index ce30d3d4..05da6999 100644 --- a/x/link/types/link.go +++ b/x/link/types/link.go @@ -3,15 +3,20 @@ package types import . "github.com/cybercongress/cyberd/types" type Link struct { + From Cid + To Cid +} + +type CompactLink struct { from CidNumber to CidNumber acc AccNumber } -func NewLink(from CidNumber, to CidNumber, acc AccNumber) Link { - return Link{from: from, to: to, acc: acc} +func NewLink(from CidNumber, to CidNumber, acc AccNumber) CompactLink { + return CompactLink{from: from, to: to, acc: acc} } -func (l Link) From() CidNumber { return l.from } -func (l Link) To() CidNumber { return l.to } -func (l Link) Acc() AccNumber { return l.acc } +func (l CompactLink) From() CidNumber { return l.from } +func (l CompactLink) To() CidNumber { return l.to } +func (l CompactLink) Acc() AccNumber { return l.acc } From 90430bcbbff19ee4a072806b0dea38c824577b78 Mon Sep 17 00:00:00 2001 From: Hleb Albau Date: Fri, 25 Jan 2019 12:35:49 +0700 Subject: [PATCH 08/38] Update to cosmos-sdk v0.30.0 --- cli/main.go | 55 ++++++++++++++++++++----------------------- docs/run_validator.md | 2 +- go.mod | 7 +++--- go.sum | 10 ++++---- 4 files changed, 33 insertions(+), 41 deletions(-) diff --git a/cli/main.go b/cli/main.go index d3249c8b..31f40665 100644 --- a/cli/main.go +++ b/cli/main.go @@ -1,35 +1,30 @@ package main import ( - "github.com/cosmos/cosmos-sdk/client/tx" - "github.com/cybercongress/cyberd/cli/commands/keys" - "github.com/spf13/viper" - "github.com/tendermint/go-amino" - "os" - "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/rpc" + "github.com/cosmos/cosmos-sdk/client/tx" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/version" - "github.com/cybercongress/cyberd/app" - cyberdcmd "github.com/cybercongress/cyberd/cli/commands" - "github.com/spf13/cobra" - "github.com/tendermint/tendermint/libs/cli" - + at "github.com/cosmos/cosmos-sdk/x/auth" authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli" bankcmd "github.com/cosmos/cosmos-sdk/x/bank/client/cli" + dist "github.com/cosmos/cosmos-sdk/x/distribution" distClient "github.com/cosmos/cosmos-sdk/x/distribution/client" + gv "github.com/cosmos/cosmos-sdk/x/gov" govClient "github.com/cosmos/cosmos-sdk/x/gov/client" + sl "github.com/cosmos/cosmos-sdk/x/slashing" slashingClient "github.com/cosmos/cosmos-sdk/x/slashing/client" + st "github.com/cosmos/cosmos-sdk/x/staking" stakingClient "github.com/cosmos/cosmos-sdk/x/staking/client" -) - -const ( - storeAcc = "acc" - storeGov = "gov" - storeSlashing = "slashing" - storeStake = "stake" - storeDist = "distr" + "github.com/cybercongress/cyberd/app" + cyberdcmd "github.com/cybercongress/cyberd/cli/commands" + "github.com/cybercongress/cyberd/cli/commands/keys" + "github.com/spf13/cobra" + "github.com/spf13/viper" + "github.com/tendermint/go-amino" + "github.com/tendermint/tendermint/libs/cli" + "os" ) func main() { @@ -46,21 +41,25 @@ func main() { } mc := []sdk.ModuleClients{ - govClient.NewModuleClient(storeGov, cdc), - distClient.NewModuleClient(storeDist, cdc), - stakingClient.NewModuleClient(storeStake, cdc), - slashingClient.NewModuleClient(storeSlashing, cdc), + govClient.NewModuleClient(gv.StoreKey, cdc), + distClient.NewModuleClient(dist.StoreKey, cdc), + stakingClient.NewModuleClient(st.StoreKey, cdc), + slashingClient.NewModuleClient(sl.StoreKey, cdc), } + // todo: hack till we don't handle with all merkle proofs + viper.SetDefault(client.FlagTrustNode, true) + cyberdcli.PersistentFlags().String(client.FlagChainID, "", "Chain Id of cyberd node") + // Construct Root Command cyberdcli.AddCommand( rpc.StatusCommand(), - client.ConfigCmd(), queryCmd(cdc, mc), txCmd(cdc, mc), keys.Commands(), client.LineBreak, version.VersionCmd, + client.NewCompletionCmd(cyberdcli, true), ) cyberdcli.AddCommand( @@ -68,11 +67,6 @@ func main() { cyberdcmd.LinkTxCmd(cdc), )...) - // todo: hack till we don't handle with all merkle proofs - viper.SetDefault(client.FlagTrustNode, true) - - cyberdcli.PersistentFlags().String(client.FlagChainID, "", "Chain ID of cyberd node") - executor := cli.PrepareMainCmd(cyberdcli, "CBD", os.ExpandEnv("$HOME/.cyberdcli")) err := executor.Execute() if err != nil { @@ -94,7 +88,7 @@ func queryCmd(cdc *amino.Codec, mc []sdk.ModuleClients) *cobra.Command { tx.SearchTxCmd(cdc), tx.QueryTxCmd(cdc), client.LineBreak, - authcmd.GetAccountCmd(storeAcc, cdc), + authcmd.GetAccountCmd(at.StoreKey, cdc), ) for _, m := range mc { @@ -114,6 +108,7 @@ func txCmd(cdc *amino.Codec, mc []sdk.ModuleClients) *cobra.Command { bankcmd.SendTxCmd(cdc), client.LineBreak, authcmd.GetSignCommand(cdc), + authcmd.GetMultiSignCommand(cdc), bankcmd.GetBroadcastCommand(cdc), client.LineBreak, ) diff --git a/docs/run_validator.md b/docs/run_validator.md index 7123f626..574f4117 100644 --- a/docs/run_validator.md +++ b/docs/run_validator.md @@ -140,7 +140,7 @@ So the validator candidate is an account this time. To declare a validator candidate, run the following command adjusting stake amount and other fields. ```bash -docker exec -ti cyberd cyberdcli tx stake create-validator \ +docker exec -ti cyberd cyberdcli tx staking create-validator \ --amount=100CBD \ --pubkey= \ --moniker= \ diff --git a/go.mod b/go.mod index 612e311b..e7015dea 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/bgentry/speakeasy v0.1.0 // indirect github.com/btcsuite/btcd v0.0.0-20180903232927-cff30e1d23fc // indirect github.com/btcsuite/btcutil v0.0.0-20180706230648-ab6388e0c60a // indirect - github.com/cosmos/cosmos-sdk v0.28.2-0.20190123020839-b2ae4ed57319 + github.com/cosmos/cosmos-sdk v0.30.0 github.com/cosmos/go-bip39 v0.0.0-20180618194314-52158e4697b8 github.com/fortytw2/leaktest v1.2.0 // indirect github.com/go-kit/kit v0.7.0 // indirect @@ -32,11 +32,10 @@ require ( github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 // indirect github.com/minio/sha256-simd v0.0.0-20181005183134-51976451ce19 // indirect - github.com/mitchellh/go-homedir v1.0.0 github.com/mitchellh/mapstructure v1.0.0 // indirect github.com/mr-tron/base58 v1.1.0 // indirect github.com/multiformats/go-multibase v0.3.0 // indirect - github.com/multiformats/go-multihash v1.0.8 + github.com/multiformats/go-multihash v1.0.8 // indirect github.com/onsi/gomega v1.4.2 // indirect github.com/pelletier/go-toml v1.2.0 // indirect github.com/pkg/errors v0.8.0 @@ -59,7 +58,7 @@ require ( github.com/tendermint/btcd v0.0.0-20180816174608-e5840949ff4f github.com/tendermint/go-amino v0.14.1 github.com/tendermint/iavl v0.12.0 // indirect - github.com/tendermint/tendermint v0.29.0 + github.com/tendermint/tendermint v0.29.1 github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc // indirect github.com/zondax/ledger-cosmos-go v0.1.0 // indirect golang.org/x/crypto v0.0.0-20181015023909-0c41d7ab0a0e // indirect diff --git a/go.sum b/go.sum index d1d627df..93dc8b5b 100644 --- a/go.sum +++ b/go.sum @@ -16,8 +16,8 @@ github.com/btcsuite/btcd v0.0.0-20180903232927-cff30e1d23fc/go.mod h1:Dmm/EzmjnC github.com/btcsuite/btcutil v0.0.0-20180706230648-ab6388e0c60a h1:RQMUrEILyYJEoAT34XS/kLu40vC0+po/UfxrBBA4qZE= github.com/btcsuite/btcutil v0.0.0-20180706230648-ab6388e0c60a/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cosmos/cosmos-sdk v0.28.2-0.20190123020839-b2ae4ed57319 h1:T2U3Z5ftqqECTF6y8lHiWS5ld4ZXon2/tYSnc+flWUo= -github.com/cosmos/cosmos-sdk v0.28.2-0.20190123020839-b2ae4ed57319/go.mod h1:JrX/JpJunJQXBI5PEX2zELHMFzQr/159jDjIhesOh2c= +github.com/cosmos/cosmos-sdk v0.30.0 h1:DUpcAqHalX2IEvum2wjPIos6sRcOYVd1wNSfiQ+wdfo= +github.com/cosmos/cosmos-sdk v0.30.0/go.mod h1:JrX/JpJunJQXBI5PEX2zELHMFzQr/159jDjIhesOh2c= github.com/cosmos/go-bip39 v0.0.0-20180618194314-52158e4697b8 h1:Iwin12wRQtyZhH6FV3ykFcdGNlYEzoeR0jN8Vn+JWsI= github.com/cosmos/go-bip39 v0.0.0-20180618194314-52158e4697b8/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -75,8 +75,6 @@ github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.0.0-20181005183134-51976451ce19 h1:d9VfRe71OW+ZtutCBgQ54kXBwFy5Tz5hR0OBIE6qlFo= github.com/minio/sha256-simd v0.0.0-20181005183134-51976451ce19/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/mitchellh/go-homedir v1.0.0 h1:vKb8ShqSby24Yrqr/yDYkuFz8d0WUjys40rvnGC8aR0= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.0.0 h1:vVpGvMXJPqSDh2VYHF7gsfQj8Ncx+Xw5Y1KHeTRY+7I= github.com/mitchellh/mapstructure v1.0.0/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= @@ -133,8 +131,8 @@ github.com/tendermint/go-amino v0.14.1 h1:o2WudxNfdLNBwMyl2dqOJxiro5rfrEaU0Ugs6o github.com/tendermint/go-amino v0.14.1/go.mod h1:i/UKE5Uocn+argJJBb12qTZsCDBcAYMbR92AaJVmKso= github.com/tendermint/iavl v0.12.0 h1:xcaFAr+ycqCj7WN1RzL2EfcBioRDOHcU1oWcg83K028= github.com/tendermint/iavl v0.12.0/go.mod h1:EoKMMv++tDOL5qKKVnoIqtVPshRrEPeJ0WsgDOLAauM= -github.com/tendermint/tendermint v0.29.0 h1:zaJwtaAQVUC4QxqImtpPlCpMGroVvPU0g75ZTlvmFg8= -github.com/tendermint/tendermint v0.29.0/go.mod h1:ymcPyWblXCplCPQjbOYbrF1fWnpslATMVqiGgWbZrlc= +github.com/tendermint/tendermint v0.29.1 h1:9QwXNxtxgfekONjEBvnZp2g3mQH/fS5QiUyEXo7QOGs= +github.com/tendermint/tendermint v0.29.1/go.mod h1:ymcPyWblXCplCPQjbOYbrF1fWnpslATMVqiGgWbZrlc= github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc h1:BCPnHtcboadS0DvysUuJXZ4lWVv5Bh5i7+tbIyi+ck4= github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc/go.mod h1:r45hJU7yEoA81k6MWNhpMj/kms0n14dkzkxYHoB96UM= github.com/zondax/ledger-cosmos-go v0.1.0 h1:Qf4OrBXabhUrDqTtq47QSBLqWV4QYQDQwJQ2qZCbzT8= From e63a8a66069d79e83d6424854d5c92fafa07182f Mon Sep 17 00:00:00 2001 From: Hleb Albau Date: Fri, 25 Jan 2019 18:24:21 +0700 Subject: [PATCH 09/38] #156 Add Missing euler tokens cmd --- daemon/cmd/collect.go | 2 +- daemon/cmd/genesis.go | 123 ++++++++++++++++++++++++++++++++++++++++++ daemon/cmd/utils.go | 39 +++++++++++++- daemon/main.go | 3 +- types/acc.go | 9 ++++ 5 files changed, 172 insertions(+), 4 deletions(-) create mode 100644 daemon/cmd/genesis.go diff --git a/daemon/cmd/collect.go b/daemon/cmd/collect.go index f856086d..47d3a3c1 100644 --- a/daemon/cmd/collect.go +++ b/daemon/cmd/collect.go @@ -100,7 +100,7 @@ func genAppStateFromConfig( ) // process genesis transactions, else create default genesis.json - appGenTxs, persistentPeers, err = CollectStdTxs(cdc, config.Moniker, initCfg.GenTxsDir, genDoc) + appGenTxs, persistentPeers, err = collectStdTxs(cdc, config.Moniker, initCfg.GenTxsDir, genDoc) if err != nil { return } diff --git a/daemon/cmd/genesis.go b/daemon/cmd/genesis.go new file mode 100644 index 00000000..51d09126 --- /dev/null +++ b/daemon/cmd/genesis.go @@ -0,0 +1,123 @@ +package cmd + +import ( + "fmt" + "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/server" + cbd "github.com/cybercongress/cyberd/types" + "github.com/spf13/cobra" + "strconv" +) + +func GenesisCmds(ctx *server.Context, cdc *codec.Codec) *cobra.Command { + + rootCmd := &cobra.Command{ + Use: "genesis", + Short: "genesis commands", + } + rootCmd.AddCommand(AddEulerTokensCmd(ctx, cdc)) + rootCmd.AddCommand(AddMissingEulerTokensCmd(ctx, cdc)) + return rootCmd +} + +// 0.1.0 Distribution +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Proof Of Code & Proof Of Value Euler addresses. +// Addresses taken from 0x136c1121f21c29415d8cd71f8bb140c7ff187033 Ethereum contract at a 'jan 3, 2019' +// 1 'CBD' token equaling to 1% of genesis supply. +// First address, with 70% allocation is 'Proof Of Use' one. +// The rest is pocv, or 'Proof Of Code' & 'Proof Of Value' + +const pouFileCoefficient float64 = 0.7 // means 70% + +const tokensToBurnPercentage float64 = 11.8000 // 0x3b6ce0d5fd5f6de16fb6b687207efe86702a6e76 +const proofOfUsePercentage float64 = 70.0000 // 0xccf0e5a05bf5c0fb7c2d91737b176b4a2d2fd7f0 + +var pocvAccs = map[string]float64{ + "cbd1f9yjqmxh6prsmgpcaqj8lmjnxg644n50qjl4vw": 8.288000001, // 0x9f4062f6153ff4dbf93f6a6f686ed3c906bf0684 + "cbd1hlu0kqwvxmhjjsezr00jdrvs2k537mqhrv02ja": 3.045611111, // 0x7c4401ae98f12ef6de39ae24cf9fc51f80eba16b + "cbd1myeyqp96pz3tayjdctflrxpwf45dq3xyj56yk0": 2.1153, // 0xf2cb7985a5c3fdd8d7742a73d5dc001bbd32caf8 + "cbd1gannk6qt3s5mnm5smx6xjqqvecu08666hpazlz": 1.5328, // 0x002f9caf40a444f20813da783d152bdfaf42852f + "cbd1sjedcfmqupxcnxudq9w0rxrf87r3c6tvep5fnj": 1.428, // 0x00b8fe1a1a2b899418702e32a96e276ff56a4d05 + "cbd1ch4dpd8jxkl7w4wnzdx02utmw4j0xatfks6ulv": 1, // 0x8b788b444ca3203bba0fdcae1c482110494e81f1 + "cbd1s3748ghvcwvrws3kxsdc8xnan3qhv77740gnnl": 0.568211111, // 0x00cff8cf7bff03a9a2a81c01920ffd8cfa7ae9d0 + "cbd14d92r4svhl4qa3g6q48tjekarw2kt67njlaeht": 0.083811111, // 0x63e65bc441334b27d2178f81f2d701e4e58c158a + "cbd1up7dk03v4d898vqgmc2y32y7duuylgx8ra7jjj": 0.043511111, // 0x9d7d6e753f055e40d3767337300e722e934086c1 + "cbd1rqudjcrdwqedffxufmqgsleuguhm7pka6snns3": 0.028, // 0x00725d89a2a2fb3b21fd1035b579cbcde4a0991b + "cbd1hmkqhy8ygl6tnl5g8tc503rwrmmrkjcqtqrsx6": 0.023311111, // 0x00ca47db1be92c1072e973fd8dc4a082f7d70214 + "cbd1gs92s58t6rkallnml8ufdzrz3038dcylal0nlc": 0.023311111, // 0x4585c7eaa2cb96d4b59e868929efabeeb8e65b07 + "cbd1h7u5zvduvc3dqrfq9hejm35ktfxh3ha7fra64a": 0.0132800000000000911111, // 0x002b9c5b537a1b6004ed720f32cc808fd6210f26 + "cbd1rl3xnsrkpjfwejqfy7v4kntu64hzxy8dgafh6j": 0.003111111, // 0x00d3c9033570b8adea9c18780325a45635c55805 + "cbd1xege0g92p6exmzjv58u7vh3s5zkz75v48mlnev": 0.003111111, // 0x5d01f31f6eda95489ca1e3c6357a9627fa2983de +} + +// 0.1.0 Distribution +func AddEulerTokensCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command { + cmd := &cobra.Command{ + Use: "add-euler-tokens ", + RunE: func(cmd *cobra.Command, args []string) error { + //todo refactor this, see #199 + return GenerateEulerGenesisFileCmd(ctx, cdc).Execute() + }, + } + return cmd +} + +// 0.1.1 Distribution fix for 0.1.0 +// Our current distribution is 1% for proof of use, and 0.7% for others. +// In 0.1.1 launch we should: +// - add rest 0.3% to others part. See issue #156. +// - send 11.8000% to dead address +func AddMissingEulerTokensCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command { + + cmd := &cobra.Command{ + Use: "add-missing-euler-tokens", + RunE: func(cmd *cobra.Command, args []string) error { + + doc, state, err := loadGenesisState(ctx, cdc) + if err != nil { + return err + } + + addrWithMissingTokens := make(map[string]int64, len(state.Accounts)) + for pocvAddr, percentage := range pocvAccs { + addrWithMissingTokens[pocvAddr] = percentageToAmt(percentage) - pouPercentageToAmt(percentage) + } + addrWithMissingTokens[cbd.GetBurnAddress().String()] = percentageToAmt(tokensToBurnPercentage) + + fmt.Println("") + fmt.Println("Fixing euler 0.1.0 network genesis distribution") + for accIndex, acc := range state.Accounts { + tokensToAdd, ok := addrWithMissingTokens[acc.Address.String()] + if ok { + acc.Amount += tokensToAdd + fmt.Println(strconv.Itoa(int(tokensToAdd)) + " tokens added to " + acc.Address.String()) + delete(addrWithMissingTokens, acc.Address.String()) + state.Accounts[accIndex] = acc + } + } + + if len(addrWithMissingTokens) != 0 { + fmt.Println("") + return fmt.Errorf("%v does not included in genesis.json file. Reverting", addrWithMissingTokens) + } + fmt.Println("Fixed!") + return saveGenesisState(ctx, cdc, doc, state) + + }, + } + return cmd +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// calculate proof of use(pou) tokens amount. +// pou file contains pou percentage(-> sum of all addresses is 100%) +// So to get overall network percentage multiply it on pouFileCoefficient (0.7) +func pouPercentageToAmt(pouPercentage float64) int64 { + return int64(pouPercentage / 100 * pouFileCoefficient * float64(genesisSupply)) +} + +func percentageToAmt(percentage float64) int64 { + return int64(percentage / 100 * float64(genesisSupply)) +} diff --git a/daemon/cmd/utils.go b/daemon/cmd/utils.go index d71a994f..87aba7f9 100644 --- a/daemon/cmd/utils.go +++ b/daemon/cmd/utils.go @@ -7,6 +7,8 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/staking" "github.com/cybercongress/cyberd/app" + "github.com/spf13/viper" + "github.com/tendermint/tendermint/libs/cli" "io/ioutil" "os" "path/filepath" @@ -94,6 +96,41 @@ func InitializeNodeValidatorFiles( return nodeID, valPubKey, nil } +func loadGenesisState( + ctx *server.Context, cdc *codec.Codec, +) (genDoc tmtypes.GenesisDoc, state app.GenesisState, err error) { + + config := ctx.Config + config.SetRoot(viper.GetString(cli.HomeFlag)) + + genFile := config.GenesisFile() + if !common.FileExists(genFile) { + err = fmt.Errorf("%s does not exist, run `cyberd init` first", genFile) + return + } + genDoc, err = loadGenesisDoc(cdc, genFile) + if err != nil { + return + } + + err = cdc.UnmarshalJSON(genDoc.AppState, &state) + return +} + +func saveGenesisState(ctx *server.Context, cdc *codec.Codec, oldDoc tmtypes.GenesisDoc, state app.GenesisState) error { + + config := ctx.Config + config.SetRoot(viper.GetString(cli.HomeFlag)) + genFile := config.GenesisFile() + + appStateJSON, err := cdc.MarshalJSON(state) + if err != nil { + return err + } + + return ExportGenesisFile(genFile, oldDoc.ChainID, nil, appStateJSON) +} + func loadGenesisDoc(cdc *amino.Codec, genFile string) (genDoc tmtypes.GenesisDoc, err error) { genContents, err := ioutil.ReadFile(genFile) if err != nil { @@ -120,7 +157,7 @@ func initializeEmptyGenesis( // CollectStdTxs processes and validates application's genesis StdTxs and returns // the list of appGenTxs, and persistent peers required to generate genesis.json. -func CollectStdTxs(cdc *codec.Codec, moniker string, genTxsDir string, genDoc tmtypes.GenesisDoc) ( +func collectStdTxs(cdc *codec.Codec, moniker string, genTxsDir string, genDoc tmtypes.GenesisDoc) ( appGenTxs []auth.StdTx, persistentPeers string, err error) { var fos []os.FileInfo diff --git a/daemon/main.go b/daemon/main.go index 88af2ece..c5115211 100644 --- a/daemon/main.go +++ b/daemon/main.go @@ -40,13 +40,12 @@ func main() { } rootCmd.AddCommand(initCyberd.InitCmd(ctx, cdc)) - rootCmd.AddCommand(initCyberd.GenerateAccountCmd()) rootCmd.AddCommand(initCyberd.GenerateAccountsCmd(ctx, cdc)) rootCmd.AddCommand(initCyberd.CollectGenTxsCmd(ctx, cdc)) rootCmd.AddCommand(initCyberd.TestnetFilesCmd(ctx, cdc)) rootCmd.AddCommand(initCyberd.GenTxCmd(ctx, cdc)) rootCmd.AddCommand(initCyberd.AddGenesisAccountCmd(ctx, cdc)) - rootCmd.AddCommand(initCyberd.GenerateEulerGenesisFileCmd(ctx, cdc)) + rootCmd.AddCommand(initCyberd.GenesisCmds(ctx, cdc)) server.AddCommands(ctx, cdc, rootCmd, newApp, exportAppStateAndTMValidators) for _, c := range rootCmd.Commands() { diff --git a/types/acc.go b/types/acc.go index f166f290..1eea5b90 100644 --- a/types/acc.go +++ b/types/acc.go @@ -1,9 +1,18 @@ package types import "github.com/cosmos/cosmos-sdk/x/auth" +import sdk "github.com/cosmos/cosmos-sdk/types" type AccNumber uint64 func NewCyberdAccount() auth.Account { return &auth.BaseAccount{} } + +// cbd1qqqqqqqqqqqqqqqqqqqqqqqqqqqqph4dvtfakz 0.1.0 +// cyber1qqqqqqqqqqqqqqqqqqqqqqqqqqqqph4djv52fh 0.1.1 +func GetBurnAddress() (addr sdk.AccAddress) { + hex := "000000000000000000000000000000000000dead" + addr, _ = sdk.AccAddressFromHex(hex) + return +} From b0d9c77b41d532a36b3b732df43e34971947eaf5 Mon Sep 17 00:00:00 2001 From: Hleb Albau Date: Mon, 28 Jan 2019 12:47:41 +0700 Subject: [PATCH 10/38] #157 Change token name from CBD to CYB in the testnetwork --- app/app.go | 2 +- app/genesis.go | 10 ++++---- app/prefix.go | 12 ++++----- daemon/cmd/genesis.go | 59 ++++++++++++++++++++++++++++++++----------- daemon/cmd/init.go | 5 ++-- daemon/cmd/testnet.go | 2 +- daemon/main.go | 37 +++++++++++++++++---------- types/coin/coins.go | 2 +- x/bank/keeper.go | 2 +- 9 files changed, 86 insertions(+), 45 deletions(-) diff --git a/app/app.go b/app/app.go index b0c5581c..b3ec6bc8 100644 --- a/app/app.go +++ b/app/app.go @@ -240,7 +240,7 @@ func (app *CyberdApp) initChainer(ctx sdk.Context, req abci.RequestInitChain) ab acc := gacc.ToAccount() acc.AccountNumber = app.accountKeeper.GetNextAccountNumber(ctx) app.accountKeeper.SetAccount(ctx, acc) - app.stakeIndex.UpdateStake(types.AccNumber(acc.AccountNumber), acc.Coins.AmountOf(coin.CBD).Int64()) + app.stakeIndex.UpdateStake(types.AccNumber(acc.AccountNumber), acc.Coins.AmountOf(coin.CYB).Int64()) } // initialize distribution (must happen before staking) diff --git a/app/genesis.go b/app/genesis.go index 1973ae16..3503edde 100644 --- a/app/genesis.go +++ b/app/genesis.go @@ -61,14 +61,14 @@ type GenesisAccount struct { func NewGenesisAccount(acc *auth.BaseAccount) GenesisAccount { return GenesisAccount{ Address: acc.Address, - Amount: acc.Coins.AmountOf(coin.CBD).Int64(), + Amount: acc.Coins.AmountOf(coin.CYB).Int64(), } } func NewGenesisAccountI(acc auth.Account) GenesisAccount { return GenesisAccount{ Address: acc.GetAddress(), - Amount: acc.GetCoins().AmountOf(coin.CBD).Int64(), + Amount: acc.GetCoins().AmountOf(coin.CYB).Int64(), } } @@ -76,7 +76,7 @@ func NewGenesisAccountI(acc auth.Account) GenesisAccount { func (ga *GenesisAccount) ToAccount() (acc *auth.BaseAccount) { return &auth.BaseAccount{ Address: ga.Address, - Coins: sdk.Coins{sdk.NewInt64Coin(coin.CBD, ga.Amount)}, + Coins: sdk.Coins{sdk.NewInt64Coin(coin.CYB, ga.Amount)}, } } @@ -98,7 +98,7 @@ func NewDefaultGenesisState() GenesisState { }, MintData: mint.GenesisState{ Params: mint.Params{ - MintDenom: coin.CBD, + MintDenom: coin.CYB, InflationRateChange: sdk.NewDecWithPrec(0, 2), InflationMax: sdk.NewDecWithPrec(200, 2), InflationMin: sdk.NewDecWithPrec(200, 2), @@ -111,7 +111,7 @@ func NewDefaultGenesisState() GenesisState { Params: types.Params{ UnbondingTime: defaultUnbondingTime, MaxValidators: 146, - BondDenom: coin.CBD, + BondDenom: coin.CYB, }, }, SlashingData: slashing.DefaultGenesisState(), diff --git a/app/prefix.go b/app/prefix.go index d2959775..4950790b 100644 --- a/app/prefix.go +++ b/app/prefix.go @@ -5,12 +5,12 @@ import ( ) var ( - AccountAddressPrefix = "cbd" - AccountPubKeyPrefix = "cbdpub" - ValidatorAddressPrefix = "cbdvaloper" - ValidatorPubKeyPrefix = "cbdvaloperpub" - ConsNodeAddressPrefix = "cbdvalcons" - ConsNodePubKeyPrefix = "cbdvalconspub" + AccountAddressPrefix = "cyber" + AccountPubKeyPrefix = "cyberpub" + ValidatorAddressPrefix = "cybervaloper" + ValidatorPubKeyPrefix = "cybervaloperpub" + ConsNodeAddressPrefix = "cybervalcons" + ConsNodePubKeyPrefix = "cybervalconspub" ) func SetPrefix() { diff --git a/daemon/cmd/genesis.go b/daemon/cmd/genesis.go index 51d09126..38bb5f18 100644 --- a/daemon/cmd/genesis.go +++ b/daemon/cmd/genesis.go @@ -4,6 +4,8 @@ import ( "fmt" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/server" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cybercongress/cyberd/app" cbd "github.com/cybercongress/cyberd/types" "github.com/spf13/cobra" "strconv" @@ -17,6 +19,7 @@ func GenesisCmds(ctx *server.Context, cdc *codec.Codec) *cobra.Command { } rootCmd.AddCommand(AddEulerTokensCmd(ctx, cdc)) rootCmd.AddCommand(AddMissingEulerTokensCmd(ctx, cdc)) + rootCmd.AddCommand(ChangeGenesisAccsPrefixCmd(ctx, cdc)) return rootCmd } @@ -34,21 +37,21 @@ const tokensToBurnPercentage float64 = 11.8000 // 0x3b6ce0d5fd5f6de16fb6b687207e const proofOfUsePercentage float64 = 70.0000 // 0xccf0e5a05bf5c0fb7c2d91737b176b4a2d2fd7f0 var pocvAccs = map[string]float64{ - "cbd1f9yjqmxh6prsmgpcaqj8lmjnxg644n50qjl4vw": 8.288000001, // 0x9f4062f6153ff4dbf93f6a6f686ed3c906bf0684 - "cbd1hlu0kqwvxmhjjsezr00jdrvs2k537mqhrv02ja": 3.045611111, // 0x7c4401ae98f12ef6de39ae24cf9fc51f80eba16b - "cbd1myeyqp96pz3tayjdctflrxpwf45dq3xyj56yk0": 2.1153, // 0xf2cb7985a5c3fdd8d7742a73d5dc001bbd32caf8 - "cbd1gannk6qt3s5mnm5smx6xjqqvecu08666hpazlz": 1.5328, // 0x002f9caf40a444f20813da783d152bdfaf42852f - "cbd1sjedcfmqupxcnxudq9w0rxrf87r3c6tvep5fnj": 1.428, // 0x00b8fe1a1a2b899418702e32a96e276ff56a4d05 - "cbd1ch4dpd8jxkl7w4wnzdx02utmw4j0xatfks6ulv": 1, // 0x8b788b444ca3203bba0fdcae1c482110494e81f1 - "cbd1s3748ghvcwvrws3kxsdc8xnan3qhv77740gnnl": 0.568211111, // 0x00cff8cf7bff03a9a2a81c01920ffd8cfa7ae9d0 - "cbd14d92r4svhl4qa3g6q48tjekarw2kt67njlaeht": 0.083811111, // 0x63e65bc441334b27d2178f81f2d701e4e58c158a - "cbd1up7dk03v4d898vqgmc2y32y7duuylgx8ra7jjj": 0.043511111, // 0x9d7d6e753f055e40d3767337300e722e934086c1 - "cbd1rqudjcrdwqedffxufmqgsleuguhm7pka6snns3": 0.028, // 0x00725d89a2a2fb3b21fd1035b579cbcde4a0991b - "cbd1hmkqhy8ygl6tnl5g8tc503rwrmmrkjcqtqrsx6": 0.023311111, // 0x00ca47db1be92c1072e973fd8dc4a082f7d70214 - "cbd1gs92s58t6rkallnml8ufdzrz3038dcylal0nlc": 0.023311111, // 0x4585c7eaa2cb96d4b59e868929efabeeb8e65b07 - "cbd1h7u5zvduvc3dqrfq9hejm35ktfxh3ha7fra64a": 0.0132800000000000911111, // 0x002b9c5b537a1b6004ed720f32cc808fd6210f26 - "cbd1rl3xnsrkpjfwejqfy7v4kntu64hzxy8dgafh6j": 0.003111111, // 0x00d3c9033570b8adea9c18780325a45635c55805 - "cbd1xege0g92p6exmzjv58u7vh3s5zkz75v48mlnev": 0.003111111, // 0x5d01f31f6eda95489ca1e3c6357a9627fa2983de + "cyber1f9yjqmxh6prsmgpcaqj8lmjnxg644n5074zznm": 8.288000001, // 0x9f4062f6153ff4dbf93f6a6f686ed3c906bf0684 + "cyber1hlu0kqwvxmhjjsezr00jdrvs2k537mqhatjadg": 3.045611111, // 0x7c4401ae98f12ef6de39ae24cf9fc51f80eba16b + "cyber1myeyqp96pz3tayjdctflrxpwf45dq3xyvn8nf6": 2.1153, // 0xf2cb7985a5c3fdd8d7742a73d5dc001bbd32caf8 + "cyber1gannk6qt3s5mnm5smx6xjqqvecu08666fxq4qh": 1.5328, // 0x002f9caf40a444f20813da783d152bdfaf42852f + "cyber1sjedcfmqupxcnxudq9w0rxrf87r3c6tv8xf7v8": 1.428, // 0x00b8fe1a1a2b899418702e32a96e276ff56a4d05 + "cyber1ch4dpd8jxkl7w4wnzdx02utmw4j0xatfgh8tqe": 1, // 0x8b788b444ca3203bba0fdcae1c482110494e81f1 + "cyber1s3748ghvcwvrws3kxsdc8xnan3qhv777tg4yv2": 0.568211111, // 0x00cff8cf7bff03a9a2a81c01920ffd8cfa7ae9d0 + "cyber14d92r4svhl4qa3g6q48tjekarw2kt67nvcqwg7": 0.083811111, // 0x63e65bc441334b27d2178f81f2d701e4e58c158a + "cyber1up7dk03v4d898vqgmc2y32y7duuylgx8a6r9d8": 0.043511111, // 0x9d7d6e753f055e40d3767337300e722e934086c1 + "cyber1rqudjcrdwqedffxufmqgsleuguhm7pkayhwy0y": 0.028, // 0x00725d89a2a2fb3b21fd1035b579cbcde4a0991b + "cyber1hmkqhy8ygl6tnl5g8tc503rwrmmrkjcq4878e0": 0.023311111, // 0x00ca47db1be92c1072e973fd8dc4a082f7d70214 + "cyber1gs92s58t6rkallnml8ufdzrz3038dcylrcjyqd": 0.023311111, // 0x4585c7eaa2cb96d4b59e868929efabeeb8e65b07 + "cyber1h7u5zvduvc3dqrfq9hejm35ktfxh3ha7hyqd2g": 0.0132800000000000911111, // 0x002b9c5b537a1b6004ed720f32cc808fd6210f26 + "cyber1rl3xnsrkpjfwejqfy7v4kntu64hzxy8dk65q98": 0.003111111, // 0x00d3c9033570b8adea9c18780325a45635c55805 + "cyber1xege0g92p6exmzjv58u7vh3s5zkz75v4euzyxe": 0.003111111, // 0x5d01f31f6eda95489ca1e3c6357a9627fa2983de } // 0.1.0 Distribution @@ -109,6 +112,32 @@ func AddMissingEulerTokensCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Comm return cmd } +func ChangeGenesisAccsPrefixCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command { + + cmd := &cobra.Command{ + Use: "change-genesis-accs-prefix", + RunE: func(cmd *cobra.Command, args []string) error { + + // set old prefix for parsing file + sdk.GetConfig().SetBech32PrefixForAccount("cbd", "cbdpub") + sdk.GetConfig().SetBech32PrefixForValidator("cbdvaloper", "cbdvaloperpub") + sdk.GetConfig().SetBech32PrefixForConsensusNode("cbdvalcons", "cbdvalconspub") + doc, state, err := loadGenesisState(ctx, cdc) + if err != nil { + return err + } + + fmt.Println("") + fmt.Println("Changing accs prefix from 'cbd' to 'cyber' (0.1.0 -> 0.1.1 change)") + + // set new prefix to persis file + app.SetPrefix() + return saveGenesisState(ctx, cdc, doc, state) + }, + } + return cmd +} + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // calculate proof of use(pou) tokens amount. diff --git a/daemon/cmd/init.go b/daemon/cmd/init.go index ca136b0a..48175bc9 100644 --- a/daemon/cmd/init.go +++ b/daemon/cmd/init.go @@ -38,8 +38,10 @@ func InitCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command { Long: `Initialize validators's and node's configuration files.`, Args: cobra.NoArgs, RunE: func(_ *cobra.Command, _ []string) error { + config := ctx.Config config.SetRoot(viper.GetString(cli.HomeFlag)) + chainID := viper.GetString(client.FlagChainID) if chainID == "" { chainID = fmt.Sprintf("test-chain-%v", common.RandStr(6)) @@ -53,8 +55,7 @@ func InitCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command { var appState json.RawMessage genFile := config.GenesisFile() - if appState, err = initializeEmptyGenesis(cdc, genFile, chainID, - viper.GetBool(flagOverwrite)); err != nil { + if appState, err = initializeEmptyGenesis(cdc, genFile, chainID, viper.GetBool(flagOverwrite)); err != nil { return err } if err = ExportGenesisFile(genFile, chainID, nil, appState); err != nil { diff --git a/daemon/cmd/testnet.go b/daemon/cmd/testnet.go index 4331edd5..0f2323b5 100644 --- a/daemon/cmd/testnet.go +++ b/daemon/cmd/testnet.go @@ -185,7 +185,7 @@ func initTestnet(config *tmconfig.Config, cdc *codec.Codec) error { msg := staking.NewMsgCreateValidator( sdk.ValAddress(addr), valPubKeys[i], - sdk.NewInt64Coin(coin.CBD, 10000000000000000), + sdk.NewInt64Coin(coin.CYB, 10000000000000000), staking.NewDescription(nodeDirName, "", "", ""), staking.NewCommissionMsg(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec()), ) diff --git a/daemon/main.go b/daemon/main.go index c5115211..32113e81 100644 --- a/daemon/main.go +++ b/daemon/main.go @@ -3,10 +3,11 @@ package main import ( "encoding/json" "github.com/cosmos/cosmos-sdk/baseapp" + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/server" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cybercongress/cyberd/app" - initCyberd "github.com/cybercongress/cyberd/daemon/cmd" + "github.com/cybercongress/cyberd/daemon/cmd" "github.com/cybercongress/cyberd/daemon/rpc" "github.com/cybercongress/cyberd/x/rank" "github.com/spf13/cobra" @@ -24,13 +25,16 @@ import ( const ( flagGpuEnabled = "compute-rank-on-gpu" flagSearchRpcQueryEnabled = "allow-search-rpc-query" + flagNotToSealAccPrefix = "not-to-seal-acc-prefix" ) func main() { + rootDir := os.ExpandEnv("$HOME/.cyberd") + cdc := app.MakeCodec() - app.SetPrefix() ctx := server.NewDefaultContext() + ctx.Config.RootDir = rootDir cobra.EnableCommandSorting = false rootCmd := &cobra.Command{ @@ -39,13 +43,24 @@ func main() { PersistentPreRunE: server.PersistentPreRunEFn(ctx), } - rootCmd.AddCommand(initCyberd.InitCmd(ctx, cdc)) - rootCmd.AddCommand(initCyberd.GenerateAccountsCmd(ctx, cdc)) - rootCmd.AddCommand(initCyberd.CollectGenTxsCmd(ctx, cdc)) - rootCmd.AddCommand(initCyberd.TestnetFilesCmd(ctx, cdc)) - rootCmd.AddCommand(initCyberd.GenTxCmd(ctx, cdc)) - rootCmd.AddCommand(initCyberd.AddGenesisAccountCmd(ctx, cdc)) - rootCmd.AddCommand(initCyberd.GenesisCmds(ctx, cdc)) + rootCmd.PersistentPreRunE = func(_ *cobra.Command, args []string) error { + for _, arg := range args { + if arg == flagNotToSealAccPrefix { + return nil + } + } + app.SetPrefix() + return nil + } + + rootCmd.AddCommand(cmd.InitCmd(ctx, cdc)) + rootCmd.AddCommand(cmd.GenerateAccountsCmd(ctx, cdc)) + rootCmd.AddCommand(cmd.CollectGenTxsCmd(ctx, cdc)) + rootCmd.AddCommand(cmd.TestnetFilesCmd(ctx, cdc)) + rootCmd.AddCommand(cmd.GenTxCmd(ctx, cdc)) + rootCmd.AddCommand(cmd.AddGenesisAccountCmd(ctx, cdc)) + rootCmd.AddCommand(cmd.GenesisCmds(ctx, cdc)) + rootCmd.AddCommand(client.NewCompletionCmd(rootCmd, true)) server.AddCommands(ctx, cdc, rootCmd, newApp, exportAppStateAndTMValidators) for _, c := range rootCmd.Commands() { @@ -55,13 +70,9 @@ func main() { } } - // prepare and add flags - rootDir := os.ExpandEnv("$HOME/.cyberd") executor := cli.PrepareBaseCmd(rootCmd, "CBD", rootDir) - err := executor.Execute() if err != nil { - // Note: Handle with #870 panic(err) } } diff --git a/types/coin/coins.go b/types/coin/coins.go index 736e1ac4..426d20bd 100644 --- a/types/coin/coins.go +++ b/types/coin/coins.go @@ -1,5 +1,5 @@ package coin const ( - CBD = "cbd" + CYB = "сyb" ) diff --git a/x/bank/keeper.go b/x/bank/keeper.go index 1f5e2b9b..52004f14 100644 --- a/x/bank/keeper.go +++ b/x/bank/keeper.go @@ -95,7 +95,7 @@ func (k Keeper) GetAccountUnboundedStake(ctx sdk.Context, addr sdk.AccAddress) i if acc == nil { return 0 } - return acc.GetCoins().AmountOf(coin.CBD).Int64() + return acc.GetCoins().AmountOf(coin.CYB).Int64() } func (k Keeper) GetAccountBoundedStake(ctx sdk.Context, addr sdk.AccAddress) int64 { From a723242b79d105abf4d11e0e36ea98ef65de5fb5 Mon Sep 17 00:00:00 2001 From: Artur Albov Date: Sat, 26 Jan 2019 21:36:05 +0700 Subject: [PATCH 11/38] #184 Links Exporter. Base implementation --- app/app.go | 2 + app/export.go | 5 ++ x/link/genesis.go | 95 +++++++++++++++++++++++++++++++++++++ x/link/handler.go | 6 +-- x/link/keeper/cid.go | 31 +++++++++--- x/link/keeper/link.go | 40 ++++++---------- x/link/keeper/link_index.go | 7 +++ x/link/types/link.go | 21 +++++++- 8 files changed, 168 insertions(+), 39 deletions(-) create mode 100644 x/link/genesis.go diff --git a/app/app.go b/app/app.go index b3ec6bc8..dc10ee05 100644 --- a/app/app.go +++ b/app/app.go @@ -297,6 +297,8 @@ func (app *CyberdApp) initChainer(ctx sdk.Context, req abci.RequestInitChain) ab } } + link.InitGenesis(ctx, app.mainKeeper, app.cidNumKeeper, app.linkIndexedKeeper, app.Logger) + return abci.ResponseInitChain{ Validators: validators, } diff --git a/app/export.go b/app/export.go index e74deece..981a8351 100644 --- a/app/export.go +++ b/app/export.go @@ -9,6 +9,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/mint" "github.com/cosmos/cosmos-sdk/x/slashing" "github.com/cosmos/cosmos-sdk/x/staking" + "github.com/cybercongress/cyberd/x/link" abci "github.com/tendermint/tendermint/abci/types" tmtypes "github.com/tendermint/tendermint/types" ) @@ -41,5 +42,9 @@ func (app *CyberdApp) ExportAppStateAndValidators() (appState json.RawMessage, v return nil, nil, err } validators = staking.WriteValidators(ctx, app.stakingKeeper) + err = link.ExportLinks(ctx, app.cidNumKeeper, app.linkIndexedKeeper) + if err != nil { + return nil, nil, err + } return appState, validators, nil } diff --git a/x/link/genesis.go b/x/link/genesis.go new file mode 100644 index 00000000..569c9ad0 --- /dev/null +++ b/x/link/genesis.go @@ -0,0 +1,95 @@ +package link + +import ( + "bytes" + "encoding/binary" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cybercongress/cyberd/store" + "github.com/cybercongress/cyberd/x/link/keeper" + . "github.com/cybercongress/cyberd/x/link/types" + "github.com/spf13/viper" + "github.com/tendermint/tendermint/libs/cli" + "github.com/tendermint/tendermint/libs/log" + "io/ioutil" + "os" + "path/filepath" +) + +const LinksFileName = "links" + +func GetLinksFilePath() string { + rootDir := viper.GetString(cli.HomeFlag) + return filepath.Join(rootDir, LinksFileName) +} + +func InitGenesis( + ctx sdk.Context, mainKeeper store.MainKeeper, cidNumKeeper keeper.CidNumberKeeper, + linkIndexedKeeper *keeper.LinkIndexedKeeper, logger log.Logger, +) { + // initialize links + + _, err := os.Stat(GetLinksFilePath()) + if err != nil { + if os.IsNotExist(err) { + logger.Info("File with links not found. Empty links set will be used") + } + } else { + data, err := ioutil.ReadFile(GetLinksFilePath()) + if err != nil { + panic(err) + } + + // import cids + cidCount := binary.LittleEndian.Uint64(data[0:8]) + + cursor := uint64(8) + // read all CIDs with their numbers + for ; cursor < 8+(cidCount*54); cursor = cursor + 54 { + cid := Cid(data[cursor : cursor+46]) + cidNumber := CidNumber(binary.LittleEndian.Uint64(data[cursor+46 : cursor+54])) + cidNumKeeper.PutCid(ctx, cid, cidNumber) + } + lastCidIndex := cidCount - 1 + lastCidIndexBytes := make([]byte, 8) + binary.LittleEndian.PutUint64(lastCidIndexBytes, lastCidIndex) + mainKeeper.SetLastCidIndex(ctx, lastCidIndexBytes) + + for ; cursor < uint64(len(data)); cursor = cursor + 24 { + linkIndexedKeeper.PutLink(ctx, UnmarshalBinaryLink(data[cursor:cursor+24])) + } + } +} + +func ExportLinks( + ctx sdk.Context, cidNumKeeper keeper.CidNumberKeeper, linkIndexedKeeper *keeper.LinkIndexedKeeper, +) (err error) { + + linksFile, err := os.Create(GetLinksFilePath()) + if err != nil { + return + } + + buf := new(bytes.Buffer) + dataAsBytes := make([]byte, 8) //common bytes array to convert uints + + // export CIDs in binary format: .... + cidsCount := cidNumKeeper.GetCidsCount(ctx) + binary.LittleEndian.PutUint64(dataAsBytes, cidsCount) + buf.Write(dataAsBytes) + + cidNumKeeper.Iterate(ctx, func(cid Cid, number CidNumber) { + buf.Write([]byte(cid)) + binary.LittleEndian.PutUint64(dataAsBytes, uint64(number)) + buf.Write(dataAsBytes) + }) + + // export links in binary format: + linkIndexedKeeper.Iterate(ctx, func(link CompactLink) { buf.Write(link.MarshalBinary()) }) + + _, err = linksFile.Write(buf.Bytes()) + if err != nil { + return + } + err = linksFile.Close() + return +} diff --git a/x/link/handler.go b/x/link/handler.go index eb5a1d0a..911fd5aa 100644 --- a/x/link/handler.go +++ b/x/link/handler.go @@ -44,12 +44,8 @@ func NewLinksHandler(cis keeper.CidNumberKeeper, ls *keeper.LinkIndexedKeeper, a fromCidNumber := cis.GetOrPutCidNumber(ctx, link.From) toCidNumber := cis.GetOrPutCidNumber(ctx, link.To) accNumber := cbd.AccNumber(as.GetAccount(ctx, linkMsg.Address).GetAccountNumber()) - compactLink := cbdlink.NewLink(fromCidNumber, toCidNumber, accNumber) - if !ctx.IsCheckTx() { - ls.PutIntoIndex(compactLink) - } - ls.PutLink(ctx, compactLink) + ls.PutLink(ctx, cbdlink.NewLink(fromCidNumber, toCidNumber, accNumber)) } return sdk.Result{Code: cbd.CodeOK, Codespace: cbd.CodespaceCbd} diff --git a/x/link/keeper/cid.go b/x/link/keeper/cid.go index b0eeb418..2c192f6e 100644 --- a/x/link/keeper/cid.go +++ b/x/link/keeper/cid.go @@ -13,6 +13,8 @@ type CidNumberKeeper interface { GetOrPutCidNumber(ctx sdk.Context, cid Cid) CidNumber GetFullCidsNumbers(ctx sdk.Context) map[Cid]CidNumber GetCidsCount(ctx sdk.Context) uint64 + PutCid(ctx sdk.Context, cid Cid, cidNumber CidNumber) + Iterate(ctx sdk.Context, process func(Cid, CidNumber)) } type BaseCidNumberKeeper struct { @@ -48,6 +50,18 @@ func (k BaseCidNumberKeeper) GetCid(ctx sdk.Context, num CidNumber) Cid { return Cid(cidAsBytes) } +// WARNING: use only for state import. Don't forget to set right cid count after +func (k BaseCidNumberKeeper) PutCid(ctx sdk.Context, cid Cid, cidNumber CidNumber) { + cidsIndex := ctx.KVStore(k.key) + cidsReverseIndex := ctx.KVStore(k.reverseKey) + + cidNumberAsBytes := make([]byte, 8) + binary.LittleEndian.PutUint64(cidNumberAsBytes, uint64(cidNumber)) + + cidsIndex.Set([]byte(cid), cidNumberAsBytes) + cidsReverseIndex.Set(cidNumberAsBytes, []byte(cid)) +} + // CIDs index is array of all added CIDs, sorted asc by first link time. // - for given link, CIDs added in order [CID1, CID2] (if they both new to chain) // This method performs lookup of CIDs, returns index value, or create and put in index new value if not exists. @@ -77,18 +91,21 @@ func (k BaseCidNumberKeeper) GetOrPutCidNumber(ctx sdk.Context, cid Cid) CidNumb // returns all added cids func (k BaseCidNumberKeeper) GetFullCidsNumbers(ctx sdk.Context) map[Cid]CidNumber { - - cidsIndex := ctx.KVStore(k.key) - iterator := cidsIndex.Iterator(nil, nil) - index := make(map[Cid]CidNumber) + k.Iterate(ctx, func(cid Cid, number CidNumber) { + index[cid] = number + }) + return index +} + +func (k BaseCidNumberKeeper) Iterate(ctx sdk.Context, process func(Cid, CidNumber)) { + iterator := ctx.KVStore(k.key).Iterator(nil, nil) + defer iterator.Close() for iterator.Valid() { - index[Cid(iterator.Key())] = CidNumber(binary.LittleEndian.Uint64(iterator.Value())) + process(Cid(iterator.Key()), CidNumber(binary.LittleEndian.Uint64(iterator.Value()))) iterator.Next() } - iterator.Close() - return index } func (k BaseCidNumberKeeper) GetCidsCount(ctx sdk.Context) uint64 { diff --git a/x/link/keeper/link.go b/x/link/keeper/link.go index 3dc8ebf4..52d2ec2d 100644 --- a/x/link/keeper/link.go +++ b/x/link/keeper/link.go @@ -1,10 +1,8 @@ package keeper import ( - "encoding/binary" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cybercongress/cyberd/store" - . "github.com/cybercongress/cyberd/types" . "github.com/cybercongress/cyberd/x/link/types" ) @@ -13,6 +11,7 @@ type LinkKeeper interface { IsLinkExist(ctx sdk.Context, link CompactLink) bool GetAllLinks(ctx sdk.Context) (Links, Links, error) GetLinksCount(ctx sdk.Context) uint64 + Iterate(ctx sdk.Context, process func(link CompactLink)) } type BaseLinkKeeper struct { @@ -29,14 +28,14 @@ func NewBaseLinkKeeper(ms store.MainKeeper, key *sdk.KVStoreKey) LinkKeeper { func (lk BaseLinkKeeper) PutLink(ctx sdk.Context, link CompactLink) { store := ctx.KVStore(lk.key) - linkAsBytes := marshalLink(link) + linkAsBytes := link.MarshalBinary() store.Set(linkAsBytes, []byte{}) lk.ms.IncrementLinksCount(ctx) } func (lk BaseLinkKeeper) IsLinkExist(ctx sdk.Context, link CompactLink) bool { store := ctx.KVStore(lk.key) - linkAsBytes := marshalLink(link) + linkAsBytes := link.MarshalBinary() return store.Get(linkAsBytes) != nil } @@ -45,17 +44,11 @@ func (lk BaseLinkKeeper) GetAllLinks(ctx sdk.Context) (Links, Links, error) { inLinks := make(map[CidNumber]CidLinks) outLinks := make(map[CidNumber]CidLinks) - store := ctx.KVStore(lk.key) - iterator := store.Iterator(nil, nil) - defer iterator.Close() - - for iterator.Valid() { - linkAsBytes := iterator.Key() - link := unmarshalLink(linkAsBytes) + lk.Iterate(ctx, func(link CompactLink) { Links(outLinks).Put(link.From(), link.To(), link.Acc()) Links(inLinks).Put(link.To(), link.From(), link.Acc()) - iterator.Next() - } + }) + return inLinks, outLinks, nil } @@ -63,18 +56,13 @@ func (lk BaseLinkKeeper) GetLinksCount(ctx sdk.Context) uint64 { return lk.ms.GetLinksCount(ctx) } -func unmarshalLink(b []byte) CompactLink { - return NewLink( - CidNumber(binary.LittleEndian.Uint64(b[0:8])), - CidNumber(binary.LittleEndian.Uint64(b[8:16])), - AccNumber(binary.LittleEndian.Uint64(b[16:24])), - ) -} +func (lk BaseLinkKeeper) Iterate(ctx sdk.Context, process func(link CompactLink)) { + iterator := ctx.KVStore(lk.key).Iterator(nil, nil) + defer iterator.Close() -func marshalLink(l CompactLink) []byte { - b := make([]byte, 24) - binary.LittleEndian.PutUint64(b[0:8], uint64(l.From())) - binary.LittleEndian.PutUint64(b[8:16], uint64(l.To())) - binary.LittleEndian.PutUint64(b[16:24], uint64(l.Acc())) - return b + for iterator.Valid() { + process(UnmarshalBinaryLink(iterator.Key())) + iterator.Next() + } } + diff --git a/x/link/keeper/link_index.go b/x/link/keeper/link_index.go index d6691130..f1558cbd 100644 --- a/x/link/keeper/link_index.go +++ b/x/link/keeper/link_index.go @@ -62,6 +62,13 @@ func (i *LinkIndexedKeeper) PutIntoIndex(link CompactLink) { i.currentBlockLinks = append(i.currentBlockLinks, link) } +func (i *LinkIndexedKeeper) PutLink(ctx sdk.Context, link CompactLink) { + if !ctx.IsCheckTx() { + i.currentBlockLinks = append(i.currentBlockLinks, link) + } + i.LinkKeeper.PutLink(ctx, link) +} + func (i *LinkIndexedKeeper) GetOutLinks() map[CidNumber]CidLinks { return i.currentRankOurLinks } diff --git a/x/link/types/link.go b/x/link/types/link.go index 05da6999..8cbc3039 100644 --- a/x/link/types/link.go +++ b/x/link/types/link.go @@ -1,6 +1,9 @@ package types -import . "github.com/cybercongress/cyberd/types" +import ( + "encoding/binary" + . "github.com/cybercongress/cyberd/types" +) type Link struct { From Cid @@ -20,3 +23,19 @@ func NewLink(from CidNumber, to CidNumber, acc AccNumber) CompactLink { func (l CompactLink) From() CidNumber { return l.from } func (l CompactLink) To() CidNumber { return l.to } func (l CompactLink) Acc() AccNumber { return l.acc } + +func UnmarshalBinaryLink(b []byte) CompactLink { + return NewLink( + CidNumber(binary.LittleEndian.Uint64(b[0:8])), + CidNumber(binary.LittleEndian.Uint64(b[8:16])), + AccNumber(binary.LittleEndian.Uint64(b[16:24])), + ) +} + +func (l CompactLink) MarshalBinary() []byte { + b := make([]byte, 24) + binary.LittleEndian.PutUint64(b[0:8], uint64(l.From())) + binary.LittleEndian.PutUint64(b[8:16], uint64(l.To())) + binary.LittleEndian.PutUint64(b[16:24], uint64(l.Acc())) + return b +} From 9de40958a37aeda70a0aa8758e9c3f79fdc27dc7 Mon Sep 17 00:00:00 2001 From: Artur Albov Date: Mon, 28 Jan 2019 15:03:22 +0700 Subject: [PATCH 12/38] #184 Links Exporter. Buffered IO. Refactoring --- app/app.go | 5 +- app/export.go | 2 +- util/file.go | 29 ++++++++++ x/link/genesis.go | 103 ++++++++++++++---------------------- x/link/keeper/cid.go | 65 +++++++++++++++++++++++ x/link/keeper/link.go | 43 +++++++++++++++ x/link/keeper/link_index.go | 21 ++++++++ 7 files changed, 204 insertions(+), 64 deletions(-) create mode 100644 util/file.go diff --git a/app/app.go b/app/app.go index dc10ee05..4599a5d5 100644 --- a/app/app.go +++ b/app/app.go @@ -297,7 +297,10 @@ func (app *CyberdApp) initChainer(ctx sdk.Context, req abci.RequestInitChain) ab } } - link.InitGenesis(ctx, app.mainKeeper, app.cidNumKeeper, app.linkIndexedKeeper, app.Logger) + err = link.InitGenesis(ctx, app.cidNumKeeper, app.linkIndexedKeeper, app.Logger) + if err != nil { + panic(err) + } return abci.ResponseInitChain{ Validators: validators, diff --git a/app/export.go b/app/export.go index 981a8351..0b68e4a7 100644 --- a/app/export.go +++ b/app/export.go @@ -42,7 +42,7 @@ func (app *CyberdApp) ExportAppStateAndValidators() (appState json.RawMessage, v return nil, nil, err } validators = staking.WriteValidators(ctx, app.stakingKeeper) - err = link.ExportLinks(ctx, app.cidNumKeeper, app.linkIndexedKeeper) + err = link.WriteGenesis(ctx, app.cidNumKeeper, app.linkIndexedKeeper, app.Logger) if err != nil { return nil, nil, err } diff --git a/util/file.go b/util/file.go new file mode 100644 index 00000000..fb863ff4 --- /dev/null +++ b/util/file.go @@ -0,0 +1,29 @@ +package util + +import ( + "errors" + "github.com/spf13/viper" + "github.com/tendermint/tendermint/libs/cli" + "io" + "path/filepath" +) + +func RootifyPath(path string) string { + if filepath.IsAbs(path) { + return path + } + rootDir := viper.GetString(cli.HomeFlag) + return filepath.Join(rootDir, path) +} + +func ReadExactlyNBytes(reader io.Reader, n uint64) ([]byte, error) { + data := make([]byte, n) + bytesReaded, err := reader.Read(data) + if err != nil { + return nil, err + } + if uint64(bytesReaded) != n { + return nil, errors.New("not enough bytes tor read") + } + return data, nil +} diff --git a/x/link/genesis.go b/x/link/genesis.go index 569c9ad0..b8056cbd 100644 --- a/x/link/genesis.go +++ b/x/link/genesis.go @@ -1,95 +1,74 @@ package link import ( - "bytes" - "encoding/binary" + "bufio" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cybercongress/cyberd/store" + "github.com/cybercongress/cyberd/util" "github.com/cybercongress/cyberd/x/link/keeper" - . "github.com/cybercongress/cyberd/x/link/types" - "github.com/spf13/viper" - "github.com/tendermint/tendermint/libs/cli" "github.com/tendermint/tendermint/libs/log" - "io/ioutil" "os" - "path/filepath" ) -const LinksFileName = "links" - -func GetLinksFilePath() string { - rootDir := viper.GetString(cli.HomeFlag) - return filepath.Join(rootDir, LinksFileName) -} +const ( + LinksFileName = "config/links" +) func InitGenesis( - ctx sdk.Context, mainKeeper store.MainKeeper, cidNumKeeper keeper.CidNumberKeeper, - linkIndexedKeeper *keeper.LinkIndexedKeeper, logger log.Logger, -) { - // initialize links + ctx sdk.Context, cidNumKeeper keeper.CidNumberKeeper, linkIndexedKeeper *keeper.LinkIndexedKeeper, logger log.Logger, +) (err error) { - _, err := os.Stat(GetLinksFilePath()) + linksFilePath := util.RootifyPath(LinksFileName) + linksFile, err := os.Open(linksFilePath) if err != nil { if os.IsNotExist(err) { - logger.Info("File with links not found. Empty links set will be used") + logger.Info("File with links not found. Empty set will be used") + return nil } - } else { - data, err := ioutil.ReadFile(GetLinksFilePath()) - if err != nil { - panic(err) - } - - // import cids - cidCount := binary.LittleEndian.Uint64(data[0:8]) + return + } + reader := bufio.NewReader(linksFile) // 4096 bytes chunk size - cursor := uint64(8) - // read all CIDs with their numbers - for ; cursor < 8+(cidCount*54); cursor = cursor + 54 { - cid := Cid(data[cursor : cursor+46]) - cidNumber := CidNumber(binary.LittleEndian.Uint64(data[cursor+46 : cursor+54])) - cidNumKeeper.PutCid(ctx, cid, cidNumber) - } - lastCidIndex := cidCount - 1 - lastCidIndexBytes := make([]byte, 8) - binary.LittleEndian.PutUint64(lastCidIndexBytes, lastCidIndex) - mainKeeper.SetLastCidIndex(ctx, lastCidIndexBytes) + // initialize slices to read data + err = cidNumKeeper.LoadFromReader(ctx, reader) + if err != nil { + return + } - for ; cursor < uint64(len(data)); cursor = cursor + 24 { - linkIndexedKeeper.PutLink(ctx, UnmarshalBinaryLink(data[cursor:cursor+24])) - } + // Read all links + err = linkIndexedKeeper.LoadFromReader(ctx, reader) + if err != nil { + return } + + return } -func ExportLinks( - ctx sdk.Context, cidNumKeeper keeper.CidNumberKeeper, linkIndexedKeeper *keeper.LinkIndexedKeeper, +func WriteGenesis( + ctx sdk.Context, cidNumKeeper keeper.CidNumberKeeper, linkIndexedKeeper *keeper.LinkIndexedKeeper, logger log.Logger, ) (err error) { - linksFile, err := os.Create(GetLinksFilePath()) + linksFilePath := util.RootifyPath(LinksFileName) + linksFile, err := os.Create(linksFilePath) if err != nil { return } - buf := new(bytes.Buffer) - dataAsBytes := make([]byte, 8) //common bytes array to convert uints - - // export CIDs in binary format: .... - cidsCount := cidNumKeeper.GetCidsCount(ctx) - binary.LittleEndian.PutUint64(dataAsBytes, cidsCount) - buf.Write(dataAsBytes) - - cidNumKeeper.Iterate(ctx, func(cid Cid, number CidNumber) { - buf.Write([]byte(cid)) - binary.LittleEndian.PutUint64(dataAsBytes, uint64(number)) - buf.Write(dataAsBytes) - }) - - // export links in binary format: - linkIndexedKeeper.Iterate(ctx, func(link CompactLink) { buf.Write(link.MarshalBinary()) }) + writer := bufio.NewWriter(linksFile) // 4096 byte chunk + err = cidNumKeeper.WriteCids(ctx, writer) + if err != nil { + return + } + err = linkIndexedKeeper.WriteLinks(ctx, writer) + if err != nil { + return + } - _, err = linksFile.Write(buf.Bytes()) + err = writer.Flush() if err != nil { return } err = linksFile.Close() + + logger.Info("Cids and links exported. File created.", "path", linksFilePath) return } diff --git a/x/link/keeper/cid.go b/x/link/keeper/cid.go index 2c192f6e..802c06c0 100644 --- a/x/link/keeper/cid.go +++ b/x/link/keeper/cid.go @@ -4,7 +4,15 @@ import ( "encoding/binary" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cybercongress/cyberd/store" + "github.com/cybercongress/cyberd/util" . "github.com/cybercongress/cyberd/x/link/types" + "io" +) + +const ( + CidBytesSize = uint64(46) + CidNumberBytesSize = uint64(8) + CidCountBytesSize = uint64(8) ) type CidNumberKeeper interface { @@ -15,6 +23,8 @@ type CidNumberKeeper interface { GetCidsCount(ctx sdk.Context) uint64 PutCid(ctx sdk.Context, cid Cid, cidNumber CidNumber) Iterate(ctx sdk.Context, process func(Cid, CidNumber)) + WriteCids(ctx sdk.Context, writer io.Writer) (err error) + LoadFromReader(ctx sdk.Context, reader io.Reader) (err error) } type BaseCidNumberKeeper struct { @@ -111,3 +121,58 @@ func (k BaseCidNumberKeeper) Iterate(ctx sdk.Context, process func(Cid, CidNumbe func (k BaseCidNumberKeeper) GetCidsCount(ctx sdk.Context) uint64 { return k.ms.GetCidsCount(ctx) } + +// write CIDs to writer in binary format: .... +func (k BaseCidNumberKeeper) WriteCids(ctx sdk.Context, writer io.Writer) (err error) { + uintAsBytes := make([]byte, 8) //common bytes array to convert uints + + cidsCount := k.GetCidsCount(ctx) + binary.LittleEndian.PutUint64(uintAsBytes, cidsCount) + _, err = writer.Write(uintAsBytes) + if err != nil { + return + } + + k.Iterate(ctx, func(cid Cid, number CidNumber) { + _, err = writer.Write([]byte(cid)) + if err != nil { + return + } + binary.LittleEndian.PutUint64(uintAsBytes, uint64(number)) + _, err = writer.Write(uintAsBytes) + if err != nil { + return + } + }) + return +} + +func (k BaseCidNumberKeeper) LoadFromReader(ctx sdk.Context, reader io.Reader) (err error) { + cidCountBytes, err := util.ReadExactlyNBytes(reader, CidCountBytesSize) + if err != nil { + return + } + cidCount := binary.LittleEndian.Uint64(cidCountBytes) + + // Read all CIDs with their numbers + for i := uint64(0); i < cidCount; i++ { + cidBytes, err := util.ReadExactlyNBytes(reader, CidBytesSize) + if err != nil { + return err + } + cid := Cid(cidBytes) + cidNumberBytes, err := util.ReadExactlyNBytes(reader, CidNumberBytesSize) + if err != nil { + return err + } + cidNumber := CidNumber(binary.LittleEndian.Uint64(cidNumberBytes)) + k.PutCid(ctx, cid, cidNumber) + } + + lastCidIndex := cidCount - 1 + lastCidIndexBytes := make([]byte, 8) + binary.LittleEndian.PutUint64(lastCidIndexBytes, lastCidIndex) + k.ms.SetLastCidIndex(ctx, lastCidIndexBytes) + + return +} diff --git a/x/link/keeper/link.go b/x/link/keeper/link.go index 52d2ec2d..e77b64f1 100644 --- a/x/link/keeper/link.go +++ b/x/link/keeper/link.go @@ -1,9 +1,17 @@ package keeper import ( + "encoding/binary" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cybercongress/cyberd/store" + "github.com/cybercongress/cyberd/util" . "github.com/cybercongress/cyberd/x/link/types" + "io" +) + +const ( + LinkBytesSize = uint64(24) + LinksCountBytesSize = uint64(8) ) type LinkKeeper interface { @@ -12,6 +20,8 @@ type LinkKeeper interface { GetAllLinks(ctx sdk.Context) (Links, Links, error) GetLinksCount(ctx sdk.Context) uint64 Iterate(ctx sdk.Context, process func(link CompactLink)) + WriteLinks(ctx sdk.Context, writer io.Writer) (err error) + LoadFromReader(ctx sdk.Context, reader io.Reader) (err error) } type BaseLinkKeeper struct { @@ -66,3 +76,36 @@ func (lk BaseLinkKeeper) Iterate(ctx sdk.Context, process func(link CompactLink) } } +// write links to writer in binary format: ... +func (lk BaseLinkKeeper) WriteLinks(ctx sdk.Context, writer io.Writer) (err error) { + uintAsBytes := make([]byte, 8) //common bytes array to convert uints + + linksCount := lk.GetLinksCount(ctx) + binary.LittleEndian.PutUint64(uintAsBytes, linksCount) + _, err = writer.Write(uintAsBytes) + if err != nil { + return + } + + lk.Iterate(ctx, func(link CompactLink) { + _, _ = writer.Write(link.MarshalBinary()) + }) + return +} + +func (lk BaseLinkKeeper) LoadFromReader(ctx sdk.Context, reader io.Reader) (err error) { + linksCountBytes, err := util.ReadExactlyNBytes(reader, LinksCountBytesSize) + if err != nil { + return + } + linksCount := binary.LittleEndian.Uint64(linksCountBytes) + + for j := uint64(0); j < linksCount; j++ { + linkBytes, err := util.ReadExactlyNBytes(reader, LinkBytesSize) + if err != nil { + return err + } + lk.PutLink(ctx, UnmarshalBinaryLink(linkBytes)) + } + return +} diff --git a/x/link/keeper/link_index.go b/x/link/keeper/link_index.go index f1558cbd..fd7e42da 100644 --- a/x/link/keeper/link_index.go +++ b/x/link/keeper/link_index.go @@ -1,9 +1,12 @@ package keeper import ( + "encoding/binary" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cybercongress/cyberd/util" . "github.com/cybercongress/cyberd/x/link/types" cmn "github.com/tendermint/tendermint/libs/common" + "io" ) type LinkIndexedKeeper struct { @@ -80,3 +83,21 @@ func (i *LinkIndexedKeeper) GetInLinks() map[CidNumber]CidLinks { func (i *LinkIndexedKeeper) GetCurrentBlockLinks() []CompactLink { return i.currentBlockLinks } + +//todo: remove duplicated method (BaseLinksKeeper) +func (i *LinkIndexedKeeper) LoadFromReader(ctx sdk.Context, reader io.Reader) (err error) { + linksCountBytes, err := util.ReadExactlyNBytes(reader, LinksCountBytesSize) + if err != nil { + return + } + linksCount := binary.LittleEndian.Uint64(linksCountBytes) + + for j := uint64(0); j < linksCount; j++ { + linkBytes, err := util.ReadExactlyNBytes(reader, LinkBytesSize) + if err != nil { + return err + } + i.PutLink(ctx, UnmarshalBinaryLink(linkBytes)) + } + return +} From a9db6b6eacfb75f835c552c6d201c487c5ed44c4 Mon Sep 17 00:00:00 2001 From: Hleb Albau Date: Mon, 28 Jan 2019 13:55:12 +0700 Subject: [PATCH 13/38] #181 Constant Block Reward --- app/app.go | 20 +++++++++++--------- app/export.go | 4 ++-- app/fee.go | 20 -------------------- app/genesis.go | 13 ++++--------- app/keys.go | 35 +++++++++++++++++------------------ x/mint/abci.go | 13 +++++++++++++ x/mint/genesis.go | 26 ++++++++++++++++++++++++++ x/mint/minter.go | 47 +++++++++++++++++++++++++++++++++++++++++++++++ x/mint/params.go | 20 ++++++++++++++++++++ 9 files changed, 140 insertions(+), 58 deletions(-) delete mode 100644 app/fee.go create mode 100644 x/mint/abci.go create mode 100644 x/mint/genesis.go create mode 100644 x/mint/minter.go create mode 100644 x/mint/params.go diff --git a/app/app.go b/app/app.go index 4599a5d5..2d94bf63 100644 --- a/app/app.go +++ b/app/app.go @@ -8,7 +8,6 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/bank" distr "github.com/cosmos/cosmos-sdk/x/distribution" - "github.com/cosmos/cosmos-sdk/x/mint" "github.com/cosmos/cosmos-sdk/x/params" "github.com/cosmos/cosmos-sdk/x/slashing" "github.com/cosmos/cosmos-sdk/x/staking" @@ -22,6 +21,7 @@ import ( cbdbank "github.com/cybercongress/cyberd/x/bank" "github.com/cybercongress/cyberd/x/link" "github.com/cybercongress/cyberd/x/link/keeper" + "github.com/cybercongress/cyberd/x/mint" "github.com/cybercongress/cyberd/x/rank" abci "github.com/tendermint/tendermint/abci/types" cmn "github.com/tendermint/tendermint/libs/common" @@ -64,14 +64,16 @@ type CyberdApp struct { // manage getting and setting app data mainKeeper store.MainKeeper accountKeeper auth.AccountKeeper - feeCollectionKeeper NoopFeeCollectionKeeper + feeCollectionKeeper auth.FeeCollectionKeeper bankKeeper cbdbank.Keeper stakingKeeper staking.Keeper slashingKeeper slashing.Keeper distrKeeper distr.Keeper paramsKeeper params.Keeper accBandwidthKeeper bw.Keeper - mintKeeper mint.Keeper + + //inflation + minter mint.Minter // cyberd storage linkIndexedKeeper *keeper.LinkIndexedKeeper @@ -110,7 +112,7 @@ func NewCyberdApp( mainKeeper: ms, } - app.feeCollectionKeeper = NoopFeeCollectionKeeper{} + app.feeCollectionKeeper = auth.NewFeeCollectionKeeper(app.cdc, dbKeys.fees) app.paramsKeeper = params.NewKeeper(app.cdc, dbKeys.params, dbKeys.tParams) app.accBandwidthKeeper = bandwidth.NewAccBandwidthKeeper(dbKeys.accBandwidth) app.blockBandwidthKeeper = bandwidth.NewBlockSpentBandwidthKeeper(dbKeys.blockBandwidth) @@ -141,9 +143,9 @@ func NewCyberdApp( app.bankKeeper, stakingKeeper, app.feeCollectionKeeper, distr.DefaultCodespace, ) - app.mintKeeper = mint.NewKeeper(app.cdc, dbKeys.mint, + app.minter = mint.NewMinter( + app.feeCollectionKeeper, stakingKeeper, app.paramsKeeper.Subspace(mint.DefaultParamspace), - &stakingKeeper, app.feeCollectionKeeper, ) // cyberd keepers @@ -256,10 +258,10 @@ func (app *CyberdApp) initChainer(ctx sdk.Context, req abci.RequestInitChain) ab app.accountKeeper.SetParams(ctx, genesisState.AuthData.Params) slashing.InitGenesis(ctx, app.slashingKeeper, genesisState.SlashingData, genesisState.StakingData) - mint.InitGenesis(ctx, app.mintKeeper, genesisState.MintData) + mint.InitGenesis(ctx, app.minter, genesisState.MintData) bandwidth.InitGenesis(ctx, app.bandwidthMeter, app.accBandwidthKeeper, genesisState.GetAddresses()) - err = CyberdValidateGenesisState(genesisState) + err = validateGenesisState(genesisState) if err != nil { panic(err) } @@ -427,7 +429,7 @@ func getSignersTags(tx sdk.Tx) sdk.Tags { func (app *CyberdApp) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock { // mint new tokens for the previous block - mint.BeginBlocker(ctx, app.mintKeeper) + mint.BeginBlocker(ctx, app.minter) // distribute rewards for the previous block distr.BeginBlocker(ctx, req, app.distrKeeper) diff --git a/app/export.go b/app/export.go index 0b68e4a7..6c37d594 100644 --- a/app/export.go +++ b/app/export.go @@ -6,10 +6,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth" distr "github.com/cosmos/cosmos-sdk/x/distribution" - "github.com/cosmos/cosmos-sdk/x/mint" "github.com/cosmos/cosmos-sdk/x/slashing" "github.com/cosmos/cosmos-sdk/x/staking" "github.com/cybercongress/cyberd/x/link" + "github.com/cybercongress/cyberd/x/mint" abci "github.com/tendermint/tendermint/abci/types" tmtypes "github.com/tendermint/tendermint/types" ) @@ -33,7 +33,7 @@ func (app *CyberdApp) ExportAppStateAndValidators() (appState json.RawMessage, v accounts, auth.NewGenesisState(sdk.Coins{}, app.accountKeeper.GetParams(ctx)), staking.ExportGenesis(ctx, app.stakingKeeper), - mint.ExportGenesis(ctx, app.mintKeeper), + mint.ExportGenesis(ctx, app.minter), distr.ExportGenesis(ctx, app.distrKeeper), slashing.ExportGenesis(ctx, app.slashingKeeper), ) diff --git a/app/fee.go b/app/fee.go deleted file mode 100644 index 5d2e576a..00000000 --- a/app/fee.go +++ /dev/null @@ -1,20 +0,0 @@ -package app - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" -) - -var noCoins = sdk.Coins{} - -type NoopFeeCollectionKeeper struct{} - -func (fck NoopFeeCollectionKeeper) AddCollectedFees(_ sdk.Context, c sdk.Coins) sdk.Coins { - return noCoins -} - -func (fck NoopFeeCollectionKeeper) GetCollectedFees(_ sdk.Context) sdk.Coins { - return noCoins -} - -func (fck NoopFeeCollectionKeeper) SetCollectedFees(_ sdk.Coins) {} -func (fck NoopFeeCollectionKeeper) ClearCollectedFees(_ sdk.Context) {} diff --git a/app/genesis.go b/app/genesis.go index 3503edde..288f0c43 100644 --- a/app/genesis.go +++ b/app/genesis.go @@ -7,11 +7,11 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth" distr "github.com/cosmos/cosmos-sdk/x/distribution" - "github.com/cosmos/cosmos-sdk/x/mint" "github.com/cosmos/cosmos-sdk/x/slashing" "github.com/cosmos/cosmos-sdk/x/staking" "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/cybercongress/cyberd/types/coin" + "github.com/cybercongress/cyberd/x/mint" "github.com/pkg/errors" tmtypes "github.com/tendermint/tendermint/types" "time" @@ -98,12 +98,7 @@ func NewDefaultGenesisState() GenesisState { }, MintData: mint.GenesisState{ Params: mint.Params{ - MintDenom: coin.CYB, - InflationRateChange: sdk.NewDecWithPrec(0, 2), - InflationMax: sdk.NewDecWithPrec(200, 2), - InflationMin: sdk.NewDecWithPrec(200, 2), - GoalBonded: sdk.NewDecWithPrec(99, 2), - BlocksPerYear: uint64(60 * 60 * 24 * 365), // assuming 1 second block times + TokensPerBlock: 634195840, }, }, StakingData: staking.GenesisState{ @@ -170,8 +165,8 @@ func CyberdAppGenStateJSON(cdc *codec.Codec, genDoc tmtypes.GenesisDoc, appGenTx return codec.MarshalJSONIndent(cdc, genesisState) } -// CyberdValidateGenesisState ensures that the genesis state obeys the expected invariants -func CyberdValidateGenesisState(genesisState GenesisState) (err error) { +// validateGenesisState ensures that the genesis state obeys the expected invariants +func validateGenesisState(genesisState GenesisState) (err error) { err = validateGenesisStateAccounts(genesisState.Accounts) if err != nil { diff --git a/app/keys.go b/app/keys.go index 2c490c45..8c4a6d14 100644 --- a/app/keys.go +++ b/app/keys.go @@ -5,7 +5,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth" distr "github.com/cosmos/cosmos-sdk/x/distribution" - "github.com/cosmos/cosmos-sdk/x/mint" "github.com/cosmos/cosmos-sdk/x/params" "github.com/cosmos/cosmos-sdk/x/slashing" "github.com/cosmos/cosmos-sdk/x/staking" @@ -21,10 +20,10 @@ type CyberdAppDbKeys struct { rank *sdk.KVStoreKey stake *sdk.KVStoreKey tStake *sdk.TransientStoreKey - distr *sdk.KVStoreKey - tDistr *sdk.TransientStoreKey + distr *sdk.KVStoreKey + tDistr *sdk.TransientStoreKey slashing *sdk.KVStoreKey - mint *sdk.KVStoreKey + fees *sdk.KVStoreKey params *sdk.KVStoreKey tParams *sdk.TransientStoreKey accBandwidth *sdk.KVStoreKey @@ -34,21 +33,21 @@ type CyberdAppDbKeys struct { func NewCyberdAppDbKeys() CyberdAppDbKeys { return CyberdAppDbKeys{ - main: sdk.NewKVStoreKey(bam.MainStoreKey), - acc: sdk.NewKVStoreKey(auth.StoreKey), - stake: sdk.NewKVStoreKey(staking.StoreKey), - tStake: sdk.NewTransientStoreKey(staking.TStoreKey), - mint: sdk.NewKVStoreKey(mint.StoreKey), - distr: sdk.NewKVStoreKey(distr.StoreKey), + main: sdk.NewKVStoreKey(bam.MainStoreKey), + acc: sdk.NewKVStoreKey(auth.StoreKey), + stake: sdk.NewKVStoreKey(staking.StoreKey), + tStake: sdk.NewTransientStoreKey(staking.TStoreKey), + fees: sdk.NewKVStoreKey(auth.FeeStoreKey), + distr: sdk.NewKVStoreKey(distr.StoreKey), tDistr: sdk.NewTransientStoreKey(distr.TStoreKey), - slashing: sdk.NewKVStoreKey(slashing.StoreKey), - params: sdk.NewKVStoreKey(params.StoreKey), - tParams: sdk.NewTransientStoreKey(params.TStoreKey), + slashing: sdk.NewKVStoreKey(slashing.StoreKey), + params: sdk.NewKVStoreKey(params.StoreKey), + tParams: sdk.NewTransientStoreKey(params.TStoreKey), - cidNum: sdk.NewKVStoreKey("cid_index"), - cidNumReverse: sdk.NewKVStoreKey("cid_index_reverse"), - links: sdk.NewKVStoreKey("links"), - rank: sdk.NewKVStoreKey("rank"), + cidNum: sdk.NewKVStoreKey("cid_index"), + cidNumReverse: sdk.NewKVStoreKey("cid_index_reverse"), + links: sdk.NewKVStoreKey("links"), + rank: sdk.NewKVStoreKey("rank"), accBandwidth: sdk.NewKVStoreKey("acc_bandwidth"), blockBandwidth: sdk.NewKVStoreKey("block_spent_bandwidth"), } @@ -57,7 +56,7 @@ func NewCyberdAppDbKeys() CyberdAppDbKeys { func (k CyberdAppDbKeys) GetStoreKeys() []*sdk.KVStoreKey { return []*sdk.KVStoreKey{ k.main, k.acc, k.cidNum, k.cidNumReverse, k.links, k.rank, k.stake, - k.slashing, k.params, k.distr, k.mint, k.accBandwidth, k.blockBandwidth, + k.slashing, k.params, k.distr, k.fees, k.accBandwidth, k.blockBandwidth, } } diff --git a/x/mint/abci.go b/x/mint/abci.go new file mode 100644 index 00000000..85ad74cd --- /dev/null +++ b/x/mint/abci.go @@ -0,0 +1,13 @@ +package mint + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cybercongress/cyberd/types/coin" +) + +// Inflate every block +func BeginBlocker(ctx sdk.Context, m Minter) { + mintedCoins := sdk.NewInt64Coin(coin.CYB, m.GetParams(ctx).TokensPerBlock) + m.fck.AddCollectedFees(ctx, sdk.Coins{mintedCoins}) + m.stakeKeeper.InflateSupply(ctx, mintedCoins.Amount) +} diff --git a/x/mint/genesis.go b/x/mint/genesis.go new file mode 100644 index 00000000..193ef37d --- /dev/null +++ b/x/mint/genesis.go @@ -0,0 +1,26 @@ +package mint + +import sdk "github.com/cosmos/cosmos-sdk/types" + +type GenesisState struct { + Params Params `json:"params"` +} + +func InitGenesis(ctx sdk.Context, minter Minter, data GenesisState) { + minter.SetParams(ctx, data.Params) +} + +func ExportGenesis(ctx sdk.Context, minter Minter) GenesisState { + params := minter.GetParams(ctx) + return GenesisState{ + Params: params, + } +} + +func ValidateGenesis(data GenesisState) error { + err := validateParams(data.Params) + if err != nil { + return err + } + return nil +} diff --git a/x/mint/minter.go b/x/mint/minter.go new file mode 100644 index 00000000..e2300755 --- /dev/null +++ b/x/mint/minter.go @@ -0,0 +1,47 @@ +package mint + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/cosmos/cosmos-sdk/x/params" + "github.com/cosmos/cosmos-sdk/x/staking/keeper" +) + +var ( + // default paramspace for mint params + DefaultParamspace = "cbdmint" + // params store for inflation params + ParamStoreKeyParams = []byte("params") +) + +// mint new CYB tokens for every block +type Minter struct { + fck auth.FeeCollectionKeeper + stakeKeeper keeper.Keeper + paramSpace params.Subspace +} + +// get inflation params from the global param store +func (m Minter) GetParams(ctx sdk.Context) (p Params) { + m.paramSpace.Get(ctx, ParamStoreKeyParams, &p) + return +} + +// set inflation params from the global param store +func (m Minter) SetParams(ctx sdk.Context, p Params) { + m.paramSpace.Set(ctx, ParamStoreKeyParams, &p) +} + +func NewMinter(fck auth.FeeCollectionKeeper, stakeKeeper keeper.Keeper, paramSpace params.Subspace) Minter { + return Minter{ + fck: fck, + stakeKeeper: stakeKeeper, + paramSpace: paramSpace.WithTypeTable(ParamTypeTable()), + } +} + +func ParamTypeTable() params.TypeTable { + return params.NewTypeTable( + ParamStoreKeyParams, Params{}, + ) +} diff --git a/x/mint/params.go b/x/mint/params.go new file mode 100644 index 00000000..bf3b98d0 --- /dev/null +++ b/x/mint/params.go @@ -0,0 +1,20 @@ +package mint + +import "fmt" + +type Params struct { + TokensPerBlock int64 `json:"tokens_per_block"` +} + +func DefaultParams() Params { + return Params{ + TokensPerBlock: 634195840, // 200% for 10^16 tokens in case 1 seconds blocks + } +} + +func validateParams(params Params) error { + if params.TokensPerBlock < 0 { + return fmt.Errorf("mint parameter TokensPerBlock should be not negative. Got %v ", params.TokensPerBlock) + } + return nil +} From 33560252881260691e8b51581cab5499341c1a74 Mon Sep 17 00:00:00 2001 From: Hleb Albau Date: Tue, 29 Jan 2019 11:44:01 +0700 Subject: [PATCH 14/38] Fix wrong home folder path --- daemon/main.go | 24 ++++++++++++------------ util/cobra.go | 20 ++++++++++++++++++++ 2 files changed, 32 insertions(+), 12 deletions(-) create mode 100644 util/cobra.go diff --git a/daemon/main.go b/daemon/main.go index 32113e81..379b5978 100644 --- a/daemon/main.go +++ b/daemon/main.go @@ -9,6 +9,7 @@ import ( "github.com/cybercongress/cyberd/app" "github.com/cybercongress/cyberd/daemon/cmd" "github.com/cybercongress/cyberd/daemon/rpc" + "github.com/cybercongress/cyberd/util" "github.com/cybercongress/cyberd/x/rank" "github.com/spf13/cobra" "github.com/spf13/viper" @@ -34,23 +35,12 @@ func main() { cdc := app.MakeCodec() ctx := server.NewDefaultContext() - ctx.Config.RootDir = rootDir cobra.EnableCommandSorting = false rootCmd := &cobra.Command{ Use: "cyberd", Short: "Cyberd Daemon (server)", - PersistentPreRunE: server.PersistentPreRunEFn(ctx), - } - - rootCmd.PersistentPreRunE = func(_ *cobra.Command, args []string) error { - for _, arg := range args { - if arg == flagNotToSealAccPrefix { - return nil - } - } - app.SetPrefix() - return nil + PersistentPreRunE: util.ConcatCobraCmdFuncs(server.PersistentPreRunEFn(ctx), setAppPrefix), } rootCmd.AddCommand(cmd.InitCmd(ctx, cdc)) @@ -96,3 +86,13 @@ func exportAppStateAndTMValidators( capp := app.NewCyberdApp(logger, db, rank.CPU, false) return capp.ExportAppStateAndValidators() } + +func setAppPrefix(_ *cobra.Command, args []string) error { + for _, arg := range args { + if arg == flagNotToSealAccPrefix { + return nil + } + } + app.SetPrefix() + return nil +} diff --git a/util/cobra.go b/util/cobra.go new file mode 100644 index 00000000..59c3751f --- /dev/null +++ b/util/cobra.go @@ -0,0 +1,20 @@ +package util + +import "github.com/spf13/cobra" + +type CobraCmdFunc func(cmd *cobra.Command, args []string) error + +// Returns a single function that calls each argument function in sequence +// RunE, PreRunE, PersistentPreRunE, etc. all have this same signature +func ConcatCobraCmdFuncs(fns ...CobraCmdFunc) CobraCmdFunc { + return func(cmd *cobra.Command, args []string) error { + for _, fn := range fns { + if fn != nil { + if err := fn(cmd, args); err != nil { + return err + } + } + } + return nil + } +} From f4d48725c864a422568a9cfc0da56282f3a870e9 Mon Sep 17 00:00:00 2001 From: Hleb Albau Date: Mon, 28 Jan 2019 18:39:31 +0700 Subject: [PATCH 15/38] #197 Error on replay with wrong app hash calculation --- app/app.go | 14 +++++++------- daemon/cmd/testnet.go | 2 +- types/coin/coins.go | 2 +- x/bank/index.go | 3 --- x/bank/keeper.go | 4 ++-- 5 files changed, 11 insertions(+), 14 deletions(-) diff --git a/app/app.go b/app/app.go index 2d94bf63..162bc799 100644 --- a/app/app.go +++ b/app/app.go @@ -65,7 +65,7 @@ type CyberdApp struct { mainKeeper store.MainKeeper accountKeeper auth.AccountKeeper feeCollectionKeeper auth.FeeCollectionKeeper - bankKeeper cbdbank.Keeper + bankKeeper *cbdbank.Keeper stakingKeeper staking.Keeper slashingKeeper slashing.Keeper distrKeeper distr.Keeper @@ -78,7 +78,7 @@ type CyberdApp struct { // cyberd storage linkIndexedKeeper *keeper.LinkIndexedKeeper cidNumKeeper keeper.CidNumberKeeper - stakeIndex *cbdbank.IndexedKeeper + stakingIndex *cbdbank.IndexedKeeper rankState *rank.RankState latestBlockHeight int64 @@ -151,9 +151,9 @@ func NewCyberdApp( // cyberd keepers app.linkIndexedKeeper = keeper.NewLinkIndexedKeeper(keeper.NewBaseLinkKeeper(ms, dbKeys.links)) app.cidNumKeeper = keeper.NewBaseCidNumberKeeper(ms, dbKeys.cidNum, dbKeys.cidNumReverse) - app.stakeIndex = cbdbank.NewIndexedKeeper(&app.bankKeeper, app.accountKeeper) + app.stakingIndex = cbdbank.NewIndexedKeeper(app.bankKeeper, app.accountKeeper) app.rankState = rank.NewRankState( - allowSearch, app.mainKeeper, app.stakeIndex, + allowSearch, app.mainKeeper, app.stakingIndex, app.linkIndexedKeeper, app.cidNumKeeper, computeUnit, ) @@ -209,7 +209,7 @@ func NewCyberdApp( start := time.Now() app.BaseApp.Logger.Info("Loading mem state") app.linkIndexedKeeper.Load(rankCtx, ctx) - app.stakeIndex.Load(rankCtx, ctx) + app.stakingIndex.Load(rankCtx, ctx) app.BaseApp.Logger.Info("App loaded", "time", time.Since(start)) // BANDWIDTH LOAD @@ -242,7 +242,7 @@ func (app *CyberdApp) initChainer(ctx sdk.Context, req abci.RequestInitChain) ab acc := gacc.ToAccount() acc.AccountNumber = app.accountKeeper.GetNextAccountNumber(ctx) app.accountKeeper.SetAccount(ctx, acc) - app.stakeIndex.UpdateStake(types.AccNumber(acc.AccountNumber), acc.Coins.AmountOf(coin.CYB).Int64()) + app.stakingIndex.UpdateStake(types.AccNumber(acc.AccountNumber), acc.Coins.AmountOf(coin.CYB).Int64()) } // initialize distribution (must happen before staking) @@ -452,7 +452,7 @@ func (app *CyberdApp) EndBlocker(ctx sdk.Context, _ abci.RequestEndBlock) abci.R app.mainKeeper.StoreLatestBlockNumber(ctx, uint64(ctx.BlockHeight())) validatorUpdates, tags := staking.EndBlocker(ctx, app.stakingKeeper) - app.stakeIndex.EndBlocker(ctx) + app.stakingIndex.EndBlocker(ctx) bandwidth.EndBlocker(ctx, app.bandwidthMeter) diff --git a/daemon/cmd/testnet.go b/daemon/cmd/testnet.go index 0f2323b5..913e0060 100644 --- a/daemon/cmd/testnet.go +++ b/daemon/cmd/testnet.go @@ -179,7 +179,7 @@ func initTestnet(config *tmconfig.Config, cdc *codec.Codec) error { accs = append(accs, app.GenesisAccount{ Address: addr, - Amount: 10000000000000000, + Amount: 20000000000000000, }) msg := staking.NewMsgCreateValidator( diff --git a/types/coin/coins.go b/types/coin/coins.go index 426d20bd..399fdff3 100644 --- a/types/coin/coins.go +++ b/types/coin/coins.go @@ -1,5 +1,5 @@ package coin const ( - CYB = "сyb" + CYB = "cyb" ) diff --git a/x/bank/index.go b/x/bank/index.go index 5966e5f5..ee5cf889 100644 --- a/x/bank/index.go +++ b/x/bank/index.go @@ -23,9 +23,6 @@ type IndexedKeeper struct { func NewIndexedKeeper(keeper *Keeper, accKeeper auth.AccountKeeper) *IndexedKeeper { index := IndexedKeeper{Keeper: *keeper, accKeeper: accKeeper, accsToUpdate: make([]sdk.AccAddress, 0)} hook := func(ctx sdk.Context, from sdk.AccAddress, to sdk.AccAddress) { - if ctx.IsCheckTx() { - return - } if from != nil { index.accsToUpdate = append(index.accsToUpdate, from) } diff --git a/x/bank/keeper.go b/x/bank/keeper.go index 52004f14..bd6a880f 100644 --- a/x/bank/keeper.go +++ b/x/bank/keeper.go @@ -17,8 +17,8 @@ type Keeper struct { coinsTransferHooks []CoinsTransferHook } -func NewBankKeeper(ak auth.AccountKeeper, sk *staking.Keeper) Keeper { - return Keeper{ +func NewBankKeeper(ak auth.AccountKeeper, sk *staking.Keeper) *Keeper { + return &Keeper{ Keeper: bank.NewBaseKeeper(ak), ak: ak, sk: sk, From d23b9fbf28e0c14f942354536287acdd91fe5406 Mon Sep 17 00:00:00 2001 From: Artur Albov Date: Mon, 28 Jan 2019 21:43:18 +0700 Subject: [PATCH 16/38] #160 CI: Cyberd docker image building. Include genesis file --- Dockerfile | 26 ++++++++++++++++++++++---- start_script.sh | 10 +++++++++- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index 9b08b64b..51c34799 100644 --- a/Dockerfile +++ b/Dockerfile @@ -46,6 +46,8 @@ ENV GO_VERSION 1.11.2 ENV GO_ARCH 'linux-amd64' ENV GO_BIN_SHA '1dfe664fa3d8ad714bbd15a36627992effd150ddabd7523931f077b3926d736d' +ENV IPGET_VERSION 0.3.0 +ENV IPGET_ARCH 'linux-amd64' # Install required dev tools to install go ############################################################################### @@ -60,6 +62,25 @@ RUN url="https://golang.org/dl/go${GO_VERSION}.${GO_ARCH}.tar.gz" && \ tar -C /usr/local -xzf go.tgz &&\ rm go.tgz +# Download genesis file and links file from IPFS +############################################################################### +RUN url="https://dist.ipfs.io/ipget/v${IPGET_VERSION}/ipget_v${IPGET_VERSION}_${IPGET_ARCH}.tar.gz" && \ + wget -O ipget.tgz "$url" && \ + tar -xzf ipget.tgz && \ + rm ipget.tgz + +WORKDIR /ipget +RUN ls -la +#replace with valid IPFS hash +RUN ./ipget QmeeLUVdiSTTKQqhWqsffYDtNvvvcTfJdotkNyi1KDEJtQ -o /genesis.json +#replace with valid IPFS hash +RUN ./ipget QmeeLUVdiSTTKQqhWqsffYDtNvvvcTfJdotkNyi1KDEJtQ -o /links +#replace with valid IPFS hash +RUN ./ipget QmeeLUVdiSTTKQqhWqsffYDtNvvvcTfJdotkNyi1KDEJtQ -o /config.toml + +WORKDIR / + +RUN ls -l # Copy compiled kernel and binaries ############################################################################### @@ -69,11 +90,8 @@ COPY --from=build_stage /sources/cyberdcli /usr/bin/cyberdcli COPY --from=build_stage /usr/lib/cbdrank.h /usr/lib/cbdrank.h COPY --from=build_stage /usr/lib/libcbdrank.so /usr/lib/libcbdrank.so - -# Copy configs and startup scripts +# Copy startup scripts ############################################################################### -COPY ./testnet/genesis.json /genesis.json -COPY ./testnet/config.toml /config.toml COPY start_script.sh start_script.sh COPY entrypoint.sh /entrypoint.sh diff --git a/start_script.sh b/start_script.sh index 9f49fb49..0bfd49b7 100644 --- a/start_script.sh +++ b/start_script.sh @@ -1,3 +1,11 @@ #!/bin/sh -cyberd start +if [ -z "${COMPUTE_RANK_ON_GPU}" ] +then + COMPUTE_GPU=true +else + COMPUTE_GPU="${COMPUTE_RANK_ON_GPU}" +fi + +echo ${COMPUTE_GPU} +cyberd start --compute-rank-on-gpu=${COMPUTE_GPU} From 4c3737832dd16e72d6bd9037117e517bf1215d8b Mon Sep 17 00:00:00 2001 From: Artur Albov Date: Tue, 29 Jan 2019 11:56:30 +0700 Subject: [PATCH 17/38] #160 CI: Cyberd docker image building. Include genesis file. Remove ls --- Dockerfile | 3 --- 1 file changed, 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 51c34799..60f8d0c1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -70,7 +70,6 @@ RUN url="https://dist.ipfs.io/ipget/v${IPGET_VERSION}/ipget_v${IPGET_VERSION}_${ rm ipget.tgz WORKDIR /ipget -RUN ls -la #replace with valid IPFS hash RUN ./ipget QmeeLUVdiSTTKQqhWqsffYDtNvvvcTfJdotkNyi1KDEJtQ -o /genesis.json #replace with valid IPFS hash @@ -80,8 +79,6 @@ RUN ./ipget QmeeLUVdiSTTKQqhWqsffYDtNvvvcTfJdotkNyi1KDEJtQ -o /config.toml WORKDIR / -RUN ls -l - # Copy compiled kernel and binaries ############################################################################### COPY --from=build_stage /sources/cyberd /usr/bin/cyberd From 4d20c38a09204629a26534ef0468c4fd2896490e Mon Sep 17 00:00:00 2001 From: Artur Albov Date: Tue, 29 Jan 2019 15:25:16 +0700 Subject: [PATCH 18/38] #160 Add test files to IPFS --- Dockerfile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Dockerfile b/Dockerfile index 60f8d0c1..047cecdb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -70,12 +70,12 @@ RUN url="https://dist.ipfs.io/ipget/v${IPGET_VERSION}/ipget_v${IPGET_VERSION}_${ rm ipget.tgz WORKDIR /ipget -#replace with valid IPFS hash -RUN ./ipget QmeeLUVdiSTTKQqhWqsffYDtNvvvcTfJdotkNyi1KDEJtQ -o /genesis.json -#replace with valid IPFS hash -RUN ./ipget QmeeLUVdiSTTKQqhWqsffYDtNvvvcTfJdotkNyi1KDEJtQ -o /links -#replace with valid IPFS hash -RUN ./ipget QmeeLUVdiSTTKQqhWqsffYDtNvvvcTfJdotkNyi1KDEJtQ -o /config.toml +#replace with actual IPFS hash +RUN ./ipget Qmdxny6h8ntcMQjs9FH5F4YPXm6qTBBqBQ2fpgUy72U4bJ -o /genesis.json +#replace with actual IPFS hash +RUN ./ipget QmeupYarwzd7kZzg7faEXZZPPk5cbzbwC71YXJvTHFoUXe -o /links +#replace with actual IPFS hash +RUN ./ipget QmYUoLfMiXkgHsJicQmgLPUJCxf7t4DJKbQ4JBk1394CXT -o /config.toml WORKDIR / From 63efdb51ce7ae2fa0927627a56cadf166eb2ad4d Mon Sep 17 00:00:00 2001 From: Artur Albov Date: Tue, 29 Jan 2019 16:28:12 +0700 Subject: [PATCH 19/38] #216 Link msg bandwidth cost doesn't take into account links count --- types/errors.go | 7 +++++++ x/bandwidth/cost.go | 3 ++- x/link/msgs.go | 4 ++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/types/errors.go b/types/errors.go index f09d1f1f..a9bccdec 100644 --- a/types/errors.go +++ b/types/errors.go @@ -13,6 +13,7 @@ const ( CodeCidNotFound sdk.CodeType = 3 CodeNotEnoughBandwidth sdk.CodeType = 4 CodeDuplicatedLink sdk.CodeType = 5 + CodeZeroLinks sdk.CodeType = 6 // Code space CodespaceCbd sdk.CodespaceType = "cyberd" @@ -30,6 +31,8 @@ func codeToDefaultMsg(code sdk.CodeType) string { return "not enough bandwidth to make transaction" case CodeDuplicatedLink: return "duplicated link" + case CodeZeroLinks: + return "no links found" default: return fmt.Sprintf("unknown error: code %d", code) } @@ -54,6 +57,10 @@ func ErrDuplicatedLink() sdk.Error { return newError(CodespaceCbd, CodeDuplicatedLink) } +func ErrZeroLinks() sdk.Error { + return newError(CodespaceCbd, CodeZeroLinks) +} + func newError(codespace sdk.CodespaceType, code sdk.CodeType) sdk.Error { msg := codeToDefaultMsg(code) return sdk.NewError(codespace, code, msg) diff --git a/x/bandwidth/cost.go b/x/bandwidth/cost.go index 5c978c3f..43df3747 100644 --- a/x/bandwidth/cost.go +++ b/x/bandwidth/cost.go @@ -8,7 +8,8 @@ import ( func MsgBandwidthCosts(msg sdk.Msg) int64 { switch msg.(type) { case link.Msg: - return LinkMsgCost + linkMsg := msg.(link.Msg) + return int64(len(linkMsg.Links)) * LinkMsgCost default: return NonLinkMsgCost } diff --git a/x/link/msgs.go b/x/link/msgs.go index 390f8313..dbee81b1 100644 --- a/x/link/msgs.go +++ b/x/link/msgs.go @@ -29,6 +29,10 @@ func (msg Msg) ValidateBasic() sdk.Error { return sdk.ErrInvalidAddress(msg.Address.String()) } + if len(msg.Links) == 0 { + return cbd.ErrZeroLinks() + } + var filter = make(CidsFilter) for _, link := range msg.Links { From 51139bb0b84eca2da1a74d3e74042c0b5460d00d Mon Sep 17 00:00:00 2001 From: Artur Albov Date: Tue, 29 Jan 2019 16:42:55 +0700 Subject: [PATCH 20/38] Change config.toml hash --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 047cecdb..ae4b9521 100644 --- a/Dockerfile +++ b/Dockerfile @@ -75,7 +75,7 @@ RUN ./ipget Qmdxny6h8ntcMQjs9FH5F4YPXm6qTBBqBQ2fpgUy72U4bJ -o /genesis.json #replace with actual IPFS hash RUN ./ipget QmeupYarwzd7kZzg7faEXZZPPk5cbzbwC71YXJvTHFoUXe -o /links #replace with actual IPFS hash -RUN ./ipget QmYUoLfMiXkgHsJicQmgLPUJCxf7t4DJKbQ4JBk1394CXT -o /config.toml +RUN ./ipget QmdFQTmeUswfeDRsKw1MrqLmTapkV4sks1Q3ZtBVG8uec6 -o /config.toml WORKDIR / From d114d2afbc7bbf508cb8a5e8441fc3edfbbae3c4 Mon Sep 17 00:00:00 2001 From: Artur Albov Date: Tue, 29 Jan 2019 17:45:22 +0700 Subject: [PATCH 21/38] Fix docker entrypoint.sh --- entrypoint.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/entrypoint.sh b/entrypoint.sh index 96966008..b6d4b520 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -17,4 +17,9 @@ then cp /config.toml /root/.cyberd/config/ fi +if [ ! -f "/root/.cyberd/config/links" ] +then + cp /links /root/.cyberd/config/ +fi + exec "$@" \ No newline at end of file From 7e0b97f223828929653071d122f62bbb8d20e22a Mon Sep 17 00:00:00 2001 From: Hleb Albau Date: Wed, 30 Jan 2019 11:00:55 +0700 Subject: [PATCH 22/38] #215 Fix gentx commands. --- app/app.go | 2 +- app/export.go | 2 +- app/genesis.go | 28 ++++---- daemon/cmd/collect.go | 128 ------------------------------------ daemon/cmd/generate.go | 28 -------- daemon/cmd/generate_accs.go | 80 ---------------------- daemon/cmd/gentx.go | 99 ++++++++-------------------- daemon/cmd/init.go | 7 -- daemon/cmd/testnet.go | 49 ++++++++++++++ daemon/cmd/utils.go | 4 +- daemon/main.go | 2 - 11 files changed, 92 insertions(+), 337 deletions(-) delete mode 100644 daemon/cmd/collect.go delete mode 100644 daemon/cmd/generate.go delete mode 100644 daemon/cmd/generate_accs.go diff --git a/app/app.go b/app/app.go index 162bc799..52a6fa5a 100644 --- a/app/app.go +++ b/app/app.go @@ -240,7 +240,7 @@ func (app *CyberdApp) initChainer(ctx sdk.Context, req abci.RequestInitChain) ab // load the accounts for _, gacc := range genesisState.Accounts { acc := gacc.ToAccount() - acc.AccountNumber = app.accountKeeper.GetNextAccountNumber(ctx) + app.accountKeeper.GetNextAccountNumber(ctx) //increment for future accs being started from right number app.accountKeeper.SetAccount(ctx, acc) app.stakingIndex.UpdateStake(types.AccNumber(acc.AccountNumber), acc.Coins.AmountOf(coin.CYB).Int64()) } diff --git a/app/export.go b/app/export.go index 6c37d594..37f48f21 100644 --- a/app/export.go +++ b/app/export.go @@ -24,7 +24,7 @@ func (app *CyberdApp) ExportAppStateAndValidators() (appState json.RawMessage, v // iterate to get the accounts var accounts []GenesisAccount appendAccount := func(acc auth.Account) (stop bool) { - account := NewGenesisAccountI(acc) + account := NewGenesisAccount(acc) accounts = append(accounts, account) return false } diff --git a/app/genesis.go b/app/genesis.go index 288f0c43..3e0ff43c 100644 --- a/app/genesis.go +++ b/app/genesis.go @@ -54,29 +54,25 @@ func NewGenesisState( } type GenesisAccount struct { - Address sdk.AccAddress `json:"addr"` - Amount int64 `json:"amt"` + Address sdk.AccAddress `json:"addr"` + Amount int64 `json:"amt"` + AccNumber uint64 `json:"nmb"` } -func NewGenesisAccount(acc *auth.BaseAccount) GenesisAccount { +func NewGenesisAccount(acc auth.Account) GenesisAccount { return GenesisAccount{ - Address: acc.Address, - Amount: acc.Coins.AmountOf(coin.CYB).Int64(), - } -} - -func NewGenesisAccountI(acc auth.Account) GenesisAccount { - return GenesisAccount{ - Address: acc.GetAddress(), - Amount: acc.GetCoins().AmountOf(coin.CYB).Int64(), + Address: acc.GetAddress(), + Amount: acc.GetCoins().AmountOf(coin.CYB).Int64(), + AccNumber: acc.GetAccountNumber(), } } // convert GenesisAccount to auth.BaseAccount func (ga *GenesisAccount) ToAccount() (acc *auth.BaseAccount) { return &auth.BaseAccount{ - Address: ga.Address, - Coins: sdk.Coins{sdk.NewInt64Coin(coin.CYB, ga.Amount)}, + Address: ga.Address, + Coins: sdk.Coins{sdk.NewInt64Coin(coin.CYB, ga.Amount)}, + AccountNumber: ga.AccNumber, } } @@ -111,7 +107,7 @@ func NewDefaultGenesisState() GenesisState { }, SlashingData: slashing.DefaultGenesisState(), DistrData: distr.DefaultGenesisState(), - GenTxs: nil, + GenTxs: []json.RawMessage{}, } } @@ -154,7 +150,7 @@ func CyberdAppGenState(cdc *codec.Codec, genDoc tmtypes.GenesisDoc, appGenTxs [] return genesisState, nil } -// CyberdAppGenState but with JSON +//todo should be here? func CyberdAppGenStateJSON(cdc *codec.Codec, genDoc tmtypes.GenesisDoc, appGenTxs []json.RawMessage) ( appState json.RawMessage, err error) { // create the final app state diff --git a/daemon/cmd/collect.go b/daemon/cmd/collect.go deleted file mode 100644 index 47d3a3c1..00000000 --- a/daemon/cmd/collect.go +++ /dev/null @@ -1,128 +0,0 @@ -package cmd - -import ( - "encoding/json" - "fmt" - "github.com/cybercongress/cyberd/app" - "os" - "path/filepath" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/server" - "github.com/cosmos/cosmos-sdk/x/auth" - "github.com/spf13/cobra" - "github.com/spf13/viper" - cfg "github.com/tendermint/tendermint/config" - "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/libs/cli" - "github.com/tendermint/tendermint/types" -) - -type initConfig struct { - ChainID string - GenTxsDir string - Name string - NodeID string - ValPubKey crypto.PubKey -} - -// nolint -func CollectGenTxsCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "collect-gentxs", - Short: "Collect genesis txs and output a genesis.json file", - RunE: func(_ *cobra.Command, _ []string) error { - config := ctx.Config - config.SetRoot(viper.GetString(cli.HomeFlag)) - name := viper.GetString(client.FlagName) - - nodeID, valPubKey, err := InitializeNodeValidatorFiles(config) - if err != nil { - return err - } - - genDoc, err := loadGenesisDoc(cdc, config.GenesisFile()) - if err != nil { - return err - } - - toPrint := printInfo{ - Moniker: config.Moniker, - ChainID: genDoc.ChainID, - NodeID: nodeID, - } - - initCfg := initConfig{ - ChainID: genDoc.ChainID, - GenTxsDir: filepath.Join(config.RootDir, "config", "gentx"), - Name: name, - NodeID: nodeID, - ValPubKey: valPubKey, - } - - appMessage, err := genAppStateFromConfig(cdc, config, initCfg, genDoc) - if err != nil { - return err - } - - toPrint.AppMessage = appMessage - - // print out some key information - return displayInfo(cdc, toPrint) - }, - } - - cmd.Flags().String(cli.HomeFlag, app.DefaultNodeHome, "node's home directory") - return cmd -} - -// nolint: errcheck -func displayInfo(cdc *codec.Codec, info printInfo) error { - out, err := codec.MarshalJSONIndent(cdc, info) - if err != nil { - return err - } - _, _ = fmt.Fprintf(os.Stderr, "%s\n", string(out)) - return nil -} - -func genAppStateFromConfig( - cdc *codec.Codec, config *cfg.Config, initCfg initConfig, genDoc types.GenesisDoc, -) (appState json.RawMessage, err error) { - - genFile := config.GenesisFile() - var ( - appGenTxs []auth.StdTx - persistentPeers string - genTxs []json.RawMessage - jsonRawTx json.RawMessage - ) - - // process genesis transactions, else create default genesis.json - appGenTxs, persistentPeers, err = collectStdTxs(cdc, config.Moniker, initCfg.GenTxsDir, genDoc) - if err != nil { - return - } - - genTxs = make([]json.RawMessage, len(appGenTxs)) - config.P2P.PersistentPeers = persistentPeers - - for i, stdTx := range appGenTxs { - jsonRawTx, err = cdc.MarshalJSON(stdTx) - if err != nil { - return - } - genTxs[i] = jsonRawTx - } - - cfg.WriteConfigFile(filepath.Join(config.RootDir, "config", "config.toml"), config) - - appState, err = app.CyberdAppGenStateJSON(cdc, genDoc, genTxs) - if err != nil { - return - } - - err = ExportGenesisFile(genFile, initCfg.ChainID, nil, appState) - return -} diff --git a/daemon/cmd/generate.go b/daemon/cmd/generate.go deleted file mode 100644 index b69c3410..00000000 --- a/daemon/cmd/generate.go +++ /dev/null @@ -1,28 +0,0 @@ -package cmd - -import ( - "fmt" - "github.com/cosmos/cosmos-sdk/server" - "github.com/spf13/cobra" -) - -func GenerateAccountCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "generate-account", - Short: "Generate account", - RunE: func(_ *cobra.Command, args []string) error { - - addr, seed, err := server.GenerateCoinKey() - if err != nil { - return err - } - - fmt.Println("Address: ", addr.String()) - fmt.Println("Seed phrase: ", seed) - - return nil - }, - } - - return cmd -} diff --git a/daemon/cmd/generate_accs.go b/daemon/cmd/generate_accs.go deleted file mode 100644 index 4c4272aa..00000000 --- a/daemon/cmd/generate_accs.go +++ /dev/null @@ -1,80 +0,0 @@ -package cmd - -import ( - "fmt" - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/go-bip39" - "github.com/cybercongress/cyberd/app" - "sync" - - "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/server" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/spf13/cobra" - "github.com/spf13/viper" - "github.com/tendermint/tendermint/libs/cli" - "github.com/tendermint/tendermint/libs/common" -) - -// Used for development purposes. -// Takes about 4min to generated 250kk genesis accs. -func GenerateAccountsCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "add-random-genesis-accounts [count]", - Short: "Add randoms accounts to genesis.json. Used to populate tests chain during performance testing.", - Args: cobra.ExactArgs(1), - RunE: func(_ *cobra.Command, args []string) error { - - config := ctx.Config - config.SetRoot(viper.GetString(cli.HomeFlag)) - - count, ok := sdk.NewIntFromString(args[0]) - if !ok { - return fmt.Errorf("failed to parse accs count: %s", args[0]) - } - - genFile := config.GenesisFile() - if !common.FileExists(genFile) { - return fmt.Errorf("%s does not exist, run `cyberd init` first", genFile) - } - - genDoc, err := loadGenesisDoc(cdc, genFile) - if err != nil { - return err - } - - var appState app.GenesisState - if err = cdc.UnmarshalJSON(genDoc.AppState, &appState); err != nil { - return err - } - - amount := int64(10) - kb := client.MockKeyBase() - addresses := make([]app.GenesisAccount, count.Int64()) - - var wg sync.WaitGroup - wg.Add(int(count.Int64())) - for i := int64(0); i < count.Int64(); i++ { - go func(position int64) { - defer wg.Done() - entropySeed, _ := bip39.NewEntropy(256) - mnemonic, _ := bip39.NewMnemonic(entropySeed[:]) - info, _ := kb.CreateKey(string(position), mnemonic, "") - addresses[position] = app.GenesisAccount{Address: info.GetAddress(), Amount: amount} - }(i) - } - wg.Wait() - - appState.Accounts = append(appState.Accounts, addresses...) - appStateJSON, err := cdc.MarshalJSON(appState) - if err != nil { - return err - } - - return ExportGenesisFile(genFile, genDoc.ChainID, nil, appStateJSON) - }, - } - - cmd.Flags().String(cli.HomeFlag, app.DefaultNodeHome, "node's home directory") - return cmd -} diff --git a/daemon/cmd/gentx.go b/daemon/cmd/gentx.go index dc9ff8a1..792dbf90 100644 --- a/daemon/cmd/gentx.go +++ b/daemon/cmd/gentx.go @@ -2,35 +2,31 @@ package cmd import ( "bytes" + "encoding/json" "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - + "github.com/cybercongress/cyberd/app" "github.com/spf13/cobra" "github.com/spf13/viper" - - cfg "github.com/tendermint/tendermint/config" - "github.com/tendermint/tendermint/crypto" - tmcli "github.com/tendermint/tendermint/libs/cli" - "github.com/tendermint/tendermint/libs/common" + "io" + "io/ioutil" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/context" "github.com/cosmos/cosmos-sdk/client/keys" "github.com/cosmos/cosmos-sdk/client/utils" - "github.com/cosmos/cosmos-sdk/cmd/gaia/app" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/server" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth" authtxb "github.com/cosmos/cosmos-sdk/x/auth/client/txbuilder" "github.com/cosmos/cosmos-sdk/x/staking/client/cli" + cfg "github.com/tendermint/tendermint/config" + "github.com/tendermint/tendermint/crypto" + tmcli "github.com/tendermint/tendermint/libs/cli" ) const ( - defaultAmount = "100CBD" + defaultAmount = "100cyb" defaultCommissionRate = "0.1" defaultCommissionMaxRate = "0.2" defaultCommissionMaxChangeRate = "0.01" @@ -41,7 +37,7 @@ const ( func GenTxCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command { cmd := &cobra.Command{ Use: "gentx", - Short: "Generate a genesis tx carrying a self delegation", + Short: "Generate a genesis tx carrying a self delegation and add it to genesis.json", Long: fmt.Sprintf(`This command is an alias of the 'cyberdcli create-validator' command'. It creates a genesis piece carrying a self delegation with the @@ -65,16 +61,11 @@ following delegation and commission default parameters: return err } - genDoc, err := loadGenesisDoc(cdc, config.GenesisFile()) + doc, state, err := loadGenesisState(ctx, cdc) if err != nil { return err } - genesisState := app.GenesisState{} - if err = cdc.UnmarshalJSON(genDoc.AppState, &genesisState); err != nil { - return err - } - kb, err := keys.GetKeyBaseFromDir(viper.GetString(flagClientHome)) if err != nil { return err @@ -94,20 +85,8 @@ following delegation and commission default parameters: } } - var chainId string - - if id := viper.GetString(client.FlagChainID); id != "" { - chainId = id - } else { - genDoc, err := loadGenesisDoc(cdc, config.GenesisFile()) - if err != nil { - return err - } - chainId = genDoc.ChainID - } - // Set flags for creating gentx - prepareFlagsForTxCreateValidator(config, nodeID, ip, chainId, valPubKey) + prepareFlagsForTxCreateValidator(config, nodeID, ip, doc.ChainID, valPubKey) // Fetch the amount of coins staked amount := viper.GetString(cli.FlagAmount) @@ -116,7 +95,7 @@ following delegation and commission default parameters: return err } - err = accountInGenesis(genesisState, key.GetAddress(), coins) + err = accountInGenesis(state, key.GetAddress(), coins) if err != nil { return err } @@ -147,21 +126,21 @@ following delegation and commission default parameters: return err } - // Fetch output file name - outputDocument := viper.GetString(client.FlagOutputDocument) - if outputDocument == "" { - outputDocument, err = makeOutputFilepath(config.RootDir, nodeID) - if err != nil { - return err - } + txAsJson, err := cdc.MarshalJSON(signedTx) + if err != nil { + return err } - if err := writeSignedGenTx(cdc, outputDocument, signedTx); err != nil { + if len(state.GenTxs) == 0 { + state.GenTxs = []json.RawMessage{} + } + state.GenTxs = append(state.GenTxs, txAsJson) + stateJson, err := app.CyberdAppGenStateJSON(cdc, doc, state.GenTxs) + if err != nil { return err } - fmt.Fprintf(os.Stderr, "Genesis transaction written to %q\n", outputDocument) - return nil + return ExportGenesisFile(config.GenesisFile(), doc.ChainID, doc.Validators, stateJson) }, } @@ -170,29 +149,28 @@ following delegation and commission default parameters: cmd.Flags().String(client.FlagName, "", "name of private key with which to sign the gentx") cmd.Flags().String(client.FlagOutputDocument, "", "write the genesis transaction JSON document to the given file instead of the default location") - cmd.Flags().String(client.FlagChainID, "euler-dev", "current chain-id") - cmd.Flags().String(cli.FlagMoniker, "anonymous", "validator display name") + cmd.Flags().String(cli.FlagMoniker, "", "validator display name") cmd.Flags().AddFlagSet(cli.FsCommissionCreate) cmd.Flags().AddFlagSet(cli.FsAmount) cmd.Flags().AddFlagSet(cli.FsPk) cmd.MarkFlagRequired(client.FlagName) + cmd.MarkFlagRequired(cli.FlagMoniker) return cmd } func accountInGenesis(genesisState app.GenesisState, key sdk.AccAddress, coins sdk.Coins) error { + accountIsInGenesis := false bondDenom := genesisState.StakingData.Params.BondDenom - // Check if the account is in genesis for _, acc := range genesisState.Accounts { - // Ensure that account is in genesis if acc.Address.Equals(key) { // Ensure account contains enough funds of default bond denom - if coins.AmountOf(bondDenom).GT(acc.Coins.AmountOf(bondDenom)) { + if coins.AmountOf(bondDenom).GT(sdk.NewInt(acc.Amount)) { return fmt.Errorf( "account %v is in genesis, but it only has %v%v available to stake, not %v%v", - key.String(), acc.Coins.AmountOf(bondDenom), bondDenom, coins.AmountOf(bondDenom), bondDenom, + key.String(), acc.Amount, bondDenom, coins.AmountOf(bondDenom), bondDenom, ) } accountIsInGenesis = true @@ -234,14 +212,6 @@ func prepareFlagsForTxCreateValidator(config *cfg.Config, nodeID, ip, chainID st } } -func makeOutputFilepath(rootDir, nodeID string) (string, error) { - writePath := filepath.Join(rootDir, "config", "gentx") - if err := common.EnsureDir(writePath, 0700); err != nil { - return "", err - } - return filepath.Join(writePath, fmt.Sprintf("gentx-%v.json", nodeID)), nil -} - func readUnsignedGenTxFile(cdc *codec.Codec, r io.Reader) (auth.StdTx, error) { var stdTx auth.StdTx bytes, err := ioutil.ReadAll(r) @@ -251,18 +221,3 @@ func readUnsignedGenTxFile(cdc *codec.Codec, r io.Reader) (auth.StdTx, error) { err = cdc.UnmarshalJSON(bytes, &stdTx) return stdTx, err } - -// nolint: errcheck -func writeSignedGenTx(cdc *codec.Codec, outputDocument string, tx auth.StdTx) error { - outputFile, err := os.OpenFile(outputDocument, os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0644) - if err != nil { - return err - } - defer outputFile.Close() - json, err := cdc.MarshalJSON(tx) - if err != nil { - return err - } - _, err = fmt.Fprintf(outputFile, "%s\n", json) - return err -} diff --git a/daemon/cmd/init.go b/daemon/cmd/init.go index 48175bc9..8f512d15 100644 --- a/daemon/cmd/init.go +++ b/daemon/cmd/init.go @@ -22,13 +22,6 @@ const ( flagMoniker = "moniker" ) -type printInfo struct { - Moniker string `json:"moniker"` - ChainID string `json:"chain_id"` - NodeID string `json:"node_id"` - AppMessage json.RawMessage `json:"app_message"` -} - // get cmd to initialize all files for tendermint and application // nolint func InitCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command { diff --git a/daemon/cmd/testnet.go b/daemon/cmd/testnet.go index 913e0060..79a238fc 100644 --- a/daemon/cmd/testnet.go +++ b/daemon/cmd/testnet.go @@ -17,6 +17,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/staking" "github.com/spf13/cobra" "github.com/spf13/viper" + cfg "github.com/tendermint/tendermint/config" tmconfig "github.com/tendermint/tendermint/config" "github.com/tendermint/tendermint/crypto" cmn "github.com/tendermint/tendermint/libs/common" @@ -35,6 +36,14 @@ var ( flagStartingIPAddress = "starting-ip-address" ) +type initConfig struct { + ChainID string + GenTxsDir string + Name string + NodeID string + ValPubKey crypto.PubKey +} + const nodeDirPerm = 0755 // get cmd to initialize all files for tendermint testnet and application @@ -361,3 +370,43 @@ func calculateIP(ip string, i int) (string, error) { return ipv4.String(), nil } + +func genAppStateFromConfig( + cdc *codec.Codec, config *cfg.Config, initCfg initConfig, genDoc types.GenesisDoc, +) (appState json.RawMessage, err error) { + + genFile := config.GenesisFile() + var ( + appGenTxs []auth.StdTx + persistentPeers string + genTxs []json.RawMessage + jsonRawTx json.RawMessage + ) + + // process genesis transactions, else create default genesis.json + appGenTxs, persistentPeers, err = collectStdTxs(cdc, config.Moniker, initCfg.GenTxsDir, genDoc) + if err != nil { + return + } + + genTxs = make([]json.RawMessage, len(appGenTxs)) + config.P2P.PersistentPeers = persistentPeers + + for i, stdTx := range appGenTxs { + jsonRawTx, err = cdc.MarshalJSON(stdTx) + if err != nil { + return + } + genTxs[i] = jsonRawTx + } + + cfg.WriteConfigFile(filepath.Join(config.RootDir, "config", "config.toml"), config) + + appState, err = app.CyberdAppGenStateJSON(cdc, genDoc, genTxs) + if err != nil { + return + } + + err = ExportGenesisFile(genFile, initCfg.ChainID, nil, appState) + return +} diff --git a/daemon/cmd/utils.go b/daemon/cmd/utils.go index 87aba7f9..2c7afcac 100644 --- a/daemon/cmd/utils.go +++ b/daemon/cmd/utils.go @@ -123,12 +123,12 @@ func saveGenesisState(ctx *server.Context, cdc *codec.Codec, oldDoc tmtypes.Gene config.SetRoot(viper.GetString(cli.HomeFlag)) genFile := config.GenesisFile() - appStateJSON, err := cdc.MarshalJSON(state) + appStateJSON, err := cdc.MarshalJSON(&state) if err != nil { return err } - return ExportGenesisFile(genFile, oldDoc.ChainID, nil, appStateJSON) + return ExportGenesisFile(genFile, oldDoc.ChainID, oldDoc.Validators, appStateJSON) } func loadGenesisDoc(cdc *amino.Codec, genFile string) (genDoc tmtypes.GenesisDoc, err error) { diff --git a/daemon/main.go b/daemon/main.go index 379b5978..9cb4e80e 100644 --- a/daemon/main.go +++ b/daemon/main.go @@ -44,8 +44,6 @@ func main() { } rootCmd.AddCommand(cmd.InitCmd(ctx, cdc)) - rootCmd.AddCommand(cmd.GenerateAccountsCmd(ctx, cdc)) - rootCmd.AddCommand(cmd.CollectGenTxsCmd(ctx, cdc)) rootCmd.AddCommand(cmd.TestnetFilesCmd(ctx, cdc)) rootCmd.AddCommand(cmd.GenTxCmd(ctx, cdc)) rootCmd.AddCommand(cmd.AddGenesisAccountCmd(ctx, cdc)) From 99ef2f5403f295e6280341d79afaac556ff8d7f7 Mon Sep 17 00:00:00 2001 From: Artur Albov Date: Wed, 30 Jan 2019 13:02:02 +0700 Subject: [PATCH 23/38] Change devnet genesis files in Dockerfile --- Dockerfile | 4 ++-- x/link/types/link.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index ae4b9521..47a69cb6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -71,11 +71,11 @@ RUN url="https://dist.ipfs.io/ipget/v${IPGET_VERSION}/ipget_v${IPGET_VERSION}_${ WORKDIR /ipget #replace with actual IPFS hash -RUN ./ipget Qmdxny6h8ntcMQjs9FH5F4YPXm6qTBBqBQ2fpgUy72U4bJ -o /genesis.json +RUN ./ipget QmPjZEUtksM8wvynVYVWXhGJJVKXKKgMCjXVtwFvRkaYhM -o /genesis.json #replace with actual IPFS hash RUN ./ipget QmeupYarwzd7kZzg7faEXZZPPk5cbzbwC71YXJvTHFoUXe -o /links #replace with actual IPFS hash -RUN ./ipget QmdFQTmeUswfeDRsKw1MrqLmTapkV4sks1Q3ZtBVG8uec6 -o /config.toml +RUN ./ipget QmdTSB3GNUyshDYSZuno1BhpjtkXqdbdCJ7wXyB66TuBYv -o /config.toml WORKDIR / diff --git a/x/link/types/link.go b/x/link/types/link.go index 8cbc3039..c6844f27 100644 --- a/x/link/types/link.go +++ b/x/link/types/link.go @@ -6,8 +6,8 @@ import ( ) type Link struct { - From Cid - To Cid + From Cid `json:"from"` + To Cid `json:"to"` } type CompactLink struct { From 2b9116fd441584f93fa12a8e4b21a600c5eda7e3 Mon Sep 17 00:00:00 2001 From: Artur Albov Date: Wed, 30 Jan 2019 13:06:25 +0700 Subject: [PATCH 24/38] Change chain-id --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 47a69cb6..1af4d5c2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -71,7 +71,7 @@ RUN url="https://dist.ipfs.io/ipget/v${IPGET_VERSION}/ipget_v${IPGET_VERSION}_${ WORKDIR /ipget #replace with actual IPFS hash -RUN ./ipget QmPjZEUtksM8wvynVYVWXhGJJVKXKKgMCjXVtwFvRkaYhM -o /genesis.json +RUN ./ipget QmWL1fbriKgjqQ9bKr5hDAdif1aw2o8Dq2r34rh3FrBQB7 -o /genesis.json #replace with actual IPFS hash RUN ./ipget QmeupYarwzd7kZzg7faEXZZPPk5cbzbwC71YXJvTHFoUXe -o /links #replace with actual IPFS hash From c0bca46a6dc14bd78921ef57dac3939b5b973969 Mon Sep 17 00:00:00 2001 From: Hleb Albau Date: Wed, 30 Jan 2019 13:07:09 +0700 Subject: [PATCH 25/38] #215 Fix pou distribution uses share not percentage --- daemon/cmd/generate_genesis_file.go | 42 ++++++++++++++------- daemon/cmd/genesis.go | 57 ++++++++++++++++++++++++++--- 2 files changed, 79 insertions(+), 20 deletions(-) diff --git a/daemon/cmd/generate_genesis_file.go b/daemon/cmd/generate_genesis_file.go index 96b055f0..c6c2dee5 100644 --- a/daemon/cmd/generate_genesis_file.go +++ b/daemon/cmd/generate_genesis_file.go @@ -30,7 +30,7 @@ func GenerateEulerGenesisFileCmd(ctx *server.Context, cdc *codec.Codec) *cobra.C RunE: func(_ *cobra.Command, args []string) error { // proof of use accs - pouAccs, err := readPouAccounts() + pouAccs, err := getPouGenesisAccounts() if err != nil { return err } @@ -75,12 +75,12 @@ func GenerateEulerGenesisFileCmd(ctx *server.Context, cdc *codec.Codec) *cobra.C return cmd } -func readPouAccounts() ([]app.GenesisAccount, error) { - - accs := make([]app.GenesisAccount, 0) +func readPouAccounts() ([]sdk.AccAddress, []float64, error) { + accs := make([]sdk.AccAddress, 0) + shares := make([]float64, 0) pocFile, err := os.Open("/home/hlb/.cyberd/proof-of-code") if err != nil { - return nil, err + return accs, shares, err } reader := csv.NewReader(bufio.NewReader(pocFile)) @@ -92,26 +92,40 @@ func readPouAccounts() ([]app.GenesisAccount, error) { if err == io.EOF { break } else if err != nil { - return nil, err + return accs, shares, err } accAddress, err := sdk.AccAddressFromBech32(line[0]) if err != nil { - return nil, err + return accs, shares, err } - accAmtPercent, err := strconv.ParseFloat(line[1], 64) + accShare, err := strconv.ParseFloat(line[1], 64) if err != nil { - return nil, err + return accs, shares, err } + accs = append(accs, accAddress) + shares = append(shares, accShare) + } - accs = append(accs, app.GenesisAccount{ - Address: accAddress, - Amount: amt(accAmtPercent), - }) + return accs, shares, nil +} + +func getPouGenesisAccounts() ([]app.GenesisAccount, error) { + + gacc := make([]app.GenesisAccount, 0) + accs, shares, err := readPouAccounts() + if err != nil { + return gacc, err } - return accs, nil + for i := range accs { + gacc = append(gacc, app.GenesisAccount{ + Address: accs[i], + Amount: pouPercentageToAmt(shares[i]), + }) + } + return gacc, nil } // Returns all, except genesis poc accs diff --git a/daemon/cmd/genesis.go b/daemon/cmd/genesis.go index 38bb5f18..15d0b56d 100644 --- a/daemon/cmd/genesis.go +++ b/daemon/cmd/genesis.go @@ -8,7 +8,6 @@ import ( "github.com/cybercongress/cyberd/app" cbd "github.com/cybercongress/cyberd/types" "github.com/spf13/cobra" - "strconv" ) func GenesisCmds(ctx *server.Context, cdc *codec.Codec) *cobra.Command { @@ -36,6 +35,24 @@ const pouFileCoefficient float64 = 0.7 // means 70% const tokensToBurnPercentage float64 = 11.8000 // 0x3b6ce0d5fd5f6de16fb6b687207efe86702a6e76 const proofOfUsePercentage float64 = 70.0000 // 0xccf0e5a05bf5c0fb7c2d91737b176b4a2d2fd7f0 +var pocvEulerAccs = map[string]float64{ + "cbd1f9yjqmxh6prsmgpcaqj8lmjnxg644n50qjl4vw": 8.288000001, // 0x9f4062f6153ff4dbf93f6a6f686ed3c906bf0684 + "cbd1hlu0kqwvxmhjjsezr00jdrvs2k537mqhrv02ja": 3.045611111, // 0x7c4401ae98f12ef6de39ae24cf9fc51f80eba16b + "cbd1myeyqp96pz3tayjdctflrxpwf45dq3xyj56yk0": 2.1153, // 0xf2cb7985a5c3fdd8d7742a73d5dc001bbd32caf8 + "cbd1gannk6qt3s5mnm5smx6xjqqvecu08666hpazlz": 1.5328, // 0x002f9caf40a444f20813da783d152bdfaf42852f + "cbd1sjedcfmqupxcnxudq9w0rxrf87r3c6tvep5fnj": 1.428, // 0x00b8fe1a1a2b899418702e32a96e276ff56a4d05 + "cbd1ch4dpd8jxkl7w4wnzdx02utmw4j0xatfks6ulv": 1, // 0x8b788b444ca3203bba0fdcae1c482110494e81f1 + "cbd1s3748ghvcwvrws3kxsdc8xnan3qhv77740gnnl": 0.568211111, // 0x00cff8cf7bff03a9a2a81c01920ffd8cfa7ae9d0 + "cbd14d92r4svhl4qa3g6q48tjekarw2kt67njlaeht": 0.083811111, // 0x63e65bc441334b27d2178f81f2d701e4e58c158a + "cbd1up7dk03v4d898vqgmc2y32y7duuylgx8ra7jjj": 0.043511111, // 0x9d7d6e753f055e40d3767337300e722e934086c1 + "cbd1rqudjcrdwqedffxufmqgsleuguhm7pka6snns3": 0.028, // 0x00725d89a2a2fb3b21fd1035b579cbcde4a0991b + "cbd1hmkqhy8ygl6tnl5g8tc503rwrmmrkjcqtqrsx6": 0.023311111, // 0x00ca47db1be92c1072e973fd8dc4a082f7d70214 + "cbd1gs92s58t6rkallnml8ufdzrz3038dcylal0nlc": 0.023311111, // 0x4585c7eaa2cb96d4b59e868929efabeeb8e65b07 + "cbd1h7u5zvduvc3dqrfq9hejm35ktfxh3ha7fra64a": 0.0132800000000000911111, // 0x002b9c5b537a1b6004ed720f32cc808fd6210f26 + "cbd1rl3xnsrkpjfwejqfy7v4kntu64hzxy8dgafh6j": 0.003111111, // 0x00d3c9033570b8adea9c18780325a45635c55805 + "cbd1xege0g92p6exmzjv58u7vh3s5zkz75v48mlnev": 0.003111111, // 0x5d01f31f6eda95489ca1e3c6357a9627fa2983de +} + var pocvAccs = map[string]float64{ "cyber1f9yjqmxh6prsmgpcaqj8lmjnxg644n5074zznm": 8.288000001, // 0x9f4062f6153ff4dbf93f6a6f686ed3c906bf0684 "cyber1hlu0kqwvxmhjjsezr00jdrvs2k537mqhatjadg": 3.045611111, // 0x7c4401ae98f12ef6de39ae24cf9fc51f80eba16b @@ -77,24 +94,48 @@ func AddMissingEulerTokensCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Comm Use: "add-missing-euler-tokens", RunE: func(cmd *cobra.Command, args []string) error { + fmt.Println("") + fmt.Println("Fixing euler 0.1.0 network genesis distribution") + + sdk.GetConfig().SetBech32PrefixForAccount("cbd", "cbdpub") + sdk.GetConfig().SetBech32PrefixForValidator("cbdvaloper", "cbdvaloperpub") + sdk.GetConfig().SetBech32PrefixForConsensusNode("cbdvalcons", "cbdvalconspub") doc, state, err := loadGenesisState(ctx, cdc) if err != nil { return err } addrWithMissingTokens := make(map[string]int64, len(state.Accounts)) - for pocvAddr, percentage := range pocvAccs { - addrWithMissingTokens[pocvAddr] = percentageToAmt(percentage) - pouPercentageToAmt(percentage) + //pocv accs + totalPocvAddition := int64(0) + for pocvAddr, percentage := range pocvEulerAccs { + tokensToAdd := percentageToAmt(percentage) - pouPercentageToAmt(percentage) + totalPocvAddition += tokensToAdd + addrWithMissingTokens[pocvAddr] += tokensToAdd + } + fmt.Printf("%v added to pocv\n", totalPocvAddition) + + //pou accs + totalPouAddition := int64(0) + pouEulerAccs, shares, err := readPouAccounts() + if err != nil { + return err } + for i := range pouEulerAccs { + tokensToAdd := pouShareToAmt(shares[i]) - pouPercentageToAmt(shares[i]) + totalPouAddition += tokensToAdd + addrWithMissingTokens[pouEulerAccs[i].String()] += tokensToAdd + } + fmt.Printf("%v added to pou\n", totalPouAddition) + + // burn addr acc addrWithMissingTokens[cbd.GetBurnAddress().String()] = percentageToAmt(tokensToBurnPercentage) - fmt.Println("") - fmt.Println("Fixing euler 0.1.0 network genesis distribution") + // add tokens for accIndex, acc := range state.Accounts { tokensToAdd, ok := addrWithMissingTokens[acc.Address.String()] if ok { acc.Amount += tokensToAdd - fmt.Println(strconv.Itoa(int(tokensToAdd)) + " tokens added to " + acc.Address.String()) delete(addrWithMissingTokens, acc.Address.String()) state.Accounts[accIndex] = acc } @@ -147,6 +188,10 @@ func pouPercentageToAmt(pouPercentage float64) int64 { return int64(pouPercentage / 100 * pouFileCoefficient * float64(genesisSupply)) } +func pouShareToAmt(share float64) int64 { + return int64(share * pouFileCoefficient * float64(genesisSupply)) +} + func percentageToAmt(percentage float64) int64 { return int64(percentage / 100 * float64(genesisSupply)) } From b182cbca04943b99fe8a2de7ad2962c4f065189e Mon Sep 17 00:00:00 2001 From: Artur Albov Date: Wed, 30 Jan 2019 14:05:16 +0700 Subject: [PATCH 26/38] Fix genesis file --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 1af4d5c2..19877b6c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -71,7 +71,7 @@ RUN url="https://dist.ipfs.io/ipget/v${IPGET_VERSION}/ipget_v${IPGET_VERSION}_${ WORKDIR /ipget #replace with actual IPFS hash -RUN ./ipget QmWL1fbriKgjqQ9bKr5hDAdif1aw2o8Dq2r34rh3FrBQB7 -o /genesis.json +RUN ./ipget QmNjMpRMyw98rKtQWQXNEFC5sfCsXqpB9GA6dMz7QschLz -o /genesis.json #replace with actual IPFS hash RUN ./ipget QmeupYarwzd7kZzg7faEXZZPPk5cbzbwC71YXJvTHFoUXe -o /links #replace with actual IPFS hash From 84ae0c97155145c4b275b619fde686474b40914e Mon Sep 17 00:00:00 2001 From: Hleb Albau Date: Sat, 26 Jan 2019 22:50:58 +0700 Subject: [PATCH 27/38] #201 Setup 0.1.1 chain params for staking, distr, slashing, mint modules. --- docs/overview.md | 100 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 docs/overview.md diff --git a/docs/overview.md b/docs/overview.md new file mode 100644 index 00000000..c66159ba --- /dev/null +++ b/docs/overview.md @@ -0,0 +1,100 @@ +# ://cyber staking and distribution overview + +## Params + +//todo consider: +// Consensus.BlockTime +// Consensus.MaxBytes +// Staking.UnbondingTime && Slashing.MaxEvidenceAge +// Distr.BaseProposerReward +// Distr.BonusProposerReward +// Slashing.SignedBlocksWindow +// Slashing.MinSignedPerWindow + +| Module | Param | Value | Comment | +|-------------|---------------|---------------|-----------------------------------------| +| Staking | UnbondingTime | 3 weeks | time duration of unbonding | +| Staking | MaxValidators | 100 | maximum number of active validators set | +| Staking | MaxEntries | 7 | max entries for either unbonding delegation or redelegation per delegator/validator pair(delegator/validator/validator for redelegation)| +| | | | | +| Consensus | BlockTime | 5s | average block generation time | +| Consensus | MaxBytes | 1mb | block max bytes limit | +| Consensus | RankCalcWindow | 600 | full rank recalculation window | +| | | | | +| Distr | CommunityTax | 0% | community funding tax, not used | +| Distr | BaseProposerReward | 1% | % of block inflation goes to proposer | +| Distr | BonusProposerReward | 4% | addition reward, calculated as % of included votes from validators set | +| | | | | +| Slashing | MaxEvidenceAge | 3weeks | misbehaviour evidence max age | +| Slashing | SignedBlocksWindow | 900 | window to calculate validators liveness | +| Slashing | MinSignedPerWindow | 5% | min singed block for window to not be jailed | +| Slashing | DowntimeJailDuration | 0 | unjail delay | +| Slashing | SlashFractionDoubleSign | 20% | % of stake reduction for double sign | +| Slashing | SlashFractionDowntime | 0% | % of stake reduction for being offline | +| | | | | +| Mint | BlockInflation | 0.317097920 Gcyb | validators block rewards | + + + +## Staking + +The cyberd is a public Proof-Of-Stake (PoS) blockchain, + meaning that validator's weight is determined by the amount of staking tokens bonded as collateral. + These tokens can be staked directly by the validator or delegated to them by token holders. + The weight (i.e. total stake) of a validator determines whether or not it is an active validator, + and also how frequently this node will have to propose a block and how much revenue it will obtain. + +### Validator + +Any user in the system can declare its intention to become a validator by sending a create-validator transaction. + From there, they become validators. + Validator can set **commission**, that applied on revenue before it is distributed to their delegators. + +Each validator holds: +- All bounded tokens(self and delegators). NOTE: not include distribution rewards. +- Own distribution rewards (commission rewards) +- Delegators distribution rewards +- All delegators shares. Share is not mapped 1-to-1 to tokens. + In a case a validator being punished for misbehaviour, bounded tokens will be reduced, while shares remain a same. + +### Delegation + +Delegators are token holders who cannot, or do not want to run validator operations themselves. + A user can delegate tokens to a validator and obtain a part of its revenue in exchange. + Upon delegation a user converts his tokens to validator shares in a rate `val_tokens/val_shares`. + +### Undelegation + +A user may want to cancel delegation to specific validator. To do so, he/she send **undelegate** transaction. + Depending on current validator state, either user receive his revenue proportion and bounded tokens back immediately + (for unbonded validator), or just start process of undelegation. + If a validator is in unbonding state, than a user will receive tokens at a validator unbonding time. + In last case, a user will wait full **UnbondingTime** period. + +## Slashing + +If validators double sign, are frequently offline or do not participate in governance, +their staked tokens (including tokens of users that delegated to them) can be destroyed, or 'slashed'. + +At the beginning of each block, we update the signing info for each validator and + check if they've dipped below the liveness threshold **MinSignedPerWindow** + over the tracked window **SignedBlocksWindow**. + If so, their stake will be slashed by **SlashFractionDowntime** percentage and + will be Jailed for **DowntimeJailDuration**. + +## Distribution + +All minted tokens goes to fees pool. + At each **beginblock**, the fees received on previous block are allocated to the proposer, community fund, + and previous block active validators set according to next scheme: + +1. When the validator is the proposer of the round, that validator (and their delegators) + receives between **BaseProposerReward** and **BonusProposerReward** of fee rewards. + The amount of proposer reward is calculated from pre-commits Tendermint messages + in order to incentives validators to wait and include additional pre-commits in the block. + +2. Community tax is then charged from full fees. + +3. The remainder is distributed proportionally by voting power + to all bonded validators(and their delegators) independent of whether they voted (social distribution). + \ No newline at end of file From 37cc1ca0fb92bbaa475865f2da66d74e2714f28e Mon Sep 17 00:00:00 2001 From: Hleb Albau Date: Sat, 26 Jan 2019 23:05:26 +0700 Subject: [PATCH 28/38] #201 Setup 0.1.1 chain params for staking, distr, slashing, mint modules. --- docs/overview.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/overview.md b/docs/overview.md index c66159ba..ba719856 100644 --- a/docs/overview.md +++ b/docs/overview.md @@ -19,7 +19,7 @@ | | | | | | Consensus | BlockTime | 5s | average block generation time | | Consensus | MaxBytes | 1mb | block max bytes limit | -| Consensus | RankCalcWindow | 600 | full rank recalculation window | +| Consensus | RankCalcWindow | 100 | full rank recalculation window | | | | | | | Distr | CommunityTax | 0% | community funding tax, not used | | Distr | BaseProposerReward | 1% | % of block inflation goes to proposer | @@ -32,7 +32,7 @@ | Slashing | SlashFractionDoubleSign | 20% | % of stake reduction for double sign | | Slashing | SlashFractionDowntime | 0% | % of stake reduction for being offline | | | | | | -| Mint | BlockInflation | 0.317097920 Gcyb | validators block rewards | +| Mint | BlockInflation | 1.585489600 Gcyb | validators block rewards | From feec443809624115b60618ae24ce69d0b3fc4872 Mon Sep 17 00:00:00 2001 From: Dima Starodubcev Date: Sun, 27 Jan 2019 00:39:12 +0200 Subject: [PATCH 29/38] Update overview.md --- docs/overview.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/overview.md b/docs/overview.md index ba719856..b9caf83f 100644 --- a/docs/overview.md +++ b/docs/overview.md @@ -17,7 +17,7 @@ | Staking | MaxValidators | 100 | maximum number of active validators set | | Staking | MaxEntries | 7 | max entries for either unbonding delegation or redelegation per delegator/validator pair(delegator/validator/validator for redelegation)| | | | | | -| Consensus | BlockTime | 5s | average block generation time | +| Consensus | BlockTime | 1s | average block generation time | | Consensus | MaxBytes | 1mb | block max bytes limit | | Consensus | RankCalcWindow | 100 | full rank recalculation window | | | | | | @@ -97,4 +97,4 @@ All minted tokens goes to fees pool. 3. The remainder is distributed proportionally by voting power to all bonded validators(and their delegators) independent of whether they voted (social distribution). - \ No newline at end of file + From 3364f6fe5a2945f269f27c2eea633e6803595585 Mon Sep 17 00:00:00 2001 From: Dima Starodubcev Date: Sun, 27 Jan 2019 02:45:13 +0200 Subject: [PATCH 30/38] There is strong raitonale behind this magic number --- docs/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/overview.md b/docs/overview.md index b9caf83f..51a7a5cb 100644 --- a/docs/overview.md +++ b/docs/overview.md @@ -14,7 +14,7 @@ | Module | Param | Value | Comment | |-------------|---------------|---------------|-----------------------------------------| | Staking | UnbondingTime | 3 weeks | time duration of unbonding | -| Staking | MaxValidators | 100 | maximum number of active validators set | +| Staking | MaxValidators | 146 | maximum number of active validators set | | Staking | MaxEntries | 7 | max entries for either unbonding delegation or redelegation per delegator/validator pair(delegator/validator/validator for redelegation)| | | | | | | Consensus | BlockTime | 1s | average block generation time | From 99ff75f3e6c1835665feb90aebda2311a3e72d6d Mon Sep 17 00:00:00 2001 From: Hleb Albau Date: Mon, 28 Jan 2019 16:10:08 +0700 Subject: [PATCH 31/38] #201 Add rank, mint, and bandwidth params --- docs/overview.md | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/docs/overview.md b/docs/overview.md index 51a7a5cb..e9f59ebd 100644 --- a/docs/overview.md +++ b/docs/overview.md @@ -2,37 +2,38 @@ ## Params -//todo consider: -// Consensus.BlockTime -// Consensus.MaxBytes -// Staking.UnbondingTime && Slashing.MaxEvidenceAge -// Distr.BaseProposerReward -// Distr.BonusProposerReward -// Slashing.SignedBlocksWindow -// Slashing.MinSignedPerWindow - | Module | Param | Value | Comment | |-------------|---------------|---------------|-----------------------------------------| | Staking | UnbondingTime | 3 weeks | time duration of unbonding | | Staking | MaxValidators | 146 | maximum number of active validators set | | Staking | MaxEntries | 7 | max entries for either unbonding delegation or redelegation per delegator/validator pair(delegator/validator/validator for redelegation)| -| | | | | -| Consensus | BlockTime | 1s | average block generation time | -| Consensus | MaxBytes | 1mb | block max bytes limit | -| Consensus | RankCalcWindow | 100 | full rank recalculation window | +| | | | | +| Consensus | BlockTime | 1s | average block generation time | +| Consensus | MaxBytes | 1mb | block max bytes limit | +| | | | | +| Rank | RankCalcWindow | 100 | full rank recalculation window | | | | | | | Distr | CommunityTax | 0% | community funding tax, not used | | Distr | BaseProposerReward | 1% | % of block inflation goes to proposer | | Distr | BonusProposerReward | 4% | addition reward, calculated as % of included votes from validators set | | | | | | | Slashing | MaxEvidenceAge | 3weeks | misbehaviour evidence max age | -| Slashing | SignedBlocksWindow | 900 | window to calculate validators liveness | -| Slashing | MinSignedPerWindow | 5% | min singed block for window to not be jailed | +| Slashing | SignedBlocksWindow | 30min | window to calculate validators liveness | +| Slashing | MinSignedPerWindow | 65% | min singed block for window to not be jailed | | Slashing | DowntimeJailDuration | 0 | unjail delay | | Slashing | SlashFractionDoubleSign | 20% | % of stake reduction for double sign | | Slashing | SlashFractionDowntime | 0% | % of stake reduction for being offline | | | | | | -| Mint | BlockInflation | 1.585489600 Gcyb | validators block rewards | +| Mint | TokensPerBlock | 0.634195840 Gcyb | validators block rewards | +| | | | | +| Bandwidth | RecoveryWindow | 24h | from 0 to max recovery period | +| Bandwidth | PriceSlidingWindow | 24h | price calculated based on network load for selected period | +| Bandwidth | PriceAdjustWindow | 1m | how ofter price is recalculated | +| Bandwidth | PriceMin | 0.01 | minimum price number (1 means normal price) | +| Bandwidth | LinkCost | 100 | link msg cost | +| Bandwidth | NonLinkCost | 5 * LinkCost | link msg cost | +| Bandwidth | TxCost | 3 * LinkCost | tx cost | +| Bandwidth | RecoveryWindowTotalBandwidth | 2000 * 1000* LinkCost | how much all users in average can spend for recover period | | From 4022a5f0c1cfe06c44578319d42a9c6d43fc439f Mon Sep 17 00:00:00 2001 From: Dima Starodubcev Date: Tue, 29 Jan 2019 10:36:36 +0200 Subject: [PATCH 32/38] New parametrs --- docs/overview.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/overview.md b/docs/overview.md index e9f59ebd..1057a42d 100644 --- a/docs/overview.md +++ b/docs/overview.md @@ -19,10 +19,10 @@ | | | | | | Slashing | MaxEvidenceAge | 3weeks | misbehaviour evidence max age | | Slashing | SignedBlocksWindow | 30min | window to calculate validators liveness | -| Slashing | MinSignedPerWindow | 65% | min singed block for window to not be jailed | +| Slashing | MinSignedPerWindow | 70% | min singed block for window to not be jailed | | Slashing | DowntimeJailDuration | 0 | unjail delay | | Slashing | SlashFractionDoubleSign | 20% | % of stake reduction for double sign | -| Slashing | SlashFractionDowntime | 0% | % of stake reduction for being offline | +| Slashing | SlashFractionDowntime | 0.1% | % of stake reduction for being offline | | | | | | | Mint | TokensPerBlock | 0.634195840 Gcyb | validators block rewards | | | | | | From ff36d03a62107bb041752e562860e65f00332cac Mon Sep 17 00:00:00 2001 From: Dima Starodubcev Date: Tue, 29 Jan 2019 10:37:54 +0200 Subject: [PATCH 33/38] Remove block time from parametrs --- docs/overview.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/overview.md b/docs/overview.md index 1057a42d..774bd41f 100644 --- a/docs/overview.md +++ b/docs/overview.md @@ -8,7 +8,6 @@ | Staking | MaxValidators | 146 | maximum number of active validators set | | Staking | MaxEntries | 7 | max entries for either unbonding delegation or redelegation per delegator/validator pair(delegator/validator/validator for redelegation)| | | | | | -| Consensus | BlockTime | 1s | average block generation time | | Consensus | MaxBytes | 1mb | block max bytes limit | | | | | | | Rank | RankCalcWindow | 100 | full rank recalculation window | From d45decffafaa07f1b14e4a6ac16f168d82e77bfe Mon Sep 17 00:00:00 2001 From: Hleb Albau Date: Wed, 30 Jan 2019 14:10:03 +0700 Subject: [PATCH 34/38] #202 Set final values --- app/genesis.go | 23 +++++++++++++++++++---- x/bandwidth/params.go | 8 ++++---- x/rank/params.go | 2 +- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/app/genesis.go b/app/genesis.go index 3e0ff43c..8f0b151d 100644 --- a/app/genesis.go +++ b/app/genesis.go @@ -82,7 +82,6 @@ const ( defaultUnbondingTime = 60 * 60 * 24 * 3 * time.Second ) -// todo set params for each module // NewDefaultGenesisState generates the default state for cyberd. func NewDefaultGenesisState() GenesisState { return GenesisState{ @@ -105,9 +104,25 @@ func NewDefaultGenesisState() GenesisState { BondDenom: coin.CYB, }, }, - SlashingData: slashing.DefaultGenesisState(), - DistrData: distr.DefaultGenesisState(), - GenTxs: []json.RawMessage{}, + SlashingData: slashing.GenesisState{ + Params: slashing.Params{ + MaxEvidenceAge: defaultUnbondingTime, + SignedBlocksWindow: 60 * 30, // ~30min + DowntimeJailDuration: 0, + MinSignedPerWindow: sdk.NewDecWithPrec(70, 1), + SlashFractionDoubleSign: sdk.NewDec(1).Quo(sdk.NewDec(5)), // 20% + SlashFractionDowntime: sdk.NewDec(1).Quo(sdk.NewDec(1000)), // 0.1% + }, + }, + DistrData: distr.GenesisState{ + FeePool: distr.InitialFeePool(), + CommunityTax: sdk.NewDecWithPrec(0, 2), // 0% + BaseProposerReward: sdk.NewDecWithPrec(1, 2), // 1% + BonusProposerReward: sdk.NewDecWithPrec(4, 2), // 4% + WithdrawAddrEnabled: true, + PreviousProposer: nil, + }, + GenTxs: []json.RawMessage{}, } } diff --git a/x/bandwidth/params.go b/x/bandwidth/params.go index 04227e5a..f39b0fab 100644 --- a/x/bandwidth/params.go +++ b/x/bandwidth/params.go @@ -10,10 +10,10 @@ const ( NonLinkMsgCost = LinkMsgCost * 5 // Number of blocks to recover full bandwidth - RecoveryPeriod = 60 * 60 * 24 + RecoveryPeriod = 60 * 60 * 24 // ~24h // Number of blocks before next adjust price - AdjustPricePeriod = 60 * 10 + AdjustPricePeriod = 60 // ~1m BaseCreditPrice float64 = 1.0 - SlidingWindowSize = RecoveryPeriod / 2 - ShouldBeSpentPerSlidingWindow = float64(DesirableNetworkBandwidthForRecoveryPeriod) / (float64(RecoveryPeriod) / float64(SlidingWindowSize)) + SlidingWindowSize = RecoveryPeriod + ShouldBeSpentPerSlidingWindow = float64(DesirableNetworkBandwidthForRecoveryPeriod) ) diff --git a/x/rank/params.go b/x/rank/params.go index 74abf4c0..966cf416 100644 --- a/x/rank/params.go +++ b/x/rank/params.go @@ -1,5 +1,5 @@ package rank const ( - CalculationPeriod = 5 + CalculationPeriod = 100 ) From 64e5516e0d076f4b7124c5fe29aa23a3bda9356a Mon Sep 17 00:00:00 2001 From: Hleb Albau Date: Thu, 31 Jan 2019 14:12:23 +0700 Subject: [PATCH 35/38] Update docs --- README.md | 2 +- app/genesis.go | 4 ++-- docs/run_validator.md | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index dab93573..0ef9a50e 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # cyberd. Knowledge consensus computer ![banner](logo.png) -[![testnet](https://img.shields.io/badge/testnet-euler-green.svg?style=flat-square)](https://github.com/cybercongress/cyberd/blob/master/docs/run_validator.md) +[![testnet](https://img.shields.io/badge/testnet-euler--1-green.svg?style=flat-square)](https://github.com/cybercongress/cyberd/blob/master/docs/run_validator.md) [![version](https://img.shields.io/github/release/cybercongress/cyberd.svg?style=flat-square)](https://github.com/cosmos/cosmos-sdk/releases/latest) [![CircleCI](https://img.shields.io/circleci/project/github/cybercongress/cyberd.svg?style=flat-square)](https://circleci.com/gh/cybercongress/cyberd/tree/master) [![license](https://img.shields.io/badge/License-Cyber-brightgreen.svg?style=flat-square)](https://github.com/cybercongress/cyberd/blob/master/LICENSE) diff --git a/app/genesis.go b/app/genesis.go index 8f0b151d..191ed03f 100644 --- a/app/genesis.go +++ b/app/genesis.go @@ -109,8 +109,8 @@ func NewDefaultGenesisState() GenesisState { MaxEvidenceAge: defaultUnbondingTime, SignedBlocksWindow: 60 * 30, // ~30min DowntimeJailDuration: 0, - MinSignedPerWindow: sdk.NewDecWithPrec(70, 1), - SlashFractionDoubleSign: sdk.NewDec(1).Quo(sdk.NewDec(5)), // 20% + MinSignedPerWindow: sdk.NewDecWithPrec(70, 2), // 70% + SlashFractionDoubleSign: sdk.NewDecWithPrec(20, 2), // 20% SlashFractionDowntime: sdk.NewDec(1).Quo(sdk.NewDec(1000)), // 0.1% }, }, diff --git a/docs/run_validator.md b/docs/run_validator.md index 574f4117..66858597 100644 --- a/docs/run_validator.md +++ b/docs/run_validator.md @@ -1,6 +1,6 @@ # Join Cyberd Network As Validator -**Note**. Currently active dev testnet is `euler` (substitute with that value). +**Note**. Currently active dev testnet is `euler-1` (substitute with that value). ## Prepare your server From 6c52bf096c01cde24c7985045b949409d965cbc9 Mon Sep 17 00:00:00 2001 From: Artur Albov Date: Thu, 31 Jan 2019 14:20:31 +0700 Subject: [PATCH 36/38] Fix import reader --- util/file.go | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/util/file.go b/util/file.go index fb863ff4..b3fc7d8c 100644 --- a/util/file.go +++ b/util/file.go @@ -18,12 +18,17 @@ func RootifyPath(path string) string { func ReadExactlyNBytes(reader io.Reader, n uint64) ([]byte, error) { data := make([]byte, n) - bytesReaded, err := reader.Read(data) - if err != nil { - return nil, err - } - if uint64(bytesReaded) != n { - return nil, errors.New("not enough bytes tor read") + currentlyReadedBytes := uint64(0) + for currentlyReadedBytes < n { + readedBytes, err := reader.Read(data[currentlyReadedBytes:n]) + if err != nil { + return nil, err + } + if readedBytes == 0 { + return nil, errors.New("not enough bytes tor read") + } + currentlyReadedBytes += uint64(readedBytes) } + return data, nil } From 45bc6eabc57eb381108bb9182346e9abafa83a7a Mon Sep 17 00:00:00 2001 From: Hleb Albau Date: Thu, 31 Jan 2019 14:29:26 +0700 Subject: [PATCH 37/38] Change unbonding to 3 weeks --- app/genesis.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/genesis.go b/app/genesis.go index 191ed03f..81272613 100644 --- a/app/genesis.go +++ b/app/genesis.go @@ -79,7 +79,7 @@ func (ga *GenesisAccount) ToAccount() (acc *auth.BaseAccount) { const ( // defaultUnbondingTime reflects three weeks in seconds as the default // unbonding time. - defaultUnbondingTime = 60 * 60 * 24 * 3 * time.Second + defaultUnbondingTime = 60 * 60 * 24 * 3 * 7 * time.Second ) // NewDefaultGenesisState generates the default state for cyberd. From d21e4a6980d6ff3d6d162d6a8c6043075a03be9f Mon Sep 17 00:00:00 2001 From: Artur Albov Date: Thu, 31 Jan 2019 14:39:53 +0700 Subject: [PATCH 38/38] Update release IPFS hashes for 0.1.1 testnet --- Dockerfile | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/Dockerfile b/Dockerfile index 19877b6c..bfa1321f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -70,12 +70,9 @@ RUN url="https://dist.ipfs.io/ipget/v${IPGET_VERSION}/ipget_v${IPGET_VERSION}_${ rm ipget.tgz WORKDIR /ipget -#replace with actual IPFS hash -RUN ./ipget QmNjMpRMyw98rKtQWQXNEFC5sfCsXqpB9GA6dMz7QschLz -o /genesis.json -#replace with actual IPFS hash -RUN ./ipget QmeupYarwzd7kZzg7faEXZZPPk5cbzbwC71YXJvTHFoUXe -o /links -#replace with actual IPFS hash -RUN ./ipget QmdTSB3GNUyshDYSZuno1BhpjtkXqdbdCJ7wXyB66TuBYv -o /config.toml +RUN ./ipget QmSFTpNaXB3FhB4EWjsrUydupZXTL8Z44c2j18o5CGnN5h -o /genesis.json +RUN ./ipget QmepwmLe7vQcK2W6WmvfEk46de3cJ4Jp6jXRXNhuR2AfJ9 -o /links +RUN ./ipget QmdHeSsjkuThTe6VVDD4FUUfpQFH79R8tYrC2bgWwHC2bh -o /config.toml WORKDIR /