[#42] Share InvokeID between contracts
Replace invokeID to common package and export it. Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
This commit is contained in:
parent
c3efe152d6
commit
dd0768aaeb
5 changed files with 25 additions and 50 deletions
|
@ -4,7 +4,6 @@ import (
|
|||
"github.com/nspcc-dev/neo-go/pkg/interop"
|
||||
"github.com/nspcc-dev/neo-go/pkg/interop/binary"
|
||||
"github.com/nspcc-dev/neo-go/pkg/interop/contract"
|
||||
"github.com/nspcc-dev/neo-go/pkg/interop/crypto"
|
||||
"github.com/nspcc-dev/neo-go/pkg/interop/iterator"
|
||||
"github.com/nspcc-dev/neo-go/pkg/interop/runtime"
|
||||
"github.com/nspcc-dev/neo-go/pkg/interop/storage"
|
||||
|
@ -128,7 +127,7 @@ func TransferX(from, to interop.Hash160, amount int, details []byte) bool {
|
|||
n = threshold
|
||||
runtime.Log("transferX: processed indirect invoke")
|
||||
} else {
|
||||
hashTxID = invokeID([]interface{}{from, to, amount}, []byte("transfer"))
|
||||
hashTxID = common.InvokeID([]interface{}{from, to, amount}, []byte("transfer"))
|
||||
n = common.Vote(ctx, hashTxID, irKey)
|
||||
}
|
||||
|
||||
|
@ -159,7 +158,7 @@ func Lock(txID []byte, from, to interop.Hash160, amount, until int) bool {
|
|||
panic("lock: this method must be invoked from inner ring")
|
||||
}
|
||||
|
||||
hashTxID := invokeID([]interface{}{txID, from, to, amount, until}, []byte("lock"))
|
||||
hashTxID := common.InvokeID([]interface{}{txID, from, to, amount, until}, []byte("lock"))
|
||||
|
||||
n := common.Vote(ctx, hashTxID, irKey)
|
||||
if n >= threshold {
|
||||
|
@ -197,7 +196,7 @@ func NewEpoch(epochNum int) bool {
|
|||
panic("epochNum: this method must be invoked from inner ring")
|
||||
}
|
||||
|
||||
epochID := invokeID([]interface{}{epochNum}, []byte("epoch"))
|
||||
epochID := common.InvokeID([]interface{}{epochNum}, []byte("epoch"))
|
||||
|
||||
n := common.Vote(ctx, epochID, irKey)
|
||||
if n >= threshold {
|
||||
|
@ -236,7 +235,7 @@ func Mint(to interop.Hash160, amount int, details []byte) bool {
|
|||
panic("burn: this method must be invoked from inner ring")
|
||||
}
|
||||
|
||||
mintID := invokeID([]interface{}{to, amount, details}, []byte("mint"))
|
||||
mintID := common.InvokeID([]interface{}{to, amount, details}, []byte("mint"))
|
||||
|
||||
n := common.Vote(ctx, mintID, irKey)
|
||||
if n >= threshold {
|
||||
|
@ -267,7 +266,7 @@ func Burn(from interop.Hash160, amount int, details []byte) bool {
|
|||
panic("burn: this method must be invoked from inner ring")
|
||||
}
|
||||
|
||||
burnID := invokeID([]interface{}{from, amount, details}, []byte("burn"))
|
||||
burnID := common.InvokeID([]interface{}{from, amount, details}, []byte("burn"))
|
||||
|
||||
n := common.Vote(ctx, burnID, irKey)
|
||||
if n >= threshold {
|
||||
|
@ -402,15 +401,6 @@ func getAccount(ctx storage.Context, key interface{}) Account {
|
|||
return Account{}
|
||||
}
|
||||
|
||||
func invokeID(args []interface{}, prefix []byte) []byte {
|
||||
for i := range args {
|
||||
arg := args[i].([]byte)
|
||||
prefix = append(prefix, arg...)
|
||||
}
|
||||
|
||||
return crypto.SHA256(prefix)
|
||||
}
|
||||
|
||||
/*
|
||||
Check if invocation made from known container or audit contracts.
|
||||
This is necessary because calls from these contracts require to do transfer
|
||||
|
|
12
common/invoke.go
Normal file
12
common/invoke.go
Normal file
|
@ -0,0 +1,12 @@
|
|||
package common
|
||||
|
||||
import "github.com/nspcc-dev/neo-go/pkg/interop/crypto"
|
||||
|
||||
func InvokeID(args []interface{}, prefix []byte) []byte {
|
||||
for i := range args {
|
||||
arg := args[i].([]byte)
|
||||
prefix = append(prefix, arg...)
|
||||
}
|
||||
|
||||
return crypto.SHA256(prefix)
|
||||
}
|
|
@ -117,7 +117,7 @@ func Put(container, signature, publicKey []byte) bool {
|
|||
from := walletToScripHash(ownerID)
|
||||
balanceContractAddr := storage.Get(ctx, balanceContractKey).([]byte)
|
||||
containerFee := contract.Call(netmapContractAddr, "config", containerFeeKey).(int)
|
||||
hashCandidate := invokeID([]interface{}{container, signature, publicKey}, []byte("put"))
|
||||
hashCandidate := common.InvokeID([]interface{}{container, signature, publicKey}, []byte("put"))
|
||||
|
||||
n := common.Vote(ctx, hashCandidate, irKey)
|
||||
if n >= threshold {
|
||||
|
@ -178,7 +178,7 @@ func Delete(containerID, signature []byte) bool {
|
|||
return true
|
||||
}
|
||||
|
||||
hashCandidate := invokeID([]interface{}{containerID, signature}, []byte("delete"))
|
||||
hashCandidate := common.InvokeID([]interface{}{containerID, signature}, []byte("delete"))
|
||||
|
||||
n := common.Vote(ctx, hashCandidate, irKey)
|
||||
if n >= threshold {
|
||||
|
@ -350,7 +350,7 @@ func ProcessEpoch(epochNum int) {
|
|||
}
|
||||
|
||||
candidates := keysToDelete(epochNum)
|
||||
epochID := invokeID([]interface{}{epochNum}, []byte("epoch"))
|
||||
epochID := common.InvokeID([]interface{}{epochNum}, []byte("epoch"))
|
||||
|
||||
n := common.Vote(ctx, epochID, irKey)
|
||||
if n >= threshold {
|
||||
|
@ -373,7 +373,7 @@ func StartContainerEstimation(epoch int) bool {
|
|||
panic("startEstimation: only inner ring nodes can invoke this")
|
||||
}
|
||||
|
||||
hashCandidate := invokeID([]interface{}{epoch}, []byte("startEstimation"))
|
||||
hashCandidate := common.InvokeID([]interface{}{epoch}, []byte("startEstimation"))
|
||||
|
||||
n := common.Vote(ctx, hashCandidate, irKey)
|
||||
if n >= threshold {
|
||||
|
@ -397,7 +397,7 @@ func StopContainerEstimation(epoch int) bool {
|
|||
panic("stopEstimation: only inner ring nodes can invoke this")
|
||||
}
|
||||
|
||||
hashCandidate := invokeID([]interface{}{epoch}, []byte("stopEstimation"))
|
||||
hashCandidate := common.InvokeID([]interface{}{epoch}, []byte("stopEstimation"))
|
||||
|
||||
n := common.Vote(ctx, hashCandidate, irKey)
|
||||
if n >= threshold {
|
||||
|
@ -531,15 +531,6 @@ func verifySignature(msg, sig []byte, keys [][]byte) bool {
|
|||
return false
|
||||
}
|
||||
|
||||
func invokeID(args []interface{}, prefix []byte) []byte {
|
||||
for i := range args {
|
||||
arg := args[i].([]byte)
|
||||
prefix = append(prefix, arg...)
|
||||
}
|
||||
|
||||
return crypto.SHA256(prefix)
|
||||
}
|
||||
|
||||
func getOwnerByID(ctx storage.Context, id []byte) []byte {
|
||||
owners := getList(ctx, ownersKey)
|
||||
for i := 0; i < len(owners); i++ {
|
||||
|
|
|
@ -197,15 +197,6 @@ func innerRingInvoker(ir []irNode) []byte {
|
|||
return nil
|
||||
}
|
||||
|
||||
func invokeID(args []interface{}, prefix []byte) []byte {
|
||||
for i := range args {
|
||||
arg := args[i].([]byte)
|
||||
prefix = append(prefix, arg...)
|
||||
}
|
||||
|
||||
return crypto.SHA256(prefix)
|
||||
}
|
||||
|
||||
func invokeIDKeys(owner []byte, keys [][]byte, prefix []byte) []byte {
|
||||
prefix = append(prefix, owner...)
|
||||
for i := range keys {
|
||||
|
|
|
@ -185,7 +185,7 @@ func UpdateState(state int, publicKey []byte) bool {
|
|||
case offlineState:
|
||||
newNetmap := removeFromNetmap(ctx, publicKey)
|
||||
|
||||
hashID := invokeID([]interface{}{publicKey}, []byte("delete"))
|
||||
hashID := common.InvokeID([]interface{}{publicKey}, []byte("delete"))
|
||||
n := common.Vote(ctx, hashID, irKey)
|
||||
if n >= threshold {
|
||||
runtime.Log("updateState: remove storage node from the network map")
|
||||
|
@ -218,7 +218,7 @@ func NewEpoch(epochNum int) bool {
|
|||
data0snapshot := getSnapshot(ctx, snapshot0Key)
|
||||
dataOnlineState := filterNetmap(ctx, onlineState)
|
||||
|
||||
hashID := invokeID([]interface{}{epochNum}, []byte("epoch"))
|
||||
hashID := common.InvokeID([]interface{}{epochNum}, []byte("epoch"))
|
||||
|
||||
n := common.Vote(ctx, hashID, irKey)
|
||||
if n >= threshold {
|
||||
|
@ -285,7 +285,7 @@ func SetConfig(id, key, val []byte) bool {
|
|||
}
|
||||
|
||||
// check unique id of the operation
|
||||
hashID := invokeID([]interface{}{id, key, val}, []byte("config"))
|
||||
hashID := common.InvokeID([]interface{}{id, key, val}, []byte("config"))
|
||||
n := common.Vote(ctx, hashID, irKey)
|
||||
|
||||
if n >= threshold {
|
||||
|
@ -452,12 +452,3 @@ func setConfig(ctx storage.Context, key, val interface{}) {
|
|||
|
||||
storage.Put(ctx, storageKey, val)
|
||||
}
|
||||
|
||||
func invokeID(args []interface{}, prefix []byte) []byte {
|
||||
for i := range args {
|
||||
arg := args[i].([]byte)
|
||||
prefix = append(prefix, arg...)
|
||||
}
|
||||
|
||||
return crypto.SHA256(prefix)
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue