forked from TrueCloudLab/frostfs-contract
[TrueCloudLab#3] neofs: Rename contract to frostfs
Signed-off-by: Denis Kirillov <d.kirillov@yadro.com>
This commit is contained in:
parent
e95c598dfc
commit
0093e89ad9
5 changed files with 39 additions and 39 deletions
2
Makefile
2
Makefile
|
@ -15,7 +15,7 @@ sidechain: alphabet morph nns
|
||||||
|
|
||||||
alphabet_sc = alphabet
|
alphabet_sc = alphabet
|
||||||
morph_sc = audit balance container neofsid netmap proxy reputation subnet
|
morph_sc = audit balance container neofsid netmap proxy reputation subnet
|
||||||
mainnet_sc = neofs processing
|
mainnet_sc = frostfs processing
|
||||||
nns_sc = nns
|
nns_sc = nns
|
||||||
|
|
||||||
define sc_template
|
define sc_template
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
name: "NeoFS"
|
name: "FrostFS"
|
||||||
safemethods: ["alphabetList", "alphabetAddress", "innerRingCandidates", "config", "listConfig", "version"]
|
safemethods: ["alphabetList", "alphabetAddress", "innerRingCandidates", "config", "listConfig", "version"]
|
||||||
permissions:
|
permissions:
|
||||||
- methods: ["update", "transfer"]
|
- methods: ["update", "transfer"]
|
|
@ -1,21 +1,21 @@
|
||||||
/*
|
/*
|
||||||
NeoFS contract is a contract deployed in NeoFS mainchain.
|
FrostFS contract is a contract deployed in FrostFS mainchain.
|
||||||
|
|
||||||
NeoFS contract is an entry point to NeoFS users. This contract stores all NeoFS
|
FrostFS contract is an entry point to FrostFS users. This contract stores all FrostFS
|
||||||
related GAS, registers new Inner Ring candidates and produces notifications
|
related GAS, registers new Inner Ring candidates and produces notifications
|
||||||
to control the sidechain.
|
to control the sidechain.
|
||||||
|
|
||||||
While mainchain committee controls the list of Alphabet nodes in native
|
While mainchain committee controls the list of Alphabet nodes in native
|
||||||
RoleManagement contract, NeoFS can't change more than 1\3 keys at a time.
|
RoleManagement contract, FrostFS can't change more than 1\3 keys at a time.
|
||||||
NeoFS contract contains the actual list of Alphabet nodes in the sidechain.
|
FrostFS contract contains the actual list of Alphabet nodes in the sidechain.
|
||||||
|
|
||||||
Network configuration is also stored in NeoFS contract. All changes in
|
Network configuration is also stored in FrostFS contract. All changes in
|
||||||
configuration are mirrored in the sidechain with notifications.
|
configuration are mirrored in the sidechain with notifications.
|
||||||
|
|
||||||
# Contract notifications
|
# Contract notifications
|
||||||
|
|
||||||
Deposit notification. This notification is produced when user transfers native
|
Deposit notification. This notification is produced when user transfers native
|
||||||
GAS to the NeoFS contract address. The same amount of NEOFS token will be
|
GAS to the FrostFS contract address. The same amount of FROSTFS token will be
|
||||||
minted in Balance contract in the sidechain.
|
minted in Balance contract in the sidechain.
|
||||||
|
|
||||||
Deposit:
|
Deposit:
|
||||||
|
@ -29,7 +29,7 @@ minted in Balance contract in the sidechain.
|
||||||
type: Hash256
|
type: Hash256
|
||||||
|
|
||||||
Withdraw notification. This notification is produced when a user wants to
|
Withdraw notification. This notification is produced when a user wants to
|
||||||
withdraw GAS from the internal NeoFS balance and has paid fee for that.
|
withdraw GAS from the internal FrostFS balance and has paid fee for that.
|
||||||
|
|
||||||
Withdraw:
|
Withdraw:
|
||||||
- name: user
|
- name: user
|
||||||
|
@ -39,7 +39,7 @@ withdraw GAS from the internal NeoFS balance and has paid fee for that.
|
||||||
- name: txHash
|
- name: txHash
|
||||||
type: Hash256
|
type: Hash256
|
||||||
|
|
||||||
Cheque notification. This notification is produced when NeoFS contract
|
Cheque notification. This notification is produced when FrostFS contract
|
||||||
has successfully transferred assets back to the user after withdraw.
|
has successfully transferred assets back to the user after withdraw.
|
||||||
|
|
||||||
Cheque:
|
Cheque:
|
||||||
|
@ -81,7 +81,7 @@ contains public keys of new alphabet nodes.
|
||||||
type: Array
|
type: Array
|
||||||
|
|
||||||
SetConfig notification. This notification is produced when Alphabet nodes update
|
SetConfig notification. This notification is produced when Alphabet nodes update
|
||||||
NeoFS network configuration value.
|
FrostFS network configuration value.
|
||||||
|
|
||||||
SetConfig
|
SetConfig
|
||||||
- name: id
|
- name: id
|
||||||
|
@ -91,4 +91,4 @@ NeoFS network configuration value.
|
||||||
- name: value
|
- name: value
|
||||||
type: ByteArray
|
type: ByteArray
|
||||||
*/
|
*/
|
||||||
package neofs
|
package frostfs
|
|
@ -1,4 +1,4 @@
|
||||||
package neofs
|
package frostfs
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/TrueCloudLab/frostfs-contract/common"
|
"github.com/TrueCloudLab/frostfs-contract/common"
|
||||||
|
@ -85,7 +85,7 @@ func _deploy(data interface{}, isUpdate bool) {
|
||||||
storage.Put(ctx, notaryDisabledKey, args.notaryDisabled)
|
storage.Put(ctx, notaryDisabledKey, args.notaryDisabled)
|
||||||
if args.notaryDisabled {
|
if args.notaryDisabled {
|
||||||
common.InitVote(ctx)
|
common.InitVote(ctx)
|
||||||
runtime.Log("neofs contract notary disabled")
|
runtime.Log("frostfs contract notary disabled")
|
||||||
}
|
}
|
||||||
|
|
||||||
ln := len(args.config)
|
ln := len(args.config)
|
||||||
|
@ -100,7 +100,7 @@ func _deploy(data interface{}, isUpdate bool) {
|
||||||
setConfig(ctx, key, val)
|
setConfig(ctx, key, val)
|
||||||
}
|
}
|
||||||
|
|
||||||
runtime.Log("neofs: contract initialized")
|
runtime.Log("frostfs: contract initialized")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update method updates contract source code and manifest. It can be invoked
|
// Update method updates contract source code and manifest. It can be invoked
|
||||||
|
@ -114,7 +114,7 @@ func Update(script []byte, manifest []byte, data interface{}) {
|
||||||
|
|
||||||
contract.Call(interop.Hash160(management.Hash), "update",
|
contract.Call(interop.Hash160(management.Hash), "update",
|
||||||
contract.All, script, manifest, common.AppendVersion(data))
|
contract.All, script, manifest, common.AppendVersion(data))
|
||||||
runtime.Log("neofs contract updated")
|
runtime.Log("frostfs contract updated")
|
||||||
}
|
}
|
||||||
|
|
||||||
// AlphabetList returns an array of alphabet node keys. It is used in sidechain notary
|
// AlphabetList returns an array of alphabet node keys. It is used in sidechain notary
|
||||||
|
@ -205,7 +205,7 @@ func InnerRingCandidateRemove(key interop.PublicKey) {
|
||||||
// It can be invoked only by the candidate itself.
|
// It can be invoked only by the candidate itself.
|
||||||
//
|
//
|
||||||
// This method transfers fee from a candidate to the contract account.
|
// This method transfers fee from a candidate to the contract account.
|
||||||
// Fee value is specified in NeoFS network config with the key InnerRingCandidateFee.
|
// Fee value is specified in FrostFS network config with the key InnerRingCandidateFee.
|
||||||
func InnerRingCandidateAdd(key interop.PublicKey) {
|
func InnerRingCandidateAdd(key interop.PublicKey) {
|
||||||
ctx := storage.GetContext()
|
ctx := storage.GetContext()
|
||||||
|
|
||||||
|
@ -231,7 +231,7 @@ func InnerRingCandidateAdd(key interop.PublicKey) {
|
||||||
|
|
||||||
// OnNEP17Payment is a callback for NEP-17 compatible native GAS contract.
|
// OnNEP17Payment is a callback for NEP-17 compatible native GAS contract.
|
||||||
// It takes no more than 9000.0 GAS. Native GAS has precision 8, and
|
// It takes no more than 9000.0 GAS. Native GAS has precision 8, and
|
||||||
// NeoFS balance contract has precision 12. Values bigger than 9000.0 can
|
// FrostFS balance contract has precision 12. Values bigger than 9000.0 can
|
||||||
// break JSON limits for integers when precision is converted.
|
// break JSON limits for integers when precision is converted.
|
||||||
func OnNEP17Payment(from interop.Hash160, amount int, data interface{}) {
|
func OnNEP17Payment(from interop.Hash160, amount int, data interface{}) {
|
||||||
rcv := data.(interop.Hash160)
|
rcv := data.(interop.Hash160)
|
||||||
|
@ -264,13 +264,13 @@ func OnNEP17Payment(from interop.Hash160, amount int, data interface{}) {
|
||||||
runtime.Notify("Deposit", from, amount, rcv, tx.Hash)
|
runtime.Notify("Deposit", from, amount, rcv, tx.Hash)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Withdraw initializes gas asset withdraw from NeoFS. It can be invoked only
|
// Withdraw initializes gas asset withdraw from FrostFS. It can be invoked only
|
||||||
// by the specified user.
|
// by the specified user.
|
||||||
//
|
//
|
||||||
// This method produces Withdraw notification to lock assets in the sidechain and
|
// This method produces Withdraw notification to lock assets in the sidechain and
|
||||||
// transfers withdraw fee from a user account to each Alphabet node. If notary
|
// transfers withdraw fee from a user account to each Alphabet node. If notary
|
||||||
// is enabled in the mainchain, fee is transferred to Processing contract.
|
// is enabled in the mainchain, fee is transferred to Processing contract.
|
||||||
// Fee value is specified in NeoFS network config with the key WithdrawFee.
|
// Fee value is specified in FrostFS network config with the key WithdrawFee.
|
||||||
func Withdraw(user interop.Hash160, amount int) {
|
func Withdraw(user interop.Hash160, amount int) {
|
||||||
if !runtime.CheckWitness(user) {
|
if !runtime.CheckWitness(user) {
|
||||||
panic("you should be the owner of the wallet")
|
panic("you should be the owner of the wallet")
|
||||||
|
@ -317,7 +317,7 @@ func Withdraw(user interop.Hash160, amount int) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cheque transfers GAS back to the user from the contract account, if assets were
|
// Cheque transfers GAS back to the user from the contract account, if assets were
|
||||||
// successfully locked in NeoFS balance contract. It can be invoked only by
|
// successfully locked in FrostFS balance contract. It can be invoked only by
|
||||||
// Alphabet nodes.
|
// Alphabet nodes.
|
||||||
//
|
//
|
||||||
// This method produces Cheque notification to burn assets in sidechain.
|
// This method produces Cheque notification to burn assets in sidechain.
|
||||||
|
@ -363,7 +363,7 @@ func Cheque(id []byte, user interop.Hash160, amount int, lockAcc []byte) {
|
||||||
runtime.Notify("Cheque", id, user, amount, lockAcc)
|
runtime.Notify("Cheque", id, user, amount, lockAcc)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bind method produces notification to bind the specified public keys in NeoFSID
|
// Bind method produces notification to bind the specified public keys in FrostFSID
|
||||||
// contract in the sidechain. It can be invoked only by specified user.
|
// contract in the sidechain. It can be invoked only by specified user.
|
||||||
//
|
//
|
||||||
// This method produces Bind notification. This method panics if keys are not
|
// This method produces Bind notification. This method panics if keys are not
|
||||||
|
@ -383,7 +383,7 @@ func Bind(user []byte, keys []interop.PublicKey) {
|
||||||
runtime.Notify("Bind", user, keys)
|
runtime.Notify("Bind", user, keys)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unbind method produces notification to unbind the specified public keys in NeoFSID
|
// Unbind method produces notification to unbind the specified public keys in FrostFSID
|
||||||
// contract in the sidechain. It can be invoked only by the specified user.
|
// contract in the sidechain. It can be invoked only by the specified user.
|
||||||
//
|
//
|
||||||
// This method produces Unbind notification. This method panics if keys are not
|
// This method produces Unbind notification. This method panics if keys are not
|
||||||
|
@ -407,7 +407,7 @@ func Unbind(user []byte, keys []interop.PublicKey) {
|
||||||
// public keys. It can be invoked only by alphabet nodes.
|
// public keys. It can be invoked only by alphabet nodes.
|
||||||
//
|
//
|
||||||
// This method is used in notary disabled sidechain environment. In this case,
|
// This method is used in notary disabled sidechain environment. In this case,
|
||||||
// the actual alphabet list should be stored in the NeoFS contract.
|
// the actual alphabet list should be stored in the FrostFS contract.
|
||||||
func AlphabetUpdate(id []byte, args []interop.PublicKey) {
|
func AlphabetUpdate(id []byte, args []interop.PublicKey) {
|
||||||
ctx := storage.GetContext()
|
ctx := storage.GetContext()
|
||||||
notaryDisabled := storage.Get(ctx, notaryDisabledKey).(bool)
|
notaryDisabled := storage.Get(ctx, notaryDisabledKey).(bool)
|
||||||
|
@ -460,14 +460,14 @@ func AlphabetUpdate(id []byte, args []interop.PublicKey) {
|
||||||
runtime.Log("alphabet list has been updated")
|
runtime.Log("alphabet list has been updated")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Config returns configuration value of NeoFS configuration. If the key does
|
// Config returns configuration value of FrostFS configuration. If the key does
|
||||||
// not exists, returns nil.
|
// not exists, returns nil.
|
||||||
func Config(key []byte) interface{} {
|
func Config(key []byte) interface{} {
|
||||||
ctx := storage.GetReadOnlyContext()
|
ctx := storage.GetReadOnlyContext()
|
||||||
return getConfig(ctx, key)
|
return getConfig(ctx, key)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetConfig key-value pair as a NeoFS runtime configuration value. It can be invoked
|
// SetConfig key-value pair as a FrostFS runtime configuration value. It can be invoked
|
||||||
// only by Alphabet nodes.
|
// only by Alphabet nodes.
|
||||||
func SetConfig(id, key, val []byte) {
|
func SetConfig(id, key, val []byte) {
|
||||||
ctx := storage.GetContext()
|
ctx := storage.GetContext()
|
||||||
|
@ -507,7 +507,7 @@ func SetConfig(id, key, val []byte) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListConfig returns an array of structures that contain a key and a value of all
|
// ListConfig returns an array of structures that contain a key and a value of all
|
||||||
// NeoFS configuration records. Key and value are both byte arrays.
|
// FrostFS configuration records. Key and value are both byte arrays.
|
||||||
func ListConfig() []record {
|
func ListConfig() []record {
|
||||||
ctx := storage.GetReadOnlyContext()
|
ctx := storage.GetReadOnlyContext()
|
||||||
|
|
||||||
|
@ -542,7 +542,7 @@ func getAlphabetNodes(ctx storage.Context) []interop.PublicKey {
|
||||||
return []interop.PublicKey{}
|
return []interop.PublicKey{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// getConfig returns the installed neofs configuration value or nil if it is not set.
|
// getConfig returns the installed frostfs configuration value or nil if it is not set.
|
||||||
func getConfig(ctx storage.Context, key interface{}) interface{} {
|
func getConfig(ctx storage.Context, key interface{}) interface{} {
|
||||||
postfix := key.([]byte)
|
postfix := key.([]byte)
|
||||||
storageKey := append(configPrefix, postfix...)
|
storageKey := append(configPrefix, postfix...)
|
||||||
|
@ -550,7 +550,7 @@ func getConfig(ctx storage.Context, key interface{}) interface{} {
|
||||||
return storage.Get(ctx, storageKey)
|
return storage.Get(ctx, storageKey)
|
||||||
}
|
}
|
||||||
|
|
||||||
// setConfig sets a neofs configuration value in the contract storage.
|
// setConfig sets a frostfs configuration value in the contract storage.
|
||||||
func setConfig(ctx storage.Context, key, val interface{}) {
|
func setConfig(ctx storage.Context, key, val interface{}) {
|
||||||
postfix := key.([]byte)
|
postfix := key.([]byte)
|
||||||
storageKey := append(configPrefix, postfix...)
|
storageKey := append(configPrefix, postfix...)
|
|
@ -6,7 +6,7 @@ import (
|
||||||
"sort"
|
"sort"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/TrueCloudLab/frostfs-contract/neofs"
|
"github.com/TrueCloudLab/frostfs-contract/frostfs"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/native/nativenames"
|
"github.com/nspcc-dev/neo-go/pkg/core/native/nativenames"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/neotest"
|
"github.com/nspcc-dev/neo-go/pkg/neotest"
|
||||||
|
@ -18,9 +18,9 @@ import (
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
const neofsPath = "../neofs"
|
const frostfsPath = "../frostfs"
|
||||||
|
|
||||||
func deployNeoFSContract(t *testing.T, e *neotest.Executor, addrProc util.Uint160,
|
func deployFrostFSContract(t *testing.T, e *neotest.Executor, addrProc util.Uint160,
|
||||||
pubs keys.PublicKeys, config ...interface{}) util.Uint160 {
|
pubs keys.PublicKeys, config ...interface{}) util.Uint160 {
|
||||||
args := make([]interface{}, 5)
|
args := make([]interface{}, 5)
|
||||||
args[0] = false
|
args[0] = false
|
||||||
|
@ -33,12 +33,12 @@ func deployNeoFSContract(t *testing.T, e *neotest.Executor, addrProc util.Uint16
|
||||||
args[2] = arr
|
args[2] = arr
|
||||||
args[3] = append([]interface{}{}, config...)
|
args[3] = append([]interface{}{}, config...)
|
||||||
|
|
||||||
c := neotest.CompileFile(t, e.CommitteeHash, neofsPath, path.Join(neofsPath, "config.yml"))
|
c := neotest.CompileFile(t, e.CommitteeHash, frostfsPath, path.Join(frostfsPath, "config.yml"))
|
||||||
e.DeployContract(t, c, args)
|
e.DeployContract(t, c, args)
|
||||||
return c.Hash
|
return c.Hash
|
||||||
}
|
}
|
||||||
|
|
||||||
func newNeoFSInvoker(t *testing.T, n int, config ...interface{}) (*neotest.ContractInvoker, neotest.Signer, keys.PublicKeys) {
|
func newFrostFSInvoker(t *testing.T, n int, config ...interface{}) (*neotest.ContractInvoker, neotest.Signer, keys.PublicKeys) {
|
||||||
e := newExecutor(t)
|
e := newExecutor(t)
|
||||||
|
|
||||||
accounts := make([]*wallet.Account, n)
|
accounts := make([]*wallet.Account, n)
|
||||||
|
@ -66,7 +66,7 @@ func newNeoFSInvoker(t *testing.T, n int, config ...interface{}) (*neotest.Contr
|
||||||
}
|
}
|
||||||
|
|
||||||
alphabet := neotest.NewMultiSigner(accounts...)
|
alphabet := neotest.NewMultiSigner(accounts...)
|
||||||
h := deployNeoFSContract(t, e, util.Uint160{}, pubs, config...)
|
h := deployFrostFSContract(t, e, util.Uint160{}, pubs, config...)
|
||||||
|
|
||||||
gasHash, err := e.Chain.GetNativeContractScriptHash(nativenames.Gas)
|
gasHash, err := e.Chain.GetNativeContractScriptHash(nativenames.Gas)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
@ -79,10 +79,10 @@ func newNeoFSInvoker(t *testing.T, n int, config ...interface{}) (*neotest.Contr
|
||||||
return e.CommitteeInvoker(h).WithSigners(alphabet), alphabet, pubs
|
return e.CommitteeInvoker(h).WithSigners(alphabet), alphabet, pubs
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestNeoFS_AlphabetList(t *testing.T) {
|
func TestFrostFS_AlphabetList(t *testing.T) {
|
||||||
const alphabetSize = 4
|
const alphabetSize = 4
|
||||||
|
|
||||||
e, _, pubs := newNeoFSInvoker(t, alphabetSize)
|
e, _, pubs := newFrostFSInvoker(t, alphabetSize)
|
||||||
arr := make([]stackitem.Item, len(pubs))
|
arr := make([]stackitem.Item, len(pubs))
|
||||||
for i := range arr {
|
for i := range arr {
|
||||||
arr[i] = stackitem.NewStruct([]stackitem.Item{
|
arr[i] = stackitem.NewStruct([]stackitem.Item{
|
||||||
|
@ -93,8 +93,8 @@ func TestNeoFS_AlphabetList(t *testing.T) {
|
||||||
e.Invoke(t, stackitem.NewArray(arr), "alphabetList")
|
e.Invoke(t, stackitem.NewArray(arr), "alphabetList")
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestNeoFS_InnerRingCandidate(t *testing.T) {
|
func TestFrostFS_InnerRingCandidate(t *testing.T) {
|
||||||
e, _, _ := newNeoFSInvoker(t, 4, neofs.CandidateFeeConfigKey, int64(10))
|
e, _, _ := newFrostFSInvoker(t, 4, frostfs.CandidateFeeConfigKey, int64(10))
|
||||||
|
|
||||||
const candidateCount = 3
|
const candidateCount = 3
|
||||||
|
|
Loading…
Reference in a new issue