forked from TrueCloudLab/frostfs-contract
[#37] Use readonly context
Delete initializing of R/W context in `init()` and start using readonly storage context in methods where it is possible. Signed-off-by: Pavel Karpy <carpawell@nspcc.ru>
This commit is contained in:
parent
6cd0808627
commit
8af80e67aa
8 changed files with 149 additions and 62 deletions
|
@ -22,12 +22,6 @@ const (
|
|||
version = 1
|
||||
)
|
||||
|
||||
var ctx storage.Context
|
||||
|
||||
func init() {
|
||||
ctx = storage.GetContext()
|
||||
}
|
||||
|
||||
// OnNEP17Payment is a callback for NEP-17 compatible native GAS and NEO contracts.
|
||||
func OnNEP17Payment(from interop.Hash160, amount int, data interface{}) {
|
||||
caller := runtime.GetCallingScriptHash()
|
||||
|
@ -37,6 +31,8 @@ func OnNEP17Payment(from interop.Hash160, amount int, data interface{}) {
|
|||
}
|
||||
|
||||
func Init(owner interop.Hash160, addrNetmap, addrProxy interop.Hash160, name string, index, total int) {
|
||||
ctx := storage.GetContext()
|
||||
|
||||
if !common.HasUpdateAccess(ctx) {
|
||||
panic("only owner can reinitialize contract")
|
||||
}
|
||||
|
@ -56,6 +52,8 @@ func Init(owner interop.Hash160, addrNetmap, addrProxy interop.Hash160, name str
|
|||
}
|
||||
|
||||
func Migrate(script []byte, manifest []byte) bool {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
|
||||
if !common.HasUpdateAccess(ctx) {
|
||||
runtime.Log("only owner can update contract")
|
||||
return false
|
||||
|
@ -75,29 +73,30 @@ func Neo() int {
|
|||
return neo.BalanceOf(runtime.GetExecutingScriptHash())
|
||||
}
|
||||
|
||||
func irList() []common.IRNode {
|
||||
func irList(ctx storage.Context) []common.IRNode {
|
||||
return common.InnerRingListViaStorage(ctx, netmapKey)
|
||||
}
|
||||
|
||||
func currentEpoch() int {
|
||||
func currentEpoch(ctx storage.Context) int {
|
||||
netmapContractAddr := storage.Get(ctx, netmapKey).(interop.Hash160)
|
||||
return contract.Call(netmapContractAddr, "epoch", contract.ReadOnly).(int)
|
||||
}
|
||||
|
||||
func name() string {
|
||||
func name(ctx storage.Context) string {
|
||||
return storage.Get(ctx, nameKey).(string)
|
||||
}
|
||||
|
||||
func index() int {
|
||||
func index(ctx storage.Context) int {
|
||||
return storage.Get(ctx, indexKey).(int)
|
||||
}
|
||||
|
||||
func total() int {
|
||||
func total(ctx storage.Context) int {
|
||||
return storage.Get(ctx, totalKey).(int)
|
||||
}
|
||||
|
||||
func checkPermission(ir []common.IRNode) bool {
|
||||
index := index() // read from contract memory
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
index := index(ctx) // read from contract memory
|
||||
|
||||
if len(ir) <= index {
|
||||
return false
|
||||
|
@ -108,7 +107,9 @@ func checkPermission(ir []common.IRNode) bool {
|
|||
}
|
||||
|
||||
func Emit() bool {
|
||||
innerRingKeys := irList()
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
|
||||
innerRingKeys := irList(ctx)
|
||||
if !checkPermission(innerRingKeys) {
|
||||
panic("invalid invoker")
|
||||
}
|
||||
|
@ -144,15 +145,16 @@ func Emit() bool {
|
|||
}
|
||||
|
||||
func Vote(epoch int, candidates []interop.PublicKey) {
|
||||
index := index()
|
||||
name := name()
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
index := index(ctx)
|
||||
name := name(ctx)
|
||||
|
||||
multiaddr := common.InnerRingMultiAddressViaStorage(ctx, netmapKey)
|
||||
if !runtime.CheckWitness(multiaddr) {
|
||||
panic("invalid invoker")
|
||||
}
|
||||
|
||||
curEpoch := currentEpoch()
|
||||
curEpoch := currentEpoch(ctx)
|
||||
if epoch != curEpoch {
|
||||
panic("invalid epoch")
|
||||
}
|
||||
|
@ -171,7 +173,8 @@ func Vote(epoch int, candidates []interop.PublicKey) {
|
|||
}
|
||||
|
||||
func Name() string {
|
||||
return name()
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
return name(ctx)
|
||||
}
|
||||
|
||||
func Version() int {
|
||||
|
|
|
@ -40,13 +40,9 @@ const (
|
|||
netmapContractKey = "netmapScriptHash"
|
||||
)
|
||||
|
||||
var ctx storage.Context
|
||||
|
||||
func init() {
|
||||
ctx = storage.GetContext()
|
||||
}
|
||||
|
||||
func Init(owner interop.Hash160, addrNetmap interop.Hash160) {
|
||||
ctx := storage.GetContext()
|
||||
|
||||
if !common.HasUpdateAccess(ctx) {
|
||||
panic("only owner can reinitialize contract")
|
||||
}
|
||||
|
@ -62,6 +58,8 @@ func Init(owner interop.Hash160, addrNetmap interop.Hash160) {
|
|||
}
|
||||
|
||||
func Migrate(script []byte, manifest []byte) bool {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
|
||||
if !common.HasUpdateAccess(ctx) {
|
||||
runtime.Log("only owner can update contract")
|
||||
return false
|
||||
|
@ -74,6 +72,7 @@ func Migrate(script []byte, manifest []byte) bool {
|
|||
}
|
||||
|
||||
func Put(rawAuditResult []byte) bool {
|
||||
ctx := storage.GetContext()
|
||||
innerRing := common.InnerRingListViaStorage(ctx, netmapContractKey)
|
||||
|
||||
hdr := newAuditHeader(rawAuditResult)
|
||||
|
@ -100,22 +99,27 @@ func Put(rawAuditResult []byte) bool {
|
|||
}
|
||||
|
||||
func Get(id []byte) []byte {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
return storage.Get(ctx, id).([]byte)
|
||||
}
|
||||
|
||||
func List() [][]byte {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
it := storage.Find(ctx, []byte{}, storage.KeysOnly)
|
||||
|
||||
return list(it)
|
||||
}
|
||||
|
||||
func ListByEpoch(epoch int) [][]byte {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
it := storage.Find(ctx, epoch, storage.KeysOnly)
|
||||
|
||||
return list(it)
|
||||
}
|
||||
|
||||
func ListByCID(epoch int, cid []byte) [][]byte {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
|
||||
var buf interface{} = epoch
|
||||
|
||||
prefix := append(buf.([]byte), cid...)
|
||||
|
@ -125,6 +129,7 @@ func ListByCID(epoch int, cid []byte) [][]byte {
|
|||
}
|
||||
|
||||
func ListByNode(epoch int, cid []byte, key interop.PublicKey) [][]byte {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
hdr := auditHeader{
|
||||
epoch: epoch,
|
||||
cid: cid,
|
||||
|
|
|
@ -46,7 +46,6 @@ var (
|
|||
lockTransferMsg = []byte("lock assets to withdraw")
|
||||
unlockTransferMsg = []byte("asset lock expired")
|
||||
|
||||
ctx storage.Context
|
||||
token Token
|
||||
)
|
||||
|
||||
|
@ -60,11 +59,12 @@ func CreateToken() Token {
|
|||
}
|
||||
|
||||
func init() {
|
||||
ctx = storage.GetContext()
|
||||
token = CreateToken()
|
||||
}
|
||||
|
||||
func Init(owner, addrNetmap, addrContainer interop.Hash160) {
|
||||
ctx := storage.GetContext()
|
||||
|
||||
if !common.HasUpdateAccess(ctx) {
|
||||
panic("only owner can reinitialize contract")
|
||||
}
|
||||
|
@ -81,6 +81,8 @@ func Init(owner, addrNetmap, addrContainer interop.Hash160) {
|
|||
}
|
||||
|
||||
func Migrate(script []byte, manifest []byte) bool {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
|
||||
if !common.HasUpdateAccess(ctx) {
|
||||
runtime.Log("only owner can update contract")
|
||||
return false
|
||||
|
@ -101,18 +103,23 @@ func Decimals() int {
|
|||
}
|
||||
|
||||
func TotalSupply() int {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
return token.getSupply(ctx)
|
||||
}
|
||||
|
||||
func BalanceOf(account interop.Hash160) int {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
return token.balanceOf(ctx, account)
|
||||
}
|
||||
|
||||
func Transfer(from, to interop.Hash160, amount int, data interface{}) bool {
|
||||
ctx := storage.GetContext()
|
||||
return token.transfer(ctx, from, to, amount, false, nil)
|
||||
}
|
||||
|
||||
func TransferX(from, to interop.Hash160, amount int, details []byte) bool {
|
||||
ctx := storage.GetContext()
|
||||
|
||||
multiaddr := common.InnerRingMultiAddressViaStorage(ctx, netmapContractKey)
|
||||
if !runtime.CheckWitness(multiaddr) {
|
||||
panic("transferX: this method must be invoked from inner ring")
|
||||
|
@ -130,6 +137,8 @@ func TransferX(from, to interop.Hash160, amount int, details []byte) bool {
|
|||
}
|
||||
|
||||
func Lock(txID []byte, from, to interop.Hash160, amount, until int) bool {
|
||||
ctx := storage.GetContext()
|
||||
|
||||
multiaddr := common.InnerRingMultiAddressViaStorage(ctx, netmapContractKey)
|
||||
if !runtime.CheckWitness(multiaddr) {
|
||||
panic("lock: this method must be invoked from inner ring")
|
||||
|
@ -155,6 +164,8 @@ func Lock(txID []byte, from, to interop.Hash160, amount, until int) bool {
|
|||
}
|
||||
|
||||
func NewEpoch(epochNum int) bool {
|
||||
ctx := storage.GetContext()
|
||||
|
||||
multiaddr := common.InnerRingMultiAddressViaStorage(ctx, netmapContractKey)
|
||||
if !runtime.CheckWitness(multiaddr) {
|
||||
panic("epochNum: this method must be invoked from inner ring")
|
||||
|
@ -182,6 +193,8 @@ func NewEpoch(epochNum int) bool {
|
|||
}
|
||||
|
||||
func Mint(to interop.Hash160, amount int, details []byte) bool {
|
||||
ctx := storage.GetContext()
|
||||
|
||||
multiaddr := common.InnerRingMultiAddressViaStorage(ctx, netmapContractKey)
|
||||
if !runtime.CheckWitness(multiaddr) {
|
||||
panic("mint: this method must be invoked from inner ring")
|
||||
|
@ -202,6 +215,8 @@ func Mint(to interop.Hash160, amount int, details []byte) bool {
|
|||
}
|
||||
|
||||
func Burn(from interop.Hash160, amount int, details []byte) bool {
|
||||
ctx := storage.GetContext()
|
||||
|
||||
multiaddr := common.InnerRingMultiAddressViaStorage(ctx, netmapContractKey)
|
||||
if !runtime.CheckWitness(multiaddr) {
|
||||
panic("burn: this method must be invoked from inner ring")
|
||||
|
|
|
@ -52,15 +52,11 @@ const (
|
|||
var (
|
||||
containerFeeTransferMsg = []byte("container creation fee")
|
||||
eACLPrefix = []byte("eACL")
|
||||
|
||||
ctx storage.Context
|
||||
)
|
||||
|
||||
func init() {
|
||||
ctx = storage.GetContext()
|
||||
}
|
||||
|
||||
func Init(owner, addrNetmap, addrBalance, addrID interop.Hash160) {
|
||||
ctx := storage.GetContext()
|
||||
|
||||
if !common.HasUpdateAccess(ctx) {
|
||||
panic("only owner can reinitialize contract")
|
||||
}
|
||||
|
@ -78,6 +74,8 @@ func Init(owner, addrNetmap, addrBalance, addrID interop.Hash160) {
|
|||
}
|
||||
|
||||
func Migrate(script []byte, manifest []byte) bool {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
|
||||
if !common.HasUpdateAccess(ctx) {
|
||||
runtime.Log("only owner can update contract")
|
||||
return false
|
||||
|
@ -90,6 +88,8 @@ func Migrate(script []byte, manifest []byte) bool {
|
|||
}
|
||||
|
||||
func Put(container []byte, signature interop.Signature, publicKey interop.PublicKey) bool {
|
||||
ctx := storage.GetContext()
|
||||
|
||||
offset := int(container[1])
|
||||
offset = 2 + offset + 4 // version prefix + version size + owner prefix
|
||||
ownerID := container[offset : offset+25] // offset + size of owner
|
||||
|
@ -144,6 +144,8 @@ func Put(container []byte, signature interop.Signature, publicKey interop.Public
|
|||
}
|
||||
|
||||
func Delete(containerID, signature []byte) bool {
|
||||
ctx := storage.GetContext()
|
||||
|
||||
ownerID := getOwnerByID(ctx, containerID)
|
||||
if len(ownerID) == 0 {
|
||||
panic("delete: container does not exist")
|
||||
|
@ -170,14 +172,18 @@ func Delete(containerID, signature []byte) bool {
|
|||
}
|
||||
|
||||
func Get(containerID []byte) []byte {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
return storage.Get(ctx, containerID).([]byte)
|
||||
}
|
||||
|
||||
func Owner(containerID []byte) []byte {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
return getOwnerByID(ctx, containerID)
|
||||
}
|
||||
|
||||
func List(owner []byte) [][]byte {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
|
||||
if len(owner) == 0 {
|
||||
return getAllContainers(ctx)
|
||||
}
|
||||
|
@ -203,6 +209,8 @@ func List(owner []byte) [][]byte {
|
|||
}
|
||||
|
||||
func SetEACL(eACL, signature []byte) bool {
|
||||
ctx := storage.GetContext()
|
||||
|
||||
// get container ID
|
||||
offset := int(eACL[1])
|
||||
offset = 2 + offset + 4
|
||||
|
@ -234,6 +242,8 @@ func SetEACL(eACL, signature []byte) bool {
|
|||
}
|
||||
|
||||
func EACL(containerID []byte) extendedACL {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
|
||||
ownerID := getOwnerByID(ctx, containerID)
|
||||
if len(ownerID) == 0 {
|
||||
panic("getEACL: container does not exists")
|
||||
|
@ -263,16 +273,18 @@ func EACL(containerID []byte) extendedACL {
|
|||
}
|
||||
|
||||
func PutContainerSize(epoch int, cid []byte, usedSize int, pubKey interop.PublicKey) bool {
|
||||
ctx := storage.GetContext()
|
||||
|
||||
if !runtime.CheckWitness(pubKey) {
|
||||
panic("container: invalid witness for size estimation")
|
||||
}
|
||||
|
||||
if !isStorageNode(pubKey) {
|
||||
if !isStorageNode(ctx, pubKey) {
|
||||
panic("container: only storage nodes can save size estimations")
|
||||
}
|
||||
|
||||
key := estimationKey(epoch, cid)
|
||||
s := getContainerSizeEstimation(key, cid)
|
||||
s := getContainerSizeEstimation(ctx, key, cid)
|
||||
|
||||
// do not add estimation twice
|
||||
for i := range s.estimations {
|
||||
|
@ -295,10 +307,13 @@ func PutContainerSize(epoch int, cid []byte, usedSize int, pubKey interop.Public
|
|||
}
|
||||
|
||||
func GetContainerSize(id []byte) containerSizes {
|
||||
return getContainerSizeEstimation(id, nil)
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
return getContainerSizeEstimation(ctx, id, nil)
|
||||
}
|
||||
|
||||
func ListContainerSizes(epoch int) [][]byte {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
|
||||
var buf interface{} = epoch
|
||||
|
||||
key := []byte(estimateKeyPrefix)
|
||||
|
@ -317,18 +332,22 @@ func ListContainerSizes(epoch int) [][]byte {
|
|||
}
|
||||
|
||||
func ProcessEpoch(epochNum int) {
|
||||
ctx := storage.GetContext()
|
||||
|
||||
multiaddr := common.InnerRingMultiAddressViaStorage(ctx, netmapContractKey)
|
||||
if !runtime.CheckWitness(multiaddr) {
|
||||
panic("processEpoch: this method must be invoked from inner ring")
|
||||
}
|
||||
|
||||
candidates := keysToDelete(epochNum)
|
||||
candidates := keysToDelete(ctx, epochNum)
|
||||
for _, candidate := range candidates {
|
||||
storage.Delete(ctx, candidate)
|
||||
}
|
||||
}
|
||||
|
||||
func StartContainerEstimation(epoch int) bool {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
|
||||
multiaddr := common.InnerRingMultiAddressViaStorage(ctx, netmapContractKey)
|
||||
if !runtime.CheckWitness(multiaddr) {
|
||||
panic("startEstimation: only inner ring nodes can invoke this")
|
||||
|
@ -341,6 +360,8 @@ func StartContainerEstimation(epoch int) bool {
|
|||
}
|
||||
|
||||
func StopContainerEstimation(epoch int) bool {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
|
||||
multiaddr := common.InnerRingMultiAddressViaStorage(ctx, netmapContractKey)
|
||||
if !runtime.CheckWitness(multiaddr) {
|
||||
panic("stopEstimation: only inner ring nodes can invoke this")
|
||||
|
@ -493,7 +514,7 @@ func estimationKey(epoch int, cid []byte) []byte {
|
|||
return append(result, cid...)
|
||||
}
|
||||
|
||||
func getContainerSizeEstimation(key, cid []byte) containerSizes {
|
||||
func getContainerSizeEstimation(ctx storage.Context, key, cid []byte) containerSizes {
|
||||
data := storage.Get(ctx, key)
|
||||
if data != nil {
|
||||
return binary.Deserialize(data.([]byte)).(containerSizes)
|
||||
|
@ -507,7 +528,7 @@ func getContainerSizeEstimation(key, cid []byte) containerSizes {
|
|||
|
||||
// isStorageNode looks into _previous_ epoch network map, because storage node
|
||||
// announce container size estimation of previous epoch.
|
||||
func isStorageNode(key interop.PublicKey) bool {
|
||||
func isStorageNode(ctx storage.Context, key interop.PublicKey) bool {
|
||||
netmapContractAddr := storage.Get(ctx, netmapContractKey).(interop.Hash160)
|
||||
snapshot := contract.Call(netmapContractAddr, "snapshot", contract.ReadOnly, 1).([]storageNode)
|
||||
|
||||
|
@ -523,7 +544,7 @@ func isStorageNode(key interop.PublicKey) bool {
|
|||
return false
|
||||
}
|
||||
|
||||
func keysToDelete(epoch int) [][]byte {
|
||||
func keysToDelete(ctx storage.Context, epoch int) [][]byte {
|
||||
results := [][]byte{}
|
||||
|
||||
it := storage.Find(ctx, []byte(estimateKeyPrefix), storage.KeysOnly)
|
||||
|
|
|
@ -76,16 +76,12 @@ const (
|
|||
|
||||
var (
|
||||
configPrefix = []byte("config")
|
||||
|
||||
ctx storage.Context
|
||||
)
|
||||
|
||||
func init() {
|
||||
ctx = storage.GetContext()
|
||||
}
|
||||
|
||||
// Init set up initial inner ring node keys.
|
||||
func Init(owner interop.PublicKey, args []interop.PublicKey) bool {
|
||||
ctx := storage.GetContext()
|
||||
|
||||
if !common.HasUpdateAccess(ctx) {
|
||||
panic("only owner can reinitialize contract")
|
||||
}
|
||||
|
@ -119,6 +115,8 @@ func Init(owner interop.PublicKey, args []interop.PublicKey) bool {
|
|||
|
||||
// Migrate updates smart contract execution script and manifest.
|
||||
func Migrate(script []byte, manifest []byte) bool {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
|
||||
if !common.HasUpdateAccess(ctx) {
|
||||
runtime.Log("only owner can update contract")
|
||||
return false
|
||||
|
@ -132,16 +130,20 @@ func Migrate(script []byte, manifest []byte) bool {
|
|||
|
||||
// InnerRingList returns array of inner ring node keys.
|
||||
func InnerRingList() []common.IRNode {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
return getInnerRingNodes(ctx, innerRingKey)
|
||||
}
|
||||
|
||||
// InnerRingCandidates returns array of inner ring candidate node keys.
|
||||
func InnerRingCandidates() []common.IRNode {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
return getInnerRingNodes(ctx, candidatesKey)
|
||||
}
|
||||
|
||||
// InnerRingCandidateRemove removes key from the list of inner ring candidates.
|
||||
func InnerRingCandidateRemove(key interop.PublicKey) bool {
|
||||
ctx := storage.GetContext()
|
||||
|
||||
if !runtime.CheckWitness(key) {
|
||||
panic("irCandidateRemove: you should be the owner of the public key")
|
||||
}
|
||||
|
@ -165,6 +167,8 @@ func InnerRingCandidateRemove(key interop.PublicKey) bool {
|
|||
|
||||
// InnerRingCandidateAdd adds key to the list of inner ring candidates.
|
||||
func InnerRingCandidateAdd(key interop.PublicKey) bool {
|
||||
ctx := storage.GetContext()
|
||||
|
||||
if !runtime.CheckWitness(key) {
|
||||
panic("irCandidateAdd: you should be the owner of the public key")
|
||||
}
|
||||
|
@ -268,6 +272,7 @@ func Withdraw(user []byte, amount int) bool {
|
|||
// Cheque sends gas assets back to the user if they were successfully
|
||||
// locked in NeoFS balance contract.
|
||||
func Cheque(id []byte, user interop.Hash160, amount int, lockAcc []byte) bool {
|
||||
ctx := storage.GetContext()
|
||||
irList := getInnerRingNodes(ctx, innerRingKey)
|
||||
threshold := len(irList)/3*2 + 1
|
||||
|
||||
|
@ -345,6 +350,8 @@ func Unbind(user []byte, keys []interop.PublicKey) bool {
|
|||
// InnerRingUpdate updates list of inner ring nodes with provided list of
|
||||
// public keys.
|
||||
func InnerRingUpdate(chequeID []byte, args []interop.PublicKey) bool {
|
||||
ctx := storage.GetContext()
|
||||
|
||||
if len(args) < minInnerRingSize {
|
||||
panic("irUpdate: bad arguments")
|
||||
}
|
||||
|
@ -418,6 +425,8 @@ loop:
|
|||
|
||||
// IsInnerRing returns 'true' if key is inside of inner ring list.
|
||||
func IsInnerRing(key []byte) bool {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
|
||||
if len(key) != publicKeySize {
|
||||
panic("isInnerRing: incorrect public key")
|
||||
}
|
||||
|
@ -436,11 +445,14 @@ func IsInnerRing(key []byte) bool {
|
|||
|
||||
// Config returns value of NeoFS configuration with provided key.
|
||||
func Config(key []byte) interface{} {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
return getConfig(ctx, key)
|
||||
}
|
||||
|
||||
// SetConfig key-value pair as a NeoFS runtime configuration value.
|
||||
func SetConfig(id, key, val []byte) bool {
|
||||
ctx := storage.GetContext()
|
||||
|
||||
// check if it is inner ring invocation
|
||||
irList := getInnerRingNodes(ctx, innerRingKey)
|
||||
threshold := len(irList)/3*2 + 1
|
||||
|
@ -478,6 +490,8 @@ func SetConfig(id, key, val []byte) bool {
|
|||
|
||||
// ListConfig returns array of all key-value pairs of NeoFS configuration.
|
||||
func ListConfig() []record {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
|
||||
var config []record
|
||||
|
||||
it := storage.Find(ctx, configPrefix, storage.None)
|
||||
|
@ -495,6 +509,8 @@ func ListConfig() []record {
|
|||
|
||||
// InitConfig set up initial NeoFS key-value configuration.
|
||||
func InitConfig(args [][]byte) bool {
|
||||
ctx := storage.GetContext()
|
||||
|
||||
if getConfig(ctx, candidateFeeConfigKey) != nil {
|
||||
panic("neofs: configuration already installed")
|
||||
}
|
||||
|
|
|
@ -23,13 +23,9 @@ const (
|
|||
containerContractKey = "containerScriptHash"
|
||||
)
|
||||
|
||||
var ctx storage.Context
|
||||
|
||||
func init() {
|
||||
ctx = storage.GetContext()
|
||||
}
|
||||
|
||||
func Init(owner, addrNetmap, addrContainer interop.Hash160) {
|
||||
ctx := storage.GetContext()
|
||||
|
||||
if !common.HasUpdateAccess(ctx) {
|
||||
panic("only owner can reinitialize contract")
|
||||
}
|
||||
|
@ -46,6 +42,8 @@ func Init(owner, addrNetmap, addrContainer interop.Hash160) {
|
|||
}
|
||||
|
||||
func Migrate(script []byte, manifest []byte) bool {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
|
||||
if !common.HasUpdateAccess(ctx) {
|
||||
runtime.Log("only owner can update contract")
|
||||
return false
|
||||
|
@ -62,6 +60,8 @@ func AddKey(owner []byte, keys []interop.PublicKey) bool {
|
|||
panic("addKey: incorrect owner")
|
||||
}
|
||||
|
||||
ctx := storage.GetContext()
|
||||
|
||||
multiaddr := common.InnerRingMultiAddressViaStorage(ctx, netmapContractKey)
|
||||
if !runtime.CheckWitness(multiaddr) {
|
||||
panic("addKey: invocation from non inner ring node")
|
||||
|
@ -97,6 +97,8 @@ func RemoveKey(owner []byte, keys []interop.PublicKey) bool {
|
|||
panic("removeKey: incorrect owner")
|
||||
}
|
||||
|
||||
ctx := storage.GetContext()
|
||||
|
||||
multiaddr := common.InnerRingMultiAddressViaStorage(ctx, netmapContractKey)
|
||||
if !runtime.CheckWitness(multiaddr) {
|
||||
panic("removeKey: invocation from non inner ring node")
|
||||
|
@ -134,6 +136,8 @@ func Key(owner []byte) [][]byte {
|
|||
panic("key: incorrect owner")
|
||||
}
|
||||
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
|
||||
info := getUserInfo(ctx, owner)
|
||||
|
||||
return info.Keys
|
||||
|
@ -162,6 +166,8 @@ func invokeIDKeys(owner []byte, keys [][]byte, prefix []byte) []byte {
|
|||
}
|
||||
|
||||
func fromKnownContract(caller []byte) bool {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
|
||||
containerContractAddr := storage.Get(ctx, containerContractKey).([]byte)
|
||||
if common.BytesEqual(caller, containerContractAddr) {
|
||||
return true
|
||||
|
@ -171,5 +177,6 @@ func fromKnownContract(caller []byte) bool {
|
|||
}
|
||||
|
||||
func irList() []common.IRNode {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
return common.InnerRingListViaStorage(ctx, netmapContractKey)
|
||||
}
|
||||
|
|
|
@ -49,17 +49,13 @@ const (
|
|||
|
||||
var (
|
||||
configPrefix = []byte("config")
|
||||
|
||||
ctx storage.Context
|
||||
)
|
||||
|
||||
func init() {
|
||||
ctx = storage.GetContext()
|
||||
}
|
||||
|
||||
// Init function sets up initial list of inner ring public keys and should
|
||||
// be invoked once at neofs infrastructure setup.
|
||||
func Init(owner interop.Hash160, keys []interop.PublicKey) {
|
||||
ctx := storage.GetContext()
|
||||
|
||||
if !common.HasUpdateAccess(ctx) {
|
||||
panic("only owner can reinitialize contract")
|
||||
}
|
||||
|
@ -87,6 +83,8 @@ func Init(owner interop.Hash160, keys []interop.PublicKey) {
|
|||
}
|
||||
|
||||
func Migrate(script []byte, manifest []byte) bool {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
|
||||
if !common.HasUpdateAccess(ctx) {
|
||||
runtime.Log("only owner can update contract")
|
||||
return false
|
||||
|
@ -99,14 +97,18 @@ func Migrate(script []byte, manifest []byte) bool {
|
|||
}
|
||||
|
||||
func InnerRingList() []common.IRNode {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
return getIRNodes(ctx)
|
||||
}
|
||||
|
||||
func Multiaddress() []byte {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
return multiaddress(getIRNodes(ctx))
|
||||
}
|
||||
|
||||
func UpdateInnerRing(keys []interop.PublicKey) bool {
|
||||
ctx := storage.GetContext()
|
||||
|
||||
multiaddr := Multiaddress()
|
||||
if !runtime.CheckWitness(multiaddr) {
|
||||
panic("updateInnerRing: this method must be invoked by inner ring nodes")
|
||||
|
@ -126,6 +128,8 @@ func UpdateInnerRing(keys []interop.PublicKey) bool {
|
|||
}
|
||||
|
||||
func AddPeer(nodeInfo []byte) bool {
|
||||
ctx := storage.GetContext()
|
||||
|
||||
multiaddr := Multiaddress()
|
||||
if !runtime.CheckWitness(multiaddr) {
|
||||
publicKey := nodeInfo[2:35] // offset:2, len:33
|
||||
|
@ -157,6 +161,8 @@ func UpdateState(state int, publicKey interop.PublicKey) bool {
|
|||
panic("updateState: incorrect public key")
|
||||
}
|
||||
|
||||
ctx := storage.GetContext()
|
||||
|
||||
multiaddr := Multiaddress()
|
||||
if !runtime.CheckWitness(multiaddr) {
|
||||
if !runtime.CheckWitness(publicKey) {
|
||||
|
@ -181,6 +187,8 @@ func UpdateState(state int, publicKey interop.PublicKey) bool {
|
|||
}
|
||||
|
||||
func NewEpoch(epochNum int) bool {
|
||||
ctx := storage.GetContext()
|
||||
|
||||
multiaddr := Multiaddress()
|
||||
if !runtime.CheckWitness(multiaddr) {
|
||||
panic("newEpoch: this method must be invoked by inner ring nodes")
|
||||
|
@ -211,15 +219,18 @@ func NewEpoch(epochNum int) bool {
|
|||
}
|
||||
|
||||
func Epoch() int {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
return storage.Get(ctx, snapshotEpoch).(int)
|
||||
}
|
||||
|
||||
func Netmap() []storageNode {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
return getSnapshot(ctx, snapshot0Key)
|
||||
}
|
||||
|
||||
func Snapshot(diff int) []storageNode {
|
||||
var key string
|
||||
|
||||
switch diff {
|
||||
case 0:
|
||||
key = snapshot0Key
|
||||
|
@ -229,16 +240,19 @@ func Snapshot(diff int) []storageNode {
|
|||
panic("snapshot: incorrect diff")
|
||||
}
|
||||
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
return getSnapshot(ctx, key)
|
||||
}
|
||||
|
||||
func SnapshotByEpoch(epoch int) []storageNode {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
currentEpoch := storage.Get(ctx, snapshotEpoch).(int)
|
||||
|
||||
return Snapshot(currentEpoch - epoch)
|
||||
}
|
||||
|
||||
func Config(key []byte) interface{} {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
return getConfig(ctx, key)
|
||||
}
|
||||
|
||||
|
@ -248,6 +262,8 @@ func SetConfig(id, key, val []byte) bool {
|
|||
panic("setConfig: invoked by non inner ring node")
|
||||
}
|
||||
|
||||
ctx := storage.GetContext()
|
||||
|
||||
setConfig(ctx, key, val)
|
||||
|
||||
runtime.Log("setConfig: configuration has been updated")
|
||||
|
@ -256,6 +272,8 @@ func SetConfig(id, key, val []byte) bool {
|
|||
}
|
||||
|
||||
func InitConfig(args [][]byte) bool {
|
||||
ctx := storage.GetContext()
|
||||
|
||||
if storage.Get(ctx, configuredKey) != nil {
|
||||
panic("netmap: configuration already installed")
|
||||
}
|
||||
|
@ -279,6 +297,8 @@ func InitConfig(args [][]byte) bool {
|
|||
}
|
||||
|
||||
func ListConfig() []record {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
|
||||
var config []record
|
||||
|
||||
it := storage.Find(ctx, configPrefix, storage.None)
|
||||
|
|
|
@ -15,12 +15,6 @@ const (
|
|||
netmapContractKey = "netmapScriptHash"
|
||||
)
|
||||
|
||||
var ctx storage.Context
|
||||
|
||||
func init() {
|
||||
ctx = storage.GetContext()
|
||||
}
|
||||
|
||||
func OnNEP17Payment(from interop.Hash160, amount int, data interface{}) {
|
||||
caller := runtime.GetCallingScriptHash()
|
||||
if !common.BytesEqual(caller, []byte(gas.Hash)) {
|
||||
|
@ -29,6 +23,8 @@ func OnNEP17Payment(from interop.Hash160, amount int, data interface{}) {
|
|||
}
|
||||
|
||||
func Init(owner, addrNetmap interop.Hash160) {
|
||||
ctx := storage.GetContext()
|
||||
|
||||
if !common.HasUpdateAccess(ctx) {
|
||||
panic("only owner can reinitialize contract")
|
||||
}
|
||||
|
@ -44,6 +40,8 @@ func Init(owner, addrNetmap interop.Hash160) {
|
|||
}
|
||||
|
||||
func Migrate(script []byte, manifest []byte) bool {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
|
||||
if !common.HasUpdateAccess(ctx) {
|
||||
runtime.Log("only owner can update contract")
|
||||
return false
|
||||
|
@ -56,7 +54,9 @@ func Migrate(script []byte, manifest []byte) bool {
|
|||
}
|
||||
|
||||
func Verify() bool {
|
||||
ctx := storage.GetReadOnlyContext()
|
||||
sig := common.InnerRingMultiAddressViaStorage(ctx, netmapContractKey)
|
||||
|
||||
return runtime.CheckWitness(sig)
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue