mirror of
https://github.com/fluencelabs/tendermint
synced 2025-04-26 23:32:15 +00:00
nametx perm
This commit is contained in:
parent
7e1412dbc2
commit
231a003783
@ -25,10 +25,11 @@ const (
|
|||||||
CreateContract // 8
|
CreateContract // 8
|
||||||
CreateAccount // 16
|
CreateAccount // 16
|
||||||
Bond // 32
|
Bond // 32
|
||||||
|
Name // 64
|
||||||
|
|
||||||
DefaultBBPB = Send | Call | CreateContract | CreateAccount | Bond
|
DefaultBBPB = Send | Call | CreateContract | CreateAccount | Bond | Name
|
||||||
|
|
||||||
NumBasePermissions uint = 6
|
NumBasePermissions uint = 7
|
||||||
TopBasePermission PermFlag = 1 << (NumBasePermissions - 1)
|
TopBasePermission PermFlag = 1 << (NumBasePermissions - 1)
|
||||||
AllSet PermFlag = (1 << 63) - 1 + (1 << 63)
|
AllSet PermFlag = (1 << 63) - 1 + (1 << 63)
|
||||||
)
|
)
|
||||||
|
@ -529,6 +529,10 @@ func ExecTx(blockCache *BlockCache, tx_ types.Tx, runCall bool, evc events.Firea
|
|||||||
log.Debug(Fmt("Can't find in account %X", tx.Input.Address))
|
log.Debug(Fmt("Can't find in account %X", tx.Input.Address))
|
||||||
return types.ErrTxInvalidAddress
|
return types.ErrTxInvalidAddress
|
||||||
}
|
}
|
||||||
|
// check permission
|
||||||
|
if !hasNamePermission(blockCache, inAcc) {
|
||||||
|
return fmt.Errorf("Account %X does not have Name permission", tx.Input.Address)
|
||||||
|
}
|
||||||
// pubKey should be present in either "inAcc" or "tx.Input"
|
// pubKey should be present in either "inAcc" or "tx.Input"
|
||||||
if err := checkInputPubKey(inAcc, tx.Input); err != nil {
|
if err := checkInputPubKey(inAcc, tx.Input); err != nil {
|
||||||
log.Debug(Fmt("Can't find pubkey for %X", tx.Input.Address))
|
log.Debug(Fmt("Can't find pubkey for %X", tx.Input.Address))
|
||||||
@ -841,6 +845,10 @@ func hasSendPermission(state AccountGetter, accs map[string]*account.Account) bo
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func hasNamePermission(state AccountGetter, acc *account.Account) bool {
|
||||||
|
return HasPermission(state, acc, ptypes.Name)
|
||||||
|
}
|
||||||
|
|
||||||
func hasCallPermission(state AccountGetter, acc *account.Account) bool {
|
func hasCallPermission(state AccountGetter, acc *account.Account) bool {
|
||||||
return HasPermission(state, acc, ptypes.Call)
|
return HasPermission(state, acc, ptypes.Call)
|
||||||
}
|
}
|
||||||
|
@ -39,6 +39,10 @@ x - contract runs create but doesn't have create perm
|
|||||||
x - contract runs create but has perm
|
x - contract runs create but has perm
|
||||||
x - contract runs call with empty address (has call and create perm)
|
x - contract runs call with empty address (has call and create perm)
|
||||||
|
|
||||||
|
- NameTx
|
||||||
|
- no perm, send perm, call perm
|
||||||
|
- with perm
|
||||||
|
|
||||||
- BondTx
|
- BondTx
|
||||||
x - 1 input, no perm
|
x - 1 input, no perm
|
||||||
x - 1 input, perm
|
x - 1 input, perm
|
||||||
@ -190,6 +194,40 @@ func TestSendFails(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestName(t *testing.T) {
|
||||||
|
stateDB := dbm.GetDB("state")
|
||||||
|
genDoc := newBaseGenDoc(PermsAllFalse, PermsAllFalse)
|
||||||
|
genDoc.Accounts[0].Permissions.Base.Set(ptypes.Send, true)
|
||||||
|
genDoc.Accounts[1].Permissions.Base.Set(ptypes.Name, true)
|
||||||
|
st := MakeGenesisState(stateDB, &genDoc)
|
||||||
|
blockCache := NewBlockCache(st)
|
||||||
|
|
||||||
|
//-------------------
|
||||||
|
// name txs
|
||||||
|
|
||||||
|
// simple name tx without perm should fail
|
||||||
|
tx, err := types.NewNameTx(st, user[0].PubKey, "somename", "somedata", 10000, 100)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
tx.Sign(chainID, user[0])
|
||||||
|
if err := ExecTx(blockCache, tx, true, nil); err == nil {
|
||||||
|
t.Fatal("Expected error")
|
||||||
|
} else {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// simple name tx with perm should pass
|
||||||
|
tx, err = types.NewNameTx(st, user[1].PubKey, "somename", "somedata", 10000, 100)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
tx.Sign(chainID, user[1])
|
||||||
|
if err := ExecTx(blockCache, tx, true, nil); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestCallFails(t *testing.T) {
|
func TestCallFails(t *testing.T) {
|
||||||
stateDB := dbm.GetDB("state")
|
stateDB := dbm.GetDB("state")
|
||||||
genDoc := newBaseGenDoc(PermsAllFalse, PermsAllFalse)
|
genDoc := newBaseGenDoc(PermsAllFalse, PermsAllFalse)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user