forked from TrueCloudLab/frostfs-node
[#1320] English Check
Signed-off-by: Elizaveta Chichindaeva <elizaveta@nspcc.ru>
This commit is contained in:
parent
d99800ee93
commit
cc7a723d77
182 changed files with 802 additions and 802 deletions
|
@ -14,7 +14,7 @@
|
||||||
|
|
||||||
NeoFS Nodes are organized in a peer-to-peer network that takes care of storing
|
NeoFS Nodes are organized in a peer-to-peer network that takes care of storing
|
||||||
and distributing user's data. Any Neo user may participate in the network and
|
and distributing user's data. Any Neo user may participate in the network and
|
||||||
get paid for providing storage resources to other users or store his data in
|
get paid for providing storage resources to other users or store their data in
|
||||||
NeoFS and pay a competitive price for it.
|
NeoFS and pay a competitive price for it.
|
||||||
|
|
||||||
Users can reliably store object data in the NeoFS network and have a transparent
|
Users can reliably store object data in the NeoFS network and have a transparent
|
||||||
|
@ -40,7 +40,7 @@ developers to integrate applications without rewriting their code.
|
||||||
|
|
||||||
# Supported platforms
|
# Supported platforms
|
||||||
|
|
||||||
For now we only support GNU/Linux on amd64 CPUs with AVX/AVX2 instructions. More
|
Now, we only support GNU/Linux on amd64 CPUs with AVX/AVX2 instructions. More
|
||||||
platforms will be officially supported after release `1.0`.
|
platforms will be officially supported after release `1.0`.
|
||||||
|
|
||||||
The latest version of neofs-node works with neofs-contract
|
The latest version of neofs-node works with neofs-contract
|
||||||
|
|
|
@ -5,14 +5,14 @@
|
||||||
Admin tool provides an easier way to deploy and maintain private installation
|
Admin tool provides an easier way to deploy and maintain private installation
|
||||||
of NeoFS. Private installation provides a set of N3 consensus nodes, NeoFS
|
of NeoFS. Private installation provides a set of N3 consensus nodes, NeoFS
|
||||||
Alphabet, and Storage nodes. Admin tool generates consensus keys, initializes
|
Alphabet, and Storage nodes. Admin tool generates consensus keys, initializes
|
||||||
side chain, and provides functions to update the network and register new
|
the sidechain, and provides functions to update the network and register new
|
||||||
Storage nodes.
|
Storage nodes.
|
||||||
|
|
||||||
## Build
|
## Build
|
||||||
|
|
||||||
To build binary locally, use `make bin/neofs-adm` command.
|
To build binary locally, use `make bin/neofs-adm` command.
|
||||||
|
|
||||||
For clean build inside a docker container use `make docker/bin/neofs-adm`.
|
For clean build inside a docker container, use `make docker/bin/neofs-adm`.
|
||||||
|
|
||||||
Build docker image with `make image-adm`.
|
Build docker image with `make image-adm`.
|
||||||
|
|
||||||
|
@ -25,18 +25,18 @@ contracts. Find them in the latest release of
|
||||||
|
|
||||||
### Config
|
### Config
|
||||||
|
|
||||||
Config section provides `init` command that creates configuration file for the
|
Config section provides `init` command that creates a configuration file for
|
||||||
private installation deployment and updates. Config file is optional, all
|
private installation deployment and updates. Config file is optional, all
|
||||||
parameters can be passed by arguments or read from standard input (wallet
|
parameters can be passed by arguments or read from standard input (wallet
|
||||||
passwords).
|
passwords).
|
||||||
|
|
||||||
Config example:
|
Config example:
|
||||||
```yaml
|
```yaml
|
||||||
rpc-endpoint: https://address:port # side chain RPC node endpoint
|
rpc-endpoint: https://address:port # sidechain RPC node endpoint
|
||||||
alphabet-wallets: /path # path to consensus node / alphabet wallets storage
|
alphabet-wallets: /path # path to consensus node / alphabet wallets storage
|
||||||
network:
|
network:
|
||||||
max_object_size: 67108864 # max size of single NeoFS object, bytes
|
max_object_size: 67108864 # max size of a single NeoFS object, bytes
|
||||||
epoch_duration: 240 # duration of NeoFS epoch in blocks, consider block generation frequency in side chain
|
epoch_duration: 240 # duration of a NeoFS epoch in blocks, consider block generation frequency in the sidechain
|
||||||
basic_income_rate: 0 # basic income rate, for private consider 0
|
basic_income_rate: 0 # basic income rate, for private consider 0
|
||||||
fee:
|
fee:
|
||||||
audit: 0 # network audit fee, for private installation consider 0
|
audit: 0 # network audit fee, for private installation consider 0
|
||||||
|
@ -61,11 +61,11 @@ credentials: # passwords for consensus node / alphabet wallets
|
||||||
- `generate-alphabet` generates a set of wallets for consensus and
|
- `generate-alphabet` generates a set of wallets for consensus and
|
||||||
Alphabet nodes.
|
Alphabet nodes.
|
||||||
|
|
||||||
- `init` initializes side chain by deploying smart contracts and
|
- `init` initializes the sidechain by deploying smart contracts and
|
||||||
setting provided NeoFS network configuration.
|
setting provided NeoFS network configuration.
|
||||||
|
|
||||||
- `generate-storage-wallet` generates wallet for the Storage node that
|
- `generate-storage-wallet` generates a wallet for the Storage node that
|
||||||
is ready for deployment. It also transfers a bit of side chain GAS, so this
|
is ready for deployment. It also transfers a bit of sidechain GAS, so this
|
||||||
wallet can be used for NeoFS bootstrap.
|
wallet can be used for NeoFS bootstrap.
|
||||||
|
|
||||||
#### Network maintenance
|
#### Network maintenance
|
||||||
|
@ -73,20 +73,20 @@ credentials: # passwords for consensus node / alphabet wallets
|
||||||
- `force-new-epoch` increments NeoFS epoch number and executes new epoch
|
- `force-new-epoch` increments NeoFS epoch number and executes new epoch
|
||||||
handlers in NeoFS nodes.
|
handlers in NeoFS nodes.
|
||||||
|
|
||||||
- `refill-gas` transfers side chain GAS to the specified wallet.
|
- `refill-gas` transfers sidechain GAS to the specified wallet.
|
||||||
|
|
||||||
- `update-contracts` updates contracts to a new version.
|
- `update-contracts` updates contracts to a new version.
|
||||||
|
|
||||||
#### Container migration
|
#### Container migration
|
||||||
|
|
||||||
If the network has to be redeployed, these commands will migrate all container meta
|
If a network has to be redeployed, these commands will migrate all container meta
|
||||||
info. These commands **do not migrate actual objects**.
|
info. These commands **do not migrate actual objects**.
|
||||||
|
|
||||||
- `dump-containers` saves all containers and metadata registered in the container
|
- `dump-containers` saves all containers and metadata registered in the container
|
||||||
contract to a file.
|
contract to a file.
|
||||||
|
|
||||||
- `restore-containers` restores previously saved containers by their repeated registration in
|
- `restore-containers` restores previously saved containers by their repeated registration in
|
||||||
container contract.
|
the container contract.
|
||||||
|
|
||||||
#### Network info
|
#### Network info
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# Step-by-step private NeoFS deployment
|
# Step-by-step private NeoFS deployment
|
||||||
|
|
||||||
This is a short guide on how to deploy private NeoFS storage network on bare
|
This is a short guide on how to deploy a private NeoFS storage network on bare
|
||||||
metal without docker images. This guide does not cover details on how to start
|
metal without docker images. This guide does not cover details on how to start
|
||||||
consensus, Alphabet, or Storage nodes. This guide covers only `neofs-adm`
|
consensus, Alphabet, or Storage nodes. This guide covers only `neofs-adm`
|
||||||
related configuration details.
|
related configuration details.
|
||||||
|
@ -14,13 +14,13 @@ To follow this guide you need:
|
||||||
|
|
||||||
## Step 1: Prepare network configuration
|
## Step 1: Prepare network configuration
|
||||||
|
|
||||||
To start the network, you need a set of consensus nodes, the same number of
|
To start a network, you need a set of consensus nodes, the same number of
|
||||||
Alphabet nodes and any number of Storage nodes. While the number of Storage
|
Alphabet nodes and any number of Storage nodes. While the number of Storage
|
||||||
nodes can be scaled almost infinitely, the number of consensus and Alphabet
|
nodes can be scaled almost infinitely, the number of consensus and Alphabet
|
||||||
nodes can't be changed so easily right now. Consider this before going any further.
|
nodes can't be changed so easily right now. Consider this before going any further.
|
||||||
|
|
||||||
It is easier to use`neofs-adm` with predefined configuration. First, create
|
It is easier to use`neofs-adm` with a predefined configuration. First, create
|
||||||
network configuration file. In this example, there is going to be only one
|
a network configuration file. In this example, there is going to be only one
|
||||||
consensus / Alphabet node in the network.
|
consensus / Alphabet node in the network.
|
||||||
|
|
||||||
```
|
```
|
||||||
|
@ -43,7 +43,7 @@ credentials:
|
||||||
az: hunter2
|
az: hunter2
|
||||||
```
|
```
|
||||||
|
|
||||||
For private installation it is recommended to set all **fees** and **basic
|
For private installation, it is recommended to set all **fees** and **basic
|
||||||
income rate** to 0.
|
income rate** to 0.
|
||||||
|
|
||||||
As for **epoch duration**, consider consensus node block generation frequency.
|
As for **epoch duration**, consider consensus node block generation frequency.
|
||||||
|
@ -63,7 +63,7 @@ alphabet-wallets: /home/user/deploy/alphabet-wallets
|
||||||
wallet[0]: hunter2
|
wallet[0]: hunter2
|
||||||
```
|
```
|
||||||
|
|
||||||
Do not lose wallet files and network config. Store it in encrypted backed up
|
Do not lose wallet files and network config. Store it in an encrypted backed up
|
||||||
storage.
|
storage.
|
||||||
|
|
||||||
## Step 2: Launch consensus nodes
|
## Step 2: Launch consensus nodes
|
||||||
|
@ -72,7 +72,7 @@ Configure blockchain nodes with the generated wallets from the previous step.
|
||||||
Config examples can be found in
|
Config examples can be found in
|
||||||
[neo-go repository](https://github.com/nspcc-dev/neo-go/tree/master/config).
|
[neo-go repository](https://github.com/nspcc-dev/neo-go/tree/master/config).
|
||||||
|
|
||||||
Gather public keys from **all** generated wallets. We are interested in first
|
Gather public keys from **all** generated wallets. We are interested in the first
|
||||||
`simple signature contract` public key.
|
`simple signature contract` public key.
|
||||||
|
|
||||||
```
|
```
|
||||||
|
@ -90,7 +90,7 @@ NiMKabp3ddi3xShmLAXhTfbnuWb4cSJT6E (1 out of 1 multisig contract):
|
||||||
Put the list of public keys into `ProtocolConfiguration.StandbyCommittee`
|
Put the list of public keys into `ProtocolConfiguration.StandbyCommittee`
|
||||||
section. Specify the wallet path and the password in `ApplicationConfiguration.P2PNotary`
|
section. Specify the wallet path and the password in `ApplicationConfiguration.P2PNotary`
|
||||||
and `ApplicationConfiguration.UnlockWallet` sections. If config includes
|
and `ApplicationConfiguration.UnlockWallet` sections. If config includes
|
||||||
`ProtocolConfiguration.NativeActivations` section, then add notary
|
`ProtocolConfiguration.NativeActivations` section, add notary
|
||||||
contract `Notary: [0]`.
|
contract `Notary: [0]`.
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
|
@ -110,15 +110,15 @@ ApplicationConfiguration:
|
||||||
Password: "hunter2"
|
Password: "hunter2"
|
||||||
```
|
```
|
||||||
|
|
||||||
Then, launch consensus node. They should connect to each other and start
|
Then, launch consensus nodes. They should connect to each other and start
|
||||||
producing blocks in consensus. You might want to deploy additional RPC
|
producing blocks in consensus. You might want to deploy additional RPC
|
||||||
nodes at this stage because Storage nodes should be connected to the chain too.
|
nodes at this stage because Storage nodes should be connected to the chain too.
|
||||||
It is not recommended to use consensus node as an RPC node due to security policies
|
It is not recommended to use a consensus node as an RPC node due to security policies
|
||||||
and possible overload issues.
|
and possible overload issues.
|
||||||
|
|
||||||
## Step 3: Initialize side chain
|
## Step 3: Initialize sidechain
|
||||||
|
|
||||||
Use archive with compiled NeoFS contracts to initialize side chain.
|
Use archive with compiled NeoFS contracts to initialize the sidechain.
|
||||||
|
|
||||||
```
|
```
|
||||||
$ tar -xzvf neofs-contract-v0.11.0.tar.gz
|
$ tar -xzvf neofs-contract-v0.11.0.tar.gz
|
||||||
|
@ -154,7 +154,7 @@ Waiting for transactions to persist...
|
||||||
## Step 4: Launch Alphabet nodes
|
## Step 4: Launch Alphabet nodes
|
||||||
|
|
||||||
Configure Alphabet nodes with the wallets generated in step 1. For
|
Configure Alphabet nodes with the wallets generated in step 1. For
|
||||||
`morph.validators` use list of public keys from
|
`morph.validators` use a list of public keys from
|
||||||
`ProtocolConfiguration.StandbyCommittee`.
|
`ProtocolConfiguration.StandbyCommittee`.
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
|
@ -174,7 +174,7 @@ contracts:
|
||||||
|
|
||||||
## Step 4: Launch Storage node
|
## Step 4: Launch Storage node
|
||||||
|
|
||||||
Generate a new wallet for Storage node.
|
Generate a new wallet for a Storage node.
|
||||||
|
|
||||||
```
|
```
|
||||||
$ neofs-adm -c foo.network.yml morph generate-storage-wallet --storage-wallet ./sn01.json --initial-gas 10.0
|
$ neofs-adm -c foo.network.yml morph generate-storage-wallet --storage-wallet ./sn01.json --initial-gas 10.0
|
||||||
|
@ -186,7 +186,7 @@ Ngr7p8Z9S22XDH6VkUG9oXobv8zZRAWwwv (simple signature contract):
|
||||||
0355eccb72cd46f09a3e5237eaa0f4949cceb5ecfa5a225bd3bb9fd021c4d75b85
|
0355eccb72cd46f09a3e5237eaa0f4949cceb5ecfa5a225bd3bb9fd021c4d75b85
|
||||||
```
|
```
|
||||||
|
|
||||||
Configure Storage node to use this wallet.
|
Configure the Storage node to use this wallet.
|
||||||
|
|
||||||
```
|
```
|
||||||
node:
|
node:
|
||||||
|
@ -196,7 +196,7 @@ node:
|
||||||
password: "foobar"
|
password: "foobar"
|
||||||
```
|
```
|
||||||
|
|
||||||
Storage node will be included in the network map in next NeoFS epoch. To
|
The storage node will be included in the network map in the next NeoFS epoch. To
|
||||||
speed up this process, you can increment epoch counter immediately.
|
speed up this process, you can increment epoch counter immediately.
|
||||||
|
|
||||||
```
|
```
|
||||||
|
@ -207,5 +207,5 @@ Waiting for transactions to persist...
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
After that NeoFS Storage is ready to work. You can access it directly or
|
After that, NeoFS Storage is ready to work. You can access it directly or
|
||||||
with protocol gates.
|
with protocol gates.
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
# NeoFS subnetwork creation
|
# NeoFS subnetwork creation
|
||||||
|
|
||||||
This is a short guide on how to create NeoFS subnetworks. This guide
|
This is a short guide on how to create NeoFS subnetworks. This guide
|
||||||
considers that side chain and inner ring (alphabet nodes) have already
|
considers that the sidechain and the inner ring (alphabet nodes) have already been
|
||||||
been deployed and side chain contains deployed `subnet` contract.
|
deployed and the sidechain contains a deployed `subnet` contract.
|
||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
To follow this guide you need:
|
To follow this guide, you need:
|
||||||
- neo-go side chain RPC endpoint;
|
- neo-go sidechain RPC endpoint;
|
||||||
- latest released version of [neofs-adm](https://github.com/nspcc-dev/neofs-node/releases);
|
- latest released version of [neofs-adm](https://github.com/nspcc-dev/neofs-node/releases);
|
||||||
- wallet with NeoFS account.
|
- wallet with NeoFS account.
|
||||||
|
|
||||||
|
@ -21,13 +21,13 @@ $ neofs-adm morph subnet create \
|
||||||
Create subnet request sent successfully. ID: 4223489767.
|
Create subnet request sent successfully. ID: 4223489767.
|
||||||
```
|
```
|
||||||
|
|
||||||
**NOTE:** use `--notary` only in notary-enabled environmental. You need to
|
**NOTE:** use `--notary` only in a notary-enabled environment. You need to
|
||||||
have sufficient notary deposit (not expired with enough GAS balance). This
|
have a sufficient notary deposit (not expired, with enough GAS balance). This
|
||||||
is the only one command that requires alphabet signature and, therefore,
|
is the only command that requires an alphabet signature and, therefore,
|
||||||
the only one command that needs `--notary` flag. Your subnet ID will differ
|
the only command that needs `--notary` flag. Your subnet ID will differ
|
||||||
from the example.
|
from the example.
|
||||||
|
|
||||||
Default account in the wallet that was passed with `-w` flag is the owner
|
The default account in the wallet that has been passed with `-w` flag is the owner
|
||||||
of the just created subnetwork.
|
of the just created subnetwork.
|
||||||
|
|
||||||
You can check if your subnetwork was created successfully:
|
You can check if your subnetwork was created successfully:
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
# Managing Subnetworks
|
# Managing Subnetworks
|
||||||
|
|
||||||
This is a short guide on how to manage NeoFS subnetworks. This guide
|
This is a short guide on how to manage NeoFS subnetworks. This guide
|
||||||
considers that side chain and inner ring (alphabet nodes) have already
|
considers that the sidechain and the inner ring (alphabet nodes) have already been
|
||||||
been deployed and side chain contains deployed `subnet` contract.
|
deployed, and the sidechain contains a deployed `subnet` contract.
|
||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
- neo-go side chain RPC endpoint;
|
- neo-go sidechain RPC endpoint;
|
||||||
- latest released version of [neofs-adm](https://github.com/nspcc-dev/neofs-node/releases);
|
- latest released version of [neofs-adm](https://github.com/nspcc-dev/neofs-node/releases);
|
||||||
- [created](subnetwork-creation.md) subnetwork;
|
- [created](subnetwork-creation.md) subnetwork;
|
||||||
- wallet with account that owns the subnetwork;
|
- wallet with the account that owns the subnetwork;
|
||||||
- public key of the Storage Node;
|
- public key of the Storage Node;
|
||||||
- public keys of the node and client administrators;
|
- public keys of the node and client administrators;
|
||||||
- owner IDs of the NeoFS users.
|
- owner IDs of the NeoFS users.
|
||||||
|
|
||||||
## Add node administrator
|
## Add node administrator
|
||||||
|
|
||||||
Node administrators are the accounts that can manage (add and delete nodes)
|
Node administrators are accounts that can manage (add and delete nodes)
|
||||||
whitelist of the nodes that could be included to the subnetwork. Only subnet
|
the whitelist of the nodes which can be included to a subnetwork. Only the subnet
|
||||||
owner is allowed to add and remove node administrators from subnetwork.
|
owner is allowed to add and remove node administrators from the subnetwork.
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
$ neofs-adm morph subnet admin add \
|
$ neofs-adm morph subnet admin add \
|
||||||
|
@ -33,7 +33,7 @@ Add admin request sent successfully.
|
||||||
|
|
||||||
Adding a node to a subnetwork means that the node becomes able to service
|
Adding a node to a subnetwork means that the node becomes able to service
|
||||||
containers that have been created in that subnetwork. Addition only changes
|
containers that have been created in that subnetwork. Addition only changes
|
||||||
list of the allowed nodes. Node is not required to be bootstrapped at the
|
the list of the allowed nodes. Node is not required to be bootstrapped at the
|
||||||
moment of its inclusion.
|
moment of its inclusion.
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
|
@ -45,14 +45,14 @@ $ neofs-adm morph subnet node add \
|
||||||
Add node request sent successfully.
|
Add node request sent successfully.
|
||||||
```
|
```
|
||||||
|
|
||||||
**NOTE:** owner of the subnetwork is also allowed to add nodes.
|
**NOTE:** the owner of the subnetwork is also allowed to add nodes.
|
||||||
|
|
||||||
## Add client administrator
|
## Add client administrator
|
||||||
|
|
||||||
Client administrators are the accounts that can manage (add and delete
|
Client administrators are accounts that can manage (add and delete
|
||||||
nodes) whitelist of the clients that can creates containers in the
|
nodes) the whitelist of the clients that can create containers in the
|
||||||
subnetwork. Only subnet owner is allowed to add and remove client
|
subnetwork. Only the subnet owner is allowed to add and remove client
|
||||||
administrators from subnetwork.
|
administrators from the subnetwork.
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
$ neofs-adm morph subnet admin add \
|
$ neofs-adm morph subnet admin add \
|
||||||
|
@ -65,8 +65,8 @@ $ neofs-adm morph subnet admin add \
|
||||||
Add admin request sent successfully.
|
Add admin request sent successfully.
|
||||||
```
|
```
|
||||||
|
|
||||||
**NOTE:** you do not need to create group explicitly, it would be created
|
**NOTE:** you do not need to create a group explicitly, it will be created
|
||||||
right after the first client admin has been added. Group ID is 4-byte
|
right after the first client admin is added. Group ID is a 4-byte
|
||||||
positive integer number.
|
positive integer number.
|
||||||
|
|
||||||
## Add client
|
## Add client
|
||||||
|
@ -81,17 +81,17 @@ $ neofs-adm morph subnet client add \
|
||||||
Add client request sent successfully.
|
Add client request sent successfully.
|
||||||
```
|
```
|
||||||
|
|
||||||
**NOTE:** owner of the subnetwork is also allowed to add clients. This is
|
**NOTE:** the owner of the subnetwork is also allowed to add clients. This is
|
||||||
the only one command that accepts `ownerID`, not the public key.
|
the only one command that accepts `ownerID`, not the public key.
|
||||||
Administrator can manage only his group (a group where that administrator
|
Administrator can manage only their group (a group where that administrator
|
||||||
has been added by subnet owner).
|
has been added by the subnet owner).
|
||||||
|
|
||||||
# Bootstrapping Storage Node
|
# Bootstrapping Storage Node
|
||||||
|
|
||||||
After subnetwork [creation](subnetwork-creation.md) and inclusion node to it, the
|
After a subnetwork [is created](subnetwork-creation.md) and a node is included into it, the
|
||||||
node could be bootstrapped and service subnetwork containers.
|
node could be bootstrapped and service subnetwork containers.
|
||||||
|
|
||||||
For bootstrapping you need to specify ID of the subnetwork in the node's
|
For bootstrapping, you need to specify the ID of the subnetwork in the node's
|
||||||
configuration:
|
configuration:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
|
@ -108,7 +108,7 @@ node:
|
||||||
**NOTE:** specifying subnetwork that is denied for the node is not an error:
|
**NOTE:** specifying subnetwork that is denied for the node is not an error:
|
||||||
that configuration value would be ignored. You do not need to specify zero
|
that configuration value would be ignored. You do not need to specify zero
|
||||||
(with 0 ID) subnetwork: its inclusion is implicit. On the contrary, to exclude
|
(with 0 ID) subnetwork: its inclusion is implicit. On the contrary, to exclude
|
||||||
node from the default zero subnetwork you need to specify it explicitly:
|
a node from the default zero subnetwork, you need to specify it explicitly:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
...
|
...
|
||||||
|
@ -122,11 +122,11 @@ node:
|
||||||
|
|
||||||
# Creating container in non-zero subnetwork
|
# Creating container in non-zero subnetwork
|
||||||
|
|
||||||
Creating containers without using `--subnet` flag is equivalent to the
|
Creating containers without using `--subnet` flag is equivalent to
|
||||||
creating container in the zero subnetwork.
|
creating container in the zero subnetwork.
|
||||||
|
|
||||||
To create container in a private network your wallet must have been added to
|
To create a container in a private network, your wallet must be added to
|
||||||
the client whitelist by client admins or subnet owners:
|
the client whitelist by the client admins or the subnet owners:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
$ neofs-cli container create \
|
$ neofs-cli container create \
|
||||||
|
|
|
@ -31,12 +31,12 @@ type cache struct {
|
||||||
type initializeContext struct {
|
type initializeContext struct {
|
||||||
clientContext
|
clientContext
|
||||||
cache
|
cache
|
||||||
// CommitteeAcc is used for retrieving committee address and verification script.
|
// CommitteeAcc is used for retrieving the committee address and the verification script.
|
||||||
CommitteeAcc *wallet.Account
|
CommitteeAcc *wallet.Account
|
||||||
// ConsensusAcc is used for retrieving committee address and verification script.
|
// ConsensusAcc is used for retrieving the committee address and the verification script.
|
||||||
ConsensusAcc *wallet.Account
|
ConsensusAcc *wallet.Account
|
||||||
Wallets []*wallet.Wallet
|
Wallets []*wallet.Wallet
|
||||||
// ContractWallet is a wallet for providing contract group signature.
|
// ContractWallet is a wallet for providing the contract group signature.
|
||||||
ContractWallet *wallet.Wallet
|
ContractWallet *wallet.Wallet
|
||||||
// Accounts contains simple signature accounts in the same order as in Wallets.
|
// Accounts contains simple signature accounts in the same order as in Wallets.
|
||||||
Accounts []*wallet.Account
|
Accounts []*wallet.Account
|
||||||
|
|
|
@ -18,7 +18,7 @@ import (
|
||||||
"github.com/nspcc-dev/neo-go/pkg/vm/stackitem"
|
"github.com/nspcc-dev/neo-go/pkg/vm/stackitem"
|
||||||
)
|
)
|
||||||
|
|
||||||
// initialAlphabetNEOAmount represents total amount of GAS distributed between alphabet nodes.
|
// initialAlphabetNEOAmount represents the total amount of GAS distributed between alphabet nodes.
|
||||||
const initialAlphabetNEOAmount = native.NEOTotalSupply
|
const initialAlphabetNEOAmount = native.NEOTotalSupply
|
||||||
|
|
||||||
func (c *initializeContext) registerCandidates() error {
|
func (c *initializeContext) registerCandidates() error {
|
||||||
|
|
|
@ -12,9 +12,9 @@ import (
|
||||||
|
|
||||||
const (
|
const (
|
||||||
gasInitialTotalSupply = 30000000 * native.GASFactor
|
gasInitialTotalSupply = 30000000 * native.GASFactor
|
||||||
// initialAlphabetGASAmount represents amount of GAS given to each alphabet node.
|
// initialAlphabetGASAmount represents the amount of GAS given to each alphabet node.
|
||||||
initialAlphabetGASAmount = 10_000 * native.GASFactor
|
initialAlphabetGASAmount = 10_000 * native.GASFactor
|
||||||
// initialProxyGASAmount represents amount of GAS given to proxy contract.
|
// initialProxyGASAmount represents the amount of GAS given to a proxy contract.
|
||||||
initialProxyGASAmount = 50_000 * native.GASFactor
|
initialProxyGASAmount = 50_000 * native.GASFactor
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// StringifySubnetClientGroupID returns string representation of SubnetClientGroupID using MarshalText.
|
// StringifySubnetClientGroupID returns string representation of SubnetClientGroupID using MarshalText.
|
||||||
// Returns string with message on error.
|
// Returns a string with a message on error.
|
||||||
func StringifySubnetClientGroupID(id *SubnetClientGroupID) string {
|
func StringifySubnetClientGroupID(id *SubnetClientGroupID) string {
|
||||||
text, err := id.MarshalText()
|
text, err := id.MarshalText()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -21,14 +21,14 @@ func StringifySubnetClientGroupID(id *SubnetClientGroupID) string {
|
||||||
// MarshalText encodes SubnetClientGroupID into text format according to NeoFS API V2 protocol:
|
// MarshalText encodes SubnetClientGroupID into text format according to NeoFS API V2 protocol:
|
||||||
// value in base-10 integer string format.
|
// value in base-10 integer string format.
|
||||||
//
|
//
|
||||||
// Implements encoding.TextMarshaler.
|
// It implements encoding.TextMarshaler.
|
||||||
func (x *SubnetClientGroupID) MarshalText() ([]byte, error) {
|
func (x *SubnetClientGroupID) MarshalText() ([]byte, error) {
|
||||||
num := x.GetValue() // NPE safe, returns zero on nil
|
num := x.GetValue() // NPE safe, returns zero on nil
|
||||||
|
|
||||||
return []byte(strconv.FormatUint(uint64(num), 10)), nil
|
return []byte(strconv.FormatUint(uint64(num), 10)), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnmarshalText decodes SubnetID from the text according to NeoFS API V2 protocol:
|
// UnmarshalText decodes the SubnetID from the text according to NeoFS API V2 protocol:
|
||||||
// should be base-10 integer string format with bitsize = 32.
|
// should be base-10 integer string format with bitsize = 32.
|
||||||
//
|
//
|
||||||
// Returns strconv.ErrRange if integer overflows uint32.
|
// Returns strconv.ErrRange if integer overflows uint32.
|
||||||
|
@ -47,13 +47,13 @@ func (x *SubnetClientGroupID) UnmarshalText(txt []byte) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Marshal encodes SubnetClientGroupID into a binary format of NeoFS API V2 protocol
|
// Marshal encodes the SubnetClientGroupID into a binary format of NeoFS API V2 protocol
|
||||||
// (Protocol Buffers with direct field order).
|
// (Protocol Buffers with direct field order).
|
||||||
func (x *SubnetClientGroupID) Marshal() ([]byte, error) {
|
func (x *SubnetClientGroupID) Marshal() ([]byte, error) {
|
||||||
return proto.Marshal(x)
|
return proto.Marshal(x)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unmarshal decodes SubnetClientGroupID from NeoFS API V2 binary format (see Marshal). Must not be called on nil.
|
// Unmarshal decodes the SubnetClientGroupID from NeoFS API V2 binary format (see Marshal). Must not be called on nil.
|
||||||
func (x *SubnetClientGroupID) Unmarshal(data []byte) error {
|
func (x *SubnetClientGroupID) Unmarshal(data []byte) error {
|
||||||
return proto.Unmarshal(data, x)
|
return proto.Unmarshal(data, x)
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,19 +25,19 @@ type BalanceOfPrm struct {
|
||||||
client.PrmBalanceGet
|
client.PrmBalanceGet
|
||||||
}
|
}
|
||||||
|
|
||||||
// BalanceOfRes groups resulting values of BalanceOf operation.
|
// BalanceOfRes groups the resulting values of BalanceOf operation.
|
||||||
type BalanceOfRes struct {
|
type BalanceOfRes struct {
|
||||||
cliRes *client.ResBalanceGet
|
cliRes *client.ResBalanceGet
|
||||||
}
|
}
|
||||||
|
|
||||||
// Balance returns current balance.
|
// Balance returns the current balance.
|
||||||
func (x BalanceOfRes) Balance() *accounting.Decimal {
|
func (x BalanceOfRes) Balance() *accounting.Decimal {
|
||||||
return x.cliRes.Amount()
|
return x.cliRes.Amount()
|
||||||
}
|
}
|
||||||
|
|
||||||
// BalanceOf requests current balance of NeoFS user.
|
// BalanceOf requests the current balance of a NeoFS user.
|
||||||
//
|
//
|
||||||
// Returns any error prevented the operation from completing correctly in error return.
|
// Returns any error which prevented the operation from completing correctly in error return.
|
||||||
func BalanceOf(prm BalanceOfPrm) (res BalanceOfRes, err error) {
|
func BalanceOf(prm BalanceOfPrm) (res BalanceOfRes, err error) {
|
||||||
res.cliRes, err = prm.cli.BalanceGet(context.Background(), prm.PrmBalanceGet)
|
res.cliRes, err = prm.cli.BalanceGet(context.Background(), prm.PrmBalanceGet)
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@ type ListContainersPrm struct {
|
||||||
client.PrmContainerList
|
client.PrmContainerList
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListContainersRes groups resulting values of ListContainers operation.
|
// ListContainersRes groups the resulting values of ListContainers operation.
|
||||||
type ListContainersRes struct {
|
type ListContainersRes struct {
|
||||||
cliRes *client.ResContainerList
|
cliRes *client.ResContainerList
|
||||||
}
|
}
|
||||||
|
@ -60,9 +60,9 @@ func (x ListContainersRes) IDList() []cid.ID {
|
||||||
return x.cliRes.Containers()
|
return x.cliRes.Containers()
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListContainers requests list of NeoFS user's containers.
|
// ListContainers requests a list of NeoFS user's containers.
|
||||||
//
|
//
|
||||||
// Returns any error prevented the operation from completing correctly in error return.
|
// Returns any error which prevented the operation from completing correctly in error return.
|
||||||
func ListContainers(prm ListContainersPrm) (res ListContainersRes, err error) {
|
func ListContainers(prm ListContainersPrm) (res ListContainersRes, err error) {
|
||||||
res.cliRes, err = prm.cli.ContainerList(context.Background(), prm.PrmContainerList)
|
res.cliRes, err = prm.cli.ContainerList(context.Background(), prm.PrmContainerList)
|
||||||
|
|
||||||
|
@ -75,7 +75,7 @@ type PutContainerPrm struct {
|
||||||
client.PrmContainerPut
|
client.PrmContainerPut
|
||||||
}
|
}
|
||||||
|
|
||||||
// PutContainerRes groups resulting values of PutContainer operation.
|
// PutContainerRes groups the resulting values of PutContainer operation.
|
||||||
type PutContainerRes struct {
|
type PutContainerRes struct {
|
||||||
cliRes *client.ResContainerPut
|
cliRes *client.ResContainerPut
|
||||||
}
|
}
|
||||||
|
@ -85,14 +85,14 @@ func (x PutContainerRes) ID() *cid.ID {
|
||||||
return x.cliRes.ID()
|
return x.cliRes.ID()
|
||||||
}
|
}
|
||||||
|
|
||||||
// PutContainer sends request to save container in NeoFS.
|
// PutContainer sends a request to save the container in NeoFS.
|
||||||
//
|
//
|
||||||
// Operation is asynchronous and no guaranteed even in the absence of errors.
|
// Operation is asynchronous and not guaranteed even in the absence of errors.
|
||||||
// The required time is also not predictable.
|
// The required time is also not predictable.
|
||||||
//
|
//
|
||||||
// Success can be verified by reading by identifier.
|
// Success can be verified by reading by identifier.
|
||||||
//
|
//
|
||||||
// Returns any error prevented the operation from completing correctly in error return.
|
// Returns any error which prevented the operation from completing correctly in error return.
|
||||||
func PutContainer(prm PutContainerPrm) (res PutContainerRes, err error) {
|
func PutContainer(prm PutContainerPrm) (res PutContainerRes, err error) {
|
||||||
res.cliRes, err = prm.cli.ContainerPut(context.Background(), prm.PrmContainerPut)
|
res.cliRes, err = prm.cli.ContainerPut(context.Background(), prm.PrmContainerPut)
|
||||||
|
|
||||||
|
@ -110,7 +110,7 @@ func (x *GetContainerPrm) SetContainer(id cid.ID) {
|
||||||
x.cliPrm.SetContainer(id)
|
x.cliPrm.SetContainer(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetContainerRes groups resulting values of GetContainer operation.
|
// GetContainerRes groups the resulting values of GetContainer operation.
|
||||||
type GetContainerRes struct {
|
type GetContainerRes struct {
|
||||||
cliRes *client.ResContainerGet
|
cliRes *client.ResContainerGet
|
||||||
}
|
}
|
||||||
|
@ -120,9 +120,9 @@ func (x GetContainerRes) Container() *container.Container {
|
||||||
return x.cliRes.Container()
|
return x.cliRes.Container()
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetContainer reads container from NeoFS by ID.
|
// GetContainer reads a container from NeoFS by ID.
|
||||||
//
|
//
|
||||||
// Returns any error prevented the operation from completing correctly in error return.
|
// Returns any error which prevented the operation from completing correctly in error return.
|
||||||
func GetContainer(prm GetContainerPrm) (res GetContainerRes, err error) {
|
func GetContainer(prm GetContainerPrm) (res GetContainerRes, err error) {
|
||||||
res.cliRes, err = prm.cli.ContainerGet(context.Background(), prm.cliPrm)
|
res.cliRes, err = prm.cli.ContainerGet(context.Background(), prm.cliPrm)
|
||||||
|
|
||||||
|
@ -135,17 +135,17 @@ type DeleteContainerPrm struct {
|
||||||
client.PrmContainerDelete
|
client.PrmContainerDelete
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeleteContainerRes groups resulting values of DeleteContainer operation.
|
// DeleteContainerRes groups the resulting values of DeleteContainer operation.
|
||||||
type DeleteContainerRes struct{}
|
type DeleteContainerRes struct{}
|
||||||
|
|
||||||
// DeleteContainer sends request to remove container from NeoFS by ID.
|
// DeleteContainer sends a request to remove a container from NeoFS by ID.
|
||||||
//
|
//
|
||||||
// Operation is asynchronous and no guaranteed even in the absence of errors.
|
// Operation is asynchronous and not guaranteed even in the absence of errors.
|
||||||
// The required time is also not predictable.
|
// The required time is also not predictable.
|
||||||
//
|
//
|
||||||
// Success can be verified by reading by identifier.
|
// Success can be verified by reading by identifier.
|
||||||
//
|
//
|
||||||
// Returns any error prevented the operation from completing correctly in error return.
|
// Returns any error which prevented the operation from completing correctly in error return.
|
||||||
func DeleteContainer(prm DeleteContainerPrm) (res DeleteContainerRes, err error) {
|
func DeleteContainer(prm DeleteContainerPrm) (res DeleteContainerRes, err error) {
|
||||||
_, err = prm.cli.ContainerDelete(context.Background(), prm.PrmContainerDelete)
|
_, err = prm.cli.ContainerDelete(context.Background(), prm.PrmContainerDelete)
|
||||||
|
|
||||||
|
@ -158,7 +158,7 @@ type EACLPrm struct {
|
||||||
client.PrmContainerEACL
|
client.PrmContainerEACL
|
||||||
}
|
}
|
||||||
|
|
||||||
// EACLRes groups resulting values of EACL operation.
|
// EACLRes groups the resulting values of EACL operation.
|
||||||
type EACLRes struct {
|
type EACLRes struct {
|
||||||
cliRes *client.ResContainerEACL
|
cliRes *client.ResContainerEACL
|
||||||
}
|
}
|
||||||
|
@ -170,7 +170,7 @@ func (x EACLRes) EACL() *eacl.Table {
|
||||||
|
|
||||||
// EACL reads eACL table from NeoFS by container ID.
|
// EACL reads eACL table from NeoFS by container ID.
|
||||||
//
|
//
|
||||||
// Returns any error prevented the operation from completing correctly in error return.
|
// Returns any error which prevented the operation from completing correctly in error return.
|
||||||
func EACL(prm EACLPrm) (res EACLRes, err error) {
|
func EACL(prm EACLPrm) (res EACLRes, err error) {
|
||||||
res.cliRes, err = prm.cli.ContainerEACL(context.Background(), prm.PrmContainerEACL)
|
res.cliRes, err = prm.cli.ContainerEACL(context.Background(), prm.PrmContainerEACL)
|
||||||
|
|
||||||
|
@ -183,17 +183,17 @@ type SetEACLPrm struct {
|
||||||
client.PrmContainerSetEACL
|
client.PrmContainerSetEACL
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetEACLRes groups resulting values of SetEACL operation.
|
// SetEACLRes groups the resulting values of SetEACL operation.
|
||||||
type SetEACLRes struct{}
|
type SetEACLRes struct{}
|
||||||
|
|
||||||
// SetEACL requests to save eACL table in NeoFS.
|
// SetEACL requests to save an eACL table in NeoFS.
|
||||||
//
|
//
|
||||||
// Operation is asynchronous and no guaranteed even in the absence of errors.
|
// Operation is asynchronous and no guaranteed even in the absence of errors.
|
||||||
// The required time is also not predictable.
|
// The required time is also not predictable.
|
||||||
//
|
//
|
||||||
// Success can be verified by reading by container identifier.
|
// Success can be verified by reading by container identifier.
|
||||||
//
|
//
|
||||||
// Returns any error prevented the operation from completing correctly in error return.
|
// Returns any error which prevented the operation from completing correctly in error return.
|
||||||
func SetEACL(prm SetEACLPrm) (res SetEACLRes, err error) {
|
func SetEACL(prm SetEACLPrm) (res SetEACLRes, err error) {
|
||||||
_, err = prm.cli.ContainerSetEACL(context.Background(), prm.PrmContainerSetEACL)
|
_, err = prm.cli.ContainerSetEACL(context.Background(), prm.PrmContainerSetEACL)
|
||||||
|
|
||||||
|
@ -206,7 +206,7 @@ type NetworkInfoPrm struct {
|
||||||
client.PrmNetworkInfo
|
client.PrmNetworkInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
// NetworkInfoRes groups resulting values of NetworkInfo operation.
|
// NetworkInfoRes groups the resulting values of NetworkInfo operation.
|
||||||
type NetworkInfoRes struct {
|
type NetworkInfoRes struct {
|
||||||
cliRes *client.ResNetworkInfo
|
cliRes *client.ResNetworkInfo
|
||||||
}
|
}
|
||||||
|
@ -218,7 +218,7 @@ func (x NetworkInfoRes) NetworkInfo() *netmap.NetworkInfo {
|
||||||
|
|
||||||
// NetworkInfo reads information about the NeoFS network.
|
// NetworkInfo reads information about the NeoFS network.
|
||||||
//
|
//
|
||||||
// Returns any error prevented the operation from completing correctly in error return.
|
// Returns any error which prevented the operation from completing correctly in error return.
|
||||||
func NetworkInfo(prm NetworkInfoPrm) (res NetworkInfoRes, err error) {
|
func NetworkInfo(prm NetworkInfoPrm) (res NetworkInfoRes, err error) {
|
||||||
res.cliRes, err = prm.cli.NetworkInfo(context.Background(), prm.PrmNetworkInfo)
|
res.cliRes, err = prm.cli.NetworkInfo(context.Background(), prm.PrmNetworkInfo)
|
||||||
|
|
||||||
|
@ -231,7 +231,7 @@ type NodeInfoPrm struct {
|
||||||
client.PrmEndpointInfo
|
client.PrmEndpointInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
// NodeInfoRes groups resulting values of NodeInfo operation.
|
// NodeInfoRes groups the resulting values of NodeInfo operation.
|
||||||
type NodeInfoRes struct {
|
type NodeInfoRes struct {
|
||||||
cliRes *client.ResEndpointInfo
|
cliRes *client.ResEndpointInfo
|
||||||
}
|
}
|
||||||
|
@ -241,14 +241,14 @@ func (x NodeInfoRes) NodeInfo() *netmap.NodeInfo {
|
||||||
return x.cliRes.NodeInfo()
|
return x.cliRes.NodeInfo()
|
||||||
}
|
}
|
||||||
|
|
||||||
// LatestVersion returns latest NeoFS API version in use.
|
// LatestVersion returns the latest NeoFS API version in use.
|
||||||
func (x NodeInfoRes) LatestVersion() *version.Version {
|
func (x NodeInfoRes) LatestVersion() *version.Version {
|
||||||
return x.cliRes.LatestVersion()
|
return x.cliRes.LatestVersion()
|
||||||
}
|
}
|
||||||
|
|
||||||
// NodeInfo requests information about the remote server from NeoFS netmap.
|
// NodeInfo requests information about the remote server from NeoFS netmap.
|
||||||
//
|
//
|
||||||
// Returns any error prevented the operation from completing correctly in error return.
|
// Returns any error which prevented the operation from completing correctly in error return.
|
||||||
func NodeInfo(prm NodeInfoPrm) (res NodeInfoRes, err error) {
|
func NodeInfo(prm NodeInfoPrm) (res NodeInfoRes, err error) {
|
||||||
res.cliRes, err = prm.cli.EndpointInfo(context.Background(), prm.PrmEndpointInfo)
|
res.cliRes, err = prm.cli.EndpointInfo(context.Background(), prm.PrmEndpointInfo)
|
||||||
|
|
||||||
|
@ -261,7 +261,7 @@ type CreateSessionPrm struct {
|
||||||
client.PrmSessionCreate
|
client.PrmSessionCreate
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateSessionRes groups resulting values of CreateSession operation.
|
// CreateSessionRes groups the resulting values of CreateSession operation.
|
||||||
type CreateSessionRes struct {
|
type CreateSessionRes struct {
|
||||||
cliRes *client.ResSessionCreate
|
cliRes *client.ResSessionCreate
|
||||||
}
|
}
|
||||||
|
@ -276,9 +276,9 @@ func (x CreateSessionRes) SessionKey() []byte {
|
||||||
return x.cliRes.PublicKey()
|
return x.cliRes.PublicKey()
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateSession opens new unlimited session with the remote node.
|
// CreateSession opens a new unlimited session with the remote node.
|
||||||
//
|
//
|
||||||
// Returns any error prevented the operation from completing correctly in error return.
|
// Returns any error which prevented the operation from completing correctly in error return.
|
||||||
func CreateSession(prm CreateSessionPrm) (res CreateSessionRes, err error) {
|
func CreateSession(prm CreateSessionPrm) (res CreateSessionRes, err error) {
|
||||||
res.cliRes, err = prm.cli.SessionCreate(context.Background(), prm.PrmSessionCreate)
|
res.cliRes, err = prm.cli.SessionCreate(context.Background(), prm.PrmSessionCreate)
|
||||||
|
|
||||||
|
@ -304,7 +304,7 @@ func (x *PutObjectPrm) SetPayloadReader(rdr io.Reader) {
|
||||||
x.rdr = rdr
|
x.rdr = rdr
|
||||||
}
|
}
|
||||||
|
|
||||||
// PutObjectRes groups resulting values of PutObject operation.
|
// PutObjectRes groups the resulting values of PutObject operation.
|
||||||
type PutObjectRes struct {
|
type PutObjectRes struct {
|
||||||
id *oidSDK.ID
|
id *oidSDK.ID
|
||||||
}
|
}
|
||||||
|
@ -316,7 +316,7 @@ func (x PutObjectRes) ID() *oidSDK.ID {
|
||||||
|
|
||||||
// PutObject saves the object in NeoFS network.
|
// PutObject saves the object in NeoFS network.
|
||||||
//
|
//
|
||||||
// Returns any error prevented the operation from completing correctly in error return.
|
// Returns any error which prevented the operation from completing correctly in error return.
|
||||||
func PutObject(prm PutObjectPrm) (*PutObjectRes, error) {
|
func PutObject(prm PutObjectPrm) (*PutObjectRes, error) {
|
||||||
var putPrm client.PrmObjectPutInit
|
var putPrm client.PrmObjectPutInit
|
||||||
|
|
||||||
|
@ -404,19 +404,19 @@ type DeleteObjectPrm struct {
|
||||||
objectAddressPrm
|
objectAddressPrm
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeleteObjectRes groups resulting values of DeleteObject operation.
|
// DeleteObjectRes groups the resulting values of DeleteObject operation.
|
||||||
type DeleteObjectRes struct {
|
type DeleteObjectRes struct {
|
||||||
addrTombstone *addressSDK.Address
|
addrTombstone *addressSDK.Address
|
||||||
}
|
}
|
||||||
|
|
||||||
// TombstoneAddress returns address of the created object with tombstone.
|
// TombstoneAddress returns the address of the created object with tombstone.
|
||||||
func (x DeleteObjectRes) TombstoneAddress() *addressSDK.Address {
|
func (x DeleteObjectRes) TombstoneAddress() *addressSDK.Address {
|
||||||
return x.addrTombstone
|
return x.addrTombstone
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeleteObject marks object to be removed from NeoFS through tombstone placement.
|
// DeleteObject marks an object to be removed from NeoFS through tombstone placement.
|
||||||
//
|
//
|
||||||
// Returns any error prevented the operation from completing correctly in error return.
|
// Returns any error which prevented the operation from completing correctly in error return.
|
||||||
func DeleteObject(prm DeleteObjectPrm) (*DeleteObjectRes, error) {
|
func DeleteObject(prm DeleteObjectPrm) (*DeleteObjectRes, error) {
|
||||||
var delPrm client.PrmObjectDelete
|
var delPrm client.PrmObjectDelete
|
||||||
|
|
||||||
|
@ -467,27 +467,27 @@ type GetObjectPrm struct {
|
||||||
headerCallback func(*object.Object)
|
headerCallback func(*object.Object)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetHeaderCallback sets callback which is called on the object after the header is received,
|
// SetHeaderCallback sets callback which is called on the object after the header is received
|
||||||
// but before the payload is written.
|
// but before the payload is written.
|
||||||
func (p *GetObjectPrm) SetHeaderCallback(f func(*object.Object)) {
|
func (p *GetObjectPrm) SetHeaderCallback(f func(*object.Object)) {
|
||||||
p.headerCallback = f
|
p.headerCallback = f
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetObjectRes groups resulting values of GetObject operation.
|
// GetObjectRes groups the resulting values of GetObject operation.
|
||||||
type GetObjectRes struct {
|
type GetObjectRes struct {
|
||||||
hdr *object.Object
|
hdr *object.Object
|
||||||
}
|
}
|
||||||
|
|
||||||
// Header returns header of the request object.
|
// Header returns the header of the request object.
|
||||||
func (x GetObjectRes) Header() *object.Object {
|
func (x GetObjectRes) Header() *object.Object {
|
||||||
return x.hdr
|
return x.hdr
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetObject reads the object by address.
|
// GetObject reads an object by address.
|
||||||
//
|
//
|
||||||
// Interrupts on any writer error. If successful, payload is written to writer.
|
// Interrupts on any writer error. If successful, payload is written to the writer.
|
||||||
//
|
//
|
||||||
// Returns any error prevented the operation from completing correctly in error return.
|
// Returns any error which prevented the operation from completing correctly in error return.
|
||||||
// For raw reading, returns *object.SplitInfoError error if object is virtual.
|
// For raw reading, returns *object.SplitInfoError error if object is virtual.
|
||||||
func GetObject(prm GetObjectPrm) (*GetObjectRes, error) {
|
func GetObject(prm GetObjectPrm) (*GetObjectRes, error) {
|
||||||
var getPrm client.PrmObjectGet
|
var getPrm client.PrmObjectGet
|
||||||
|
@ -552,24 +552,24 @@ type HeadObjectPrm struct {
|
||||||
mainOnly bool
|
mainOnly bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetMainOnlyFlag sets flag to get only main fields of object header in terms of NeoFS API.
|
// SetMainOnlyFlag sets flag to get only main fields of an object header in terms of NeoFS API.
|
||||||
func (x *HeadObjectPrm) SetMainOnlyFlag(v bool) {
|
func (x *HeadObjectPrm) SetMainOnlyFlag(v bool) {
|
||||||
x.mainOnly = v
|
x.mainOnly = v
|
||||||
}
|
}
|
||||||
|
|
||||||
// HeadObjectRes groups resulting values of HeadObject operation.
|
// HeadObjectRes groups the resulting values of HeadObject operation.
|
||||||
type HeadObjectRes struct {
|
type HeadObjectRes struct {
|
||||||
hdr *object.Object
|
hdr *object.Object
|
||||||
}
|
}
|
||||||
|
|
||||||
// Header returns requested object header.
|
// Header returns the requested object header.
|
||||||
func (x HeadObjectRes) Header() *object.Object {
|
func (x HeadObjectRes) Header() *object.Object {
|
||||||
return x.hdr
|
return x.hdr
|
||||||
}
|
}
|
||||||
|
|
||||||
// HeadObject reads object header by address.
|
// HeadObject reads an object header by address.
|
||||||
//
|
//
|
||||||
// Returns any error prevented the operation from completing correctly in error return.
|
// Returns any error which prevented the operation from completing correctly in error return.
|
||||||
// For raw reading, returns *object.SplitInfoError error if object is virtual.
|
// For raw reading, returns *object.SplitInfoError error if object is virtual.
|
||||||
func HeadObject(prm HeadObjectPrm) (*HeadObjectRes, error) {
|
func HeadObject(prm HeadObjectPrm) (*HeadObjectRes, error) {
|
||||||
var cliPrm client.PrmObjectHead
|
var cliPrm client.PrmObjectHead
|
||||||
|
@ -629,7 +629,7 @@ func (x *SearchObjectsPrm) SetFilters(filters object.SearchFilters) {
|
||||||
x.filters = filters
|
x.filters = filters
|
||||||
}
|
}
|
||||||
|
|
||||||
// SearchObjectsRes groups resulting values of SearchObjects operation.
|
// SearchObjectsRes groups the resulting values of SearchObjects operation.
|
||||||
type SearchObjectsRes struct {
|
type SearchObjectsRes struct {
|
||||||
ids []oidSDK.ID
|
ids []oidSDK.ID
|
||||||
}
|
}
|
||||||
|
@ -639,9 +639,9 @@ func (x SearchObjectsRes) IDList() []oidSDK.ID {
|
||||||
return x.ids
|
return x.ids
|
||||||
}
|
}
|
||||||
|
|
||||||
// SearchObjects selects objects from container which match the filters.
|
// SearchObjects selects objects from the container which match the filters.
|
||||||
//
|
//
|
||||||
// Returns any error prevented the operation from completing correctly in error return.
|
// Returns any error which prevented the operation from completing correctly in error return.
|
||||||
func SearchObjects(prm SearchObjectsPrm) (*SearchObjectsRes, error) {
|
func SearchObjects(prm SearchObjectsPrm) (*SearchObjectsRes, error) {
|
||||||
var cliPrm client.PrmObjectSearch
|
var cliPrm client.PrmObjectSearch
|
||||||
|
|
||||||
|
@ -712,7 +712,7 @@ func (x *HashPayloadRangesPrm) TZ() {
|
||||||
x.tz = true
|
x.tz = true
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetRanges sets list of payload ranges to hash.
|
// SetRanges sets a list of payload ranges to hash.
|
||||||
func (x *HashPayloadRangesPrm) SetRanges(rngs []*object.Range) {
|
func (x *HashPayloadRangesPrm) SetRanges(rngs []*object.Range) {
|
||||||
x.rngs = rngs
|
x.rngs = rngs
|
||||||
}
|
}
|
||||||
|
@ -722,19 +722,19 @@ func (x *HashPayloadRangesPrm) SetSalt(salt []byte) {
|
||||||
x.salt = salt
|
x.salt = salt
|
||||||
}
|
}
|
||||||
|
|
||||||
// HashPayloadRangesRes groups resulting values of HashPayloadRanges operation.
|
// HashPayloadRangesRes groups the resulting values of HashPayloadRanges operation.
|
||||||
type HashPayloadRangesRes struct {
|
type HashPayloadRangesRes struct {
|
||||||
cliRes *client.ResObjectHash
|
cliRes *client.ResObjectHash
|
||||||
}
|
}
|
||||||
|
|
||||||
// HashList returns list of hashes of the payload ranges keeping order.
|
// HashList returns a list of hashes of the payload ranges keeping order.
|
||||||
func (x HashPayloadRangesRes) HashList() [][]byte {
|
func (x HashPayloadRangesRes) HashList() [][]byte {
|
||||||
return x.cliRes.Checksums()
|
return x.cliRes.Checksums()
|
||||||
}
|
}
|
||||||
|
|
||||||
// HashPayloadRanges requests hashes (by default SHA256) of the object payload ranges.
|
// HashPayloadRanges requests hashes (by default SHA256) of the object payload ranges.
|
||||||
//
|
//
|
||||||
// Returns any error prevented the operation from completing correctly in error return.
|
// Returns any error which prevented the operation from completing correctly in error return.
|
||||||
// Returns an error if number of received hashes differs with the number of requested ranges.
|
// Returns an error if number of received hashes differs with the number of requested ranges.
|
||||||
func HashPayloadRanges(prm HashPayloadRangesPrm) (*HashPayloadRangesRes, error) {
|
func HashPayloadRanges(prm HashPayloadRangesPrm) (*HashPayloadRangesRes, error) {
|
||||||
var cliPrm client.PrmObjectHash
|
var cliPrm client.PrmObjectHash
|
||||||
|
@ -801,14 +801,14 @@ func (x *PayloadRangePrm) SetRange(rng *object.Range) {
|
||||||
x.rng = rng
|
x.rng = rng
|
||||||
}
|
}
|
||||||
|
|
||||||
// PayloadRangeRes groups resulting values of PayloadRange operation.
|
// PayloadRangeRes groups the resulting values of PayloadRange operation.
|
||||||
type PayloadRangeRes struct{}
|
type PayloadRangeRes struct{}
|
||||||
|
|
||||||
// PayloadRange reads object payload range from NeoFS and writes it to specified writer.
|
// PayloadRange reads object payload range from NeoFS and writes it to the specified writer.
|
||||||
//
|
//
|
||||||
// Interrupts on any writer error.
|
// Interrupts on any writer error.
|
||||||
//
|
//
|
||||||
// Returns any error prevented the operation from completing correctly in error return.
|
// Returns any error which prevented the operation from completing correctly in error return.
|
||||||
// For raw reading, returns *object.SplitInfoError error if object is virtual.
|
// For raw reading, returns *object.SplitInfoError error if object is virtual.
|
||||||
func PayloadRange(prm PayloadRangePrm) (*PayloadRangeRes, error) {
|
func PayloadRange(prm PayloadRangePrm) (*PayloadRangeRes, error) {
|
||||||
var cliPrm client.PrmObjectRange
|
var cliPrm client.PrmObjectRange
|
||||||
|
|
|
@ -16,7 +16,7 @@ type commonPrm struct {
|
||||||
cli *client.Client
|
cli *client.Client
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetClient sets base client for NeoFS API communication.
|
// SetClient sets the base client for NeoFS API communication.
|
||||||
func (x *commonPrm) SetClient(cli *client.Client) {
|
func (x *commonPrm) SetClient(cli *client.Client) {
|
||||||
x.cli = cli
|
x.cli = cli
|
||||||
}
|
}
|
||||||
|
@ -25,7 +25,7 @@ type containerIDPrm struct {
|
||||||
cnrID *cid.ID
|
cnrID *cid.ID
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetContainerID sets container identifier.
|
// SetContainerID sets the container identifier.
|
||||||
func (x *containerIDPrm) SetContainerID(id *cid.ID) {
|
func (x *containerIDPrm) SetContainerID(id *cid.ID) {
|
||||||
x.cnrID = id
|
x.cnrID = id
|
||||||
}
|
}
|
||||||
|
@ -34,7 +34,7 @@ type sessionTokenPrm struct {
|
||||||
sessionToken *session.Token
|
sessionToken *session.Token
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetSessionToken sets token of the session within which request should be sent.
|
// SetSessionToken sets the token of the session within which the request should be sent.
|
||||||
func (x *sessionTokenPrm) SetSessionToken(tok *session.Token) {
|
func (x *sessionTokenPrm) SetSessionToken(tok *session.Token) {
|
||||||
x.sessionToken = tok
|
x.sessionToken = tok
|
||||||
}
|
}
|
||||||
|
@ -43,7 +43,7 @@ type bearerTokenPrm struct {
|
||||||
bearerToken *token.BearerToken
|
bearerToken *token.BearerToken
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetBearerToken sets bearer token to be attached to the request.
|
// SetBearerToken sets the bearer token to be attached to the request.
|
||||||
func (x *bearerTokenPrm) SetBearerToken(tok *token.BearerToken) {
|
func (x *bearerTokenPrm) SetBearerToken(tok *token.BearerToken) {
|
||||||
x.bearerToken = tok
|
x.bearerToken = tok
|
||||||
}
|
}
|
||||||
|
@ -69,7 +69,7 @@ type payloadWriterPrm struct {
|
||||||
wrt io.Writer
|
wrt io.Writer
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetPayloadWriter sets writer of the object payload.
|
// SetPayloadWriter sets the writer of the object payload.
|
||||||
func (x *payloadWriterPrm) SetPayloadWriter(wrt io.Writer) {
|
func (x *payloadWriterPrm) SetPayloadWriter(wrt io.Writer) {
|
||||||
x.wrt = wrt
|
x.wrt = wrt
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,7 +61,7 @@ var wellKnownBasicACL = map[string]acl.BasicACL{
|
||||||
|
|
||||||
const sessionTokenFlag = "session"
|
const sessionTokenFlag = "session"
|
||||||
|
|
||||||
// path to a file with encoded session token
|
// path to a file with an encoded session token
|
||||||
var sessionTokenPath string
|
var sessionTokenPath string
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|
|
@ -13,10 +13,10 @@ const (
|
||||||
DialTimeoutDefault = 5 * time.Second
|
DialTimeoutDefault = 5 * time.Second
|
||||||
)
|
)
|
||||||
|
|
||||||
// DialTimeout returns value of "dial_timeout" config parameter
|
// DialTimeout returns the value of "dial_timeout" config parameter
|
||||||
// from "apiclient" section.
|
// from "apiclient" section.
|
||||||
//
|
//
|
||||||
// Returns DialTimeoutDefault if value is not positive duration.
|
// Returns DialTimeoutDefault if the value is not positive duration.
|
||||||
func DialTimeout(c *config.Config) time.Duration {
|
func DialTimeout(c *config.Config) time.Duration {
|
||||||
v := config.DurationSafe(c.Sub(subsection), "dial_timeout")
|
v := config.DurationSafe(c.Sub(subsection), "dial_timeout")
|
||||||
if v > 0 {
|
if v > 0 {
|
||||||
|
|
|
@ -4,9 +4,9 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Sub returns subsection of the Config by name.
|
// Sub returns a subsection of the Config by name.
|
||||||
//
|
//
|
||||||
// Returns nil if subsection if missing.
|
// Returns nil if subsection is missing.
|
||||||
func (x *Config) Sub(name string) *Config {
|
func (x *Config) Sub(name string) *Config {
|
||||||
// copy path in order to prevent consequent violations
|
// copy path in order to prevent consequent violations
|
||||||
ln := len(x.path)
|
ln := len(x.path)
|
||||||
|
@ -29,7 +29,7 @@ func (x *Config) Sub(name string) *Config {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Value returns configuration value by name.
|
// Value returns the configuration value by name.
|
||||||
//
|
//
|
||||||
// Result can be casted to a particular type
|
// Result can be casted to a particular type
|
||||||
// via corresponding function (e.g. StringSlice).
|
// via corresponding function (e.g. StringSlice).
|
||||||
|
|
|
@ -15,10 +15,10 @@ func panicOnErr(err error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// StringSlice reads configuration value
|
// StringSlice reads a configuration value
|
||||||
// from c by name and casts it to []string.
|
// from c by name and casts it to a []string.
|
||||||
//
|
//
|
||||||
// Panics if value can not be casted.
|
// Panics if the value can not be casted.
|
||||||
func StringSlice(c *Config, name string) []string {
|
func StringSlice(c *Config, name string) []string {
|
||||||
x, err := cast.ToStringSliceE(c.Value(name))
|
x, err := cast.ToStringSliceE(c.Value(name))
|
||||||
panicOnErr(err)
|
panicOnErr(err)
|
||||||
|
@ -26,18 +26,18 @@ func StringSlice(c *Config, name string) []string {
|
||||||
return x
|
return x
|
||||||
}
|
}
|
||||||
|
|
||||||
// StringSliceSafe reads configuration value
|
// StringSliceSafe reads a configuration value
|
||||||
// from c by name and casts it to []string.
|
// from c by name and casts it to a []string.
|
||||||
//
|
//
|
||||||
// Returns nil if value can not be casted.
|
// Returns nil if the value can not be casted.
|
||||||
func StringSliceSafe(c *Config, name string) []string {
|
func StringSliceSafe(c *Config, name string) []string {
|
||||||
return cast.ToStringSlice(c.Value(name))
|
return cast.ToStringSlice(c.Value(name))
|
||||||
}
|
}
|
||||||
|
|
||||||
// String reads configuration value
|
// String reads a configuration value
|
||||||
// from c by name and casts it to string.
|
// from c by name and casts it to a string.
|
||||||
//
|
//
|
||||||
// Panics if value can not be casted.
|
// Panics if the value can not be casted.
|
||||||
func String(c *Config, name string) string {
|
func String(c *Config, name string) string {
|
||||||
x, err := cast.ToStringE(c.Value(name))
|
x, err := cast.ToStringE(c.Value(name))
|
||||||
panicOnErr(err)
|
panicOnErr(err)
|
||||||
|
@ -45,18 +45,18 @@ func String(c *Config, name string) string {
|
||||||
return x
|
return x
|
||||||
}
|
}
|
||||||
|
|
||||||
// StringSafe reads configuration value
|
// StringSafe reads a configuration value
|
||||||
// from c by name and casts it to string.
|
// from c by name and casts it to a string.
|
||||||
//
|
//
|
||||||
// Returns "" if value can not be casted.
|
// Returns "" if the value can not be casted.
|
||||||
func StringSafe(c *Config, name string) string {
|
func StringSafe(c *Config, name string) string {
|
||||||
return cast.ToString(c.Value(name))
|
return cast.ToString(c.Value(name))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Duration reads configuration value
|
// Duration reads a configuration value
|
||||||
// from c by name and casts it to time.Duration.
|
// from c by name and casts it to time.Duration.
|
||||||
//
|
//
|
||||||
// Panics if value can not be casted.
|
// Panics if the value can not be casted.
|
||||||
func Duration(c *Config, name string) time.Duration {
|
func Duration(c *Config, name string) time.Duration {
|
||||||
x, err := cast.ToDurationE(c.Value(name))
|
x, err := cast.ToDurationE(c.Value(name))
|
||||||
panicOnErr(err)
|
panicOnErr(err)
|
||||||
|
@ -64,18 +64,18 @@ func Duration(c *Config, name string) time.Duration {
|
||||||
return x
|
return x
|
||||||
}
|
}
|
||||||
|
|
||||||
// DurationSafe reads configuration value
|
// DurationSafe reads a configuration value
|
||||||
// from c by name and casts it to time.Duration.
|
// from c by name and casts it to time.Duration.
|
||||||
//
|
//
|
||||||
// Returns 0 if value can not be casted.
|
// Returns 0 if the value can not be casted.
|
||||||
func DurationSafe(c *Config, name string) time.Duration {
|
func DurationSafe(c *Config, name string) time.Duration {
|
||||||
return cast.ToDuration(c.Value(name))
|
return cast.ToDuration(c.Value(name))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bool reads configuration value
|
// Bool reads a configuration value
|
||||||
// from c by name and casts it to bool.
|
// from c by name and casts it to bool.
|
||||||
//
|
//
|
||||||
// Panics if value can not be casted.
|
// Panics if the value can not be casted.
|
||||||
func Bool(c *Config, name string) bool {
|
func Bool(c *Config, name string) bool {
|
||||||
x, err := cast.ToBoolE(c.Value(name))
|
x, err := cast.ToBoolE(c.Value(name))
|
||||||
panicOnErr(err)
|
panicOnErr(err)
|
||||||
|
@ -83,18 +83,18 @@ func Bool(c *Config, name string) bool {
|
||||||
return x
|
return x
|
||||||
}
|
}
|
||||||
|
|
||||||
// BoolSafe reads configuration value
|
// BoolSafe reads a configuration value
|
||||||
// from c by name and casts it to bool.
|
// from c by name and casts it to bool.
|
||||||
//
|
//
|
||||||
// Returns false if value can not be casted.
|
// Returns false if the value can not be casted.
|
||||||
func BoolSafe(c *Config, name string) bool {
|
func BoolSafe(c *Config, name string) bool {
|
||||||
return cast.ToBool(c.Value(name))
|
return cast.ToBool(c.Value(name))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Uint32 reads configuration value
|
// Uint32 reads a configuration value
|
||||||
// from c by name and casts it to uint32.
|
// from c by name and casts it to uint32.
|
||||||
//
|
//
|
||||||
// Panics if value can not be casted.
|
// Panics if the value can not be casted.
|
||||||
func Uint32(c *Config, name string) uint32 {
|
func Uint32(c *Config, name string) uint32 {
|
||||||
x, err := cast.ToUint32E(c.Value(name))
|
x, err := cast.ToUint32E(c.Value(name))
|
||||||
panicOnErr(err)
|
panicOnErr(err)
|
||||||
|
@ -102,18 +102,18 @@ func Uint32(c *Config, name string) uint32 {
|
||||||
return x
|
return x
|
||||||
}
|
}
|
||||||
|
|
||||||
// Uint32Safe reads configuration value
|
// Uint32Safe reads a configuration value
|
||||||
// from c by name and casts it to uint32.
|
// from c by name and casts it to uint32.
|
||||||
//
|
//
|
||||||
// Returns 0 if value can not be casted.
|
// Returns 0 if the value can not be casted.
|
||||||
func Uint32Safe(c *Config, name string) uint32 {
|
func Uint32Safe(c *Config, name string) uint32 {
|
||||||
return cast.ToUint32(c.Value(name))
|
return cast.ToUint32(c.Value(name))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Uint reads configuration value
|
// Uint reads a configuration value
|
||||||
// from c by name and casts it to uint64.
|
// from c by name and casts it to uint64.
|
||||||
//
|
//
|
||||||
// Panics if value can not be casted.
|
// Panics if the value can not be casted.
|
||||||
func Uint(c *Config, name string) uint64 {
|
func Uint(c *Config, name string) uint64 {
|
||||||
x, err := cast.ToUint64E(c.Value(name))
|
x, err := cast.ToUint64E(c.Value(name))
|
||||||
panicOnErr(err)
|
panicOnErr(err)
|
||||||
|
@ -121,18 +121,18 @@ func Uint(c *Config, name string) uint64 {
|
||||||
return x
|
return x
|
||||||
}
|
}
|
||||||
|
|
||||||
// UintSafe reads configuration value
|
// UintSafe reads a configuration value
|
||||||
// from c by name and casts it to uint64.
|
// from c by name and casts it to uint64.
|
||||||
//
|
//
|
||||||
// Returns 0 if value can not be casted.
|
// Returns 0 if the value can not be casted.
|
||||||
func UintSafe(c *Config, name string) uint64 {
|
func UintSafe(c *Config, name string) uint64 {
|
||||||
return cast.ToUint64(c.Value(name))
|
return cast.ToUint64(c.Value(name))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Int reads configuration value
|
// Int reads a configuration value
|
||||||
// from c by name and casts it to int64.
|
// from c by name and casts it to int64.
|
||||||
//
|
//
|
||||||
// Panics if value can not be casted.
|
// Panics if the value can not be casted.
|
||||||
func Int(c *Config, name string) int64 {
|
func Int(c *Config, name string) int64 {
|
||||||
x, err := cast.ToInt64E(c.Value(name))
|
x, err := cast.ToInt64E(c.Value(name))
|
||||||
panicOnErr(err)
|
panicOnErr(err)
|
||||||
|
@ -140,15 +140,15 @@ func Int(c *Config, name string) int64 {
|
||||||
return x
|
return x
|
||||||
}
|
}
|
||||||
|
|
||||||
// IntSafe reads configuration value
|
// IntSafe reads a configuration value
|
||||||
// from c by name and casts it to int64.
|
// from c by name and casts it to int64.
|
||||||
//
|
//
|
||||||
// Returns 0 if value can not be casted.
|
// Returns 0 if the value can not be casted.
|
||||||
func IntSafe(c *Config, name string) int64 {
|
func IntSafe(c *Config, name string) int64 {
|
||||||
return cast.ToInt64(c.Value(name))
|
return cast.ToInt64(c.Value(name))
|
||||||
}
|
}
|
||||||
|
|
||||||
// SizeInBytesSafe reads configuration value
|
// SizeInBytesSafe reads a configuration value
|
||||||
// from c by name and casts it to size in bytes (uint64).
|
// from c by name and casts it to size in bytes (uint64).
|
||||||
//
|
//
|
||||||
// The suffix can be single-letter (b, k, m, g, t) or with
|
// The suffix can be single-letter (b, k, m, g, t) or with
|
||||||
|
|
|
@ -11,47 +11,47 @@ const (
|
||||||
subsection = "contracts"
|
subsection = "contracts"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Netmap returns value of "netmap" config parameter
|
// Netmap returns the value of "netmap" config parameter
|
||||||
// from "contracts" section.
|
// from "contracts" section.
|
||||||
//
|
//
|
||||||
// Returns zero filled script hash if value is not set.
|
// Returns zero filled script hash if the value is not set.
|
||||||
// Throws panic if value is not a 20-byte LE hex-encoded string.
|
// Throws panic if the value is not a 20-byte LE hex-encoded string.
|
||||||
func Netmap(c *config.Config) util.Uint160 {
|
func Netmap(c *config.Config) util.Uint160 {
|
||||||
return contractAddress(c, "netmap")
|
return contractAddress(c, "netmap")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Balance returns value of "balance" config parameter
|
// Balance returns the value of "balance" config parameter
|
||||||
// from "contracts" section.
|
// from "contracts" section.
|
||||||
//
|
//
|
||||||
// Returns zero filled script hash if value is not set.
|
// Returns zero filled script hash if the value is not set.
|
||||||
// Throws panic if value is not a 20-byte LE hex-encoded string.
|
// Throws panic if the value is not a 20-byte LE hex-encoded string.
|
||||||
func Balance(c *config.Config) util.Uint160 {
|
func Balance(c *config.Config) util.Uint160 {
|
||||||
return contractAddress(c, "balance")
|
return contractAddress(c, "balance")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Container returns value of "container" config parameter
|
// Container returns the value of "container" config parameter
|
||||||
// from "contracts" section.
|
// from "contracts" section.
|
||||||
//
|
//
|
||||||
// Returns zero filled script hash if value is not set.
|
// Returns zero filled script hash if the value is not set.
|
||||||
// Throws panic if value is not a 20-byte LE hex-encoded string.
|
// Throws panic if the value is not a 20-byte LE hex-encoded string.
|
||||||
func Container(c *config.Config) util.Uint160 {
|
func Container(c *config.Config) util.Uint160 {
|
||||||
return contractAddress(c, "container")
|
return contractAddress(c, "container")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reputation returns value of "reputation" config parameter
|
// Reputation returnsthe value of "reputation" config parameter
|
||||||
// from "contracts" section.
|
// from "contracts" section.
|
||||||
//
|
//
|
||||||
// Returns zero filled script hash if value is not set.
|
// Returns zero filled script hash if the value is not set.
|
||||||
// Throws panic if value is not a 20-byte LE hex-encoded string.
|
// Throws panic if the value is not a 20-byte LE hex-encoded string.
|
||||||
func Reputation(c *config.Config) util.Uint160 {
|
func Reputation(c *config.Config) util.Uint160 {
|
||||||
return contractAddress(c, "reputation")
|
return contractAddress(c, "reputation")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Proxy returns value of "proxy" config parameter
|
// Proxy returnsthe value of "proxy" config parameter
|
||||||
// from "contracts" section.
|
// from "contracts" section.
|
||||||
//
|
//
|
||||||
// Returns zero filled script hash if value is not set.
|
// Returns zero filled script hash if the value is not set.
|
||||||
// Throws panic if value is not a 20-byte LE hex-encoded string.
|
// Throws panic if the value is not a 20-byte LE hex-encoded string.
|
||||||
func Proxy(c *config.Config) util.Uint160 {
|
func Proxy(c *config.Config) util.Uint160 {
|
||||||
return contractAddress(c, "proxy")
|
return contractAddress(c, "proxy")
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,10 +21,10 @@ const (
|
||||||
GRPCEndpointDefault = ""
|
GRPCEndpointDefault = ""
|
||||||
)
|
)
|
||||||
|
|
||||||
// AuthorizedKeys parses and returns array of "authorized_keys" config
|
// AuthorizedKeys parses and returns an array of "authorized_keys" config
|
||||||
// parameter from "control" section.
|
// parameter from "control" section.
|
||||||
//
|
//
|
||||||
// Returns empty list if not set.
|
// Returns an empty list if not set.
|
||||||
func AuthorizedKeys(c *config.Config) keys.PublicKeys {
|
func AuthorizedKeys(c *config.Config) keys.PublicKeys {
|
||||||
strKeys := config.StringSliceSafe(c.Sub(subsection), "authorized_keys")
|
strKeys := config.StringSliceSafe(c.Sub(subsection), "authorized_keys")
|
||||||
pubs := make(keys.PublicKeys, 0, len(strKeys))
|
pubs := make(keys.PublicKeys, 0, len(strKeys))
|
||||||
|
@ -41,7 +41,7 @@ func AuthorizedKeys(c *config.Config) keys.PublicKeys {
|
||||||
return pubs
|
return pubs
|
||||||
}
|
}
|
||||||
|
|
||||||
// GRPC returns structure that provides access to "grpc" subsection of
|
// GRPC returns a structure that provides access to "grpc" subsection of
|
||||||
// "control" section.
|
// "control" section.
|
||||||
func GRPC(c *config.Config) GRPCConfig {
|
func GRPC(c *config.Config) GRPCConfig {
|
||||||
return GRPCConfig{
|
return GRPCConfig{
|
||||||
|
@ -49,9 +49,9 @@ func GRPC(c *config.Config) GRPCConfig {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Endpoint returns value of "endpoint" config parameter.
|
// Endpoint returns the value of "endpoint" config parameter.
|
||||||
//
|
//
|
||||||
// Returns GRPCEndpointDefault if value is not a non-empty string.
|
// Returns GRPCEndpointDefault if the value is not a non-empty string.
|
||||||
func (g GRPCConfig) Endpoint() string {
|
func (g GRPCConfig) Endpoint() string {
|
||||||
v := config.String(g.cfg, "endpoint")
|
v := config.String(g.cfg, "endpoint")
|
||||||
if v != "" {
|
if v != "" {
|
||||||
|
|
|
@ -11,7 +11,7 @@ const (
|
||||||
subsection = "storage"
|
subsection = "storage"
|
||||||
|
|
||||||
// ShardPoolSizeDefault is a default value of routine pool size per-shard to
|
// ShardPoolSizeDefault is a default value of routine pool size per-shard to
|
||||||
// process object PUT operations in storage engine.
|
// process object PUT operations in a storage engine.
|
||||||
ShardPoolSizeDefault = 20
|
ShardPoolSizeDefault = 20
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -47,9 +47,9 @@ func IterateShards(c *config.Config, required bool, f func(*shardconfig.Config))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ShardPoolSize returns value of "shard_pool_size" config parameter from "storage" section.
|
// ShardPoolSize returns the value of "shard_pool_size" config parameter from "storage" section.
|
||||||
//
|
//
|
||||||
// Returns ShardPoolSizeDefault if value is not a positive number.
|
// Returns ShardPoolSizeDefault if the value is not a positive number.
|
||||||
func ShardPoolSize(c *config.Config) uint32 {
|
func ShardPoolSize(c *config.Config) uint32 {
|
||||||
v := config.Uint32Safe(c.Sub(subsection), "shard_pool_size")
|
v := config.Uint32Safe(c.Sub(subsection), "shard_pool_size")
|
||||||
if v > 0 {
|
if v > 0 {
|
||||||
|
@ -59,9 +59,9 @@ func ShardPoolSize(c *config.Config) uint32 {
|
||||||
return ShardPoolSizeDefault
|
return ShardPoolSizeDefault
|
||||||
}
|
}
|
||||||
|
|
||||||
// ShardErrorThreshold returns value of "shard_ro_error_threshold" config parameter from "storage" section.
|
// ShardErrorThreshold returns the value of "shard_ro_error_threshold" config parameter from "storage" section.
|
||||||
//
|
//
|
||||||
// Returns 0 if the value is missing.
|
// Returns 0 if the the value is missing.
|
||||||
func ShardErrorThreshold(c *config.Config) uint32 {
|
func ShardErrorThreshold(c *config.Config) uint32 {
|
||||||
return config.Uint32Safe(c.Sub(subsection), "shard_ro_error_threshold")
|
return config.Uint32Safe(c.Sub(subsection), "shard_ro_error_threshold")
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,9 +28,9 @@ func From(c *config.Config) *Config {
|
||||||
return (*Config)(c)
|
return (*Config)(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Size returns value of "size" config parameter.
|
// Size returns the value of "size" config parameter.
|
||||||
//
|
//
|
||||||
// Returns SizeDefault if value is not a positive number.
|
// Returns SizeDefault if the value is not a positive number.
|
||||||
func (x *Config) Size() uint64 {
|
func (x *Config) Size() uint64 {
|
||||||
s := config.SizeInBytesSafe(
|
s := config.SizeInBytesSafe(
|
||||||
(*config.Config)(x),
|
(*config.Config)(x),
|
||||||
|
@ -44,9 +44,9 @@ func (x *Config) Size() uint64 {
|
||||||
return SizeDefault
|
return SizeDefault
|
||||||
}
|
}
|
||||||
|
|
||||||
// ShallowDepth returns value of "depth" config parameter.
|
// ShallowDepth returns the value of "depth" config parameter.
|
||||||
//
|
//
|
||||||
// Returns ShallowDepthDefault if value is not a positive number.
|
// Returns ShallowDepthDefault if the value is not a positive number.
|
||||||
func (x *Config) ShallowDepth() uint64 {
|
func (x *Config) ShallowDepth() uint64 {
|
||||||
d := config.UintSafe(
|
d := config.UintSafe(
|
||||||
(*config.Config)(x),
|
(*config.Config)(x),
|
||||||
|
@ -60,9 +60,9 @@ func (x *Config) ShallowDepth() uint64 {
|
||||||
return ShallowDepthDefault
|
return ShallowDepthDefault
|
||||||
}
|
}
|
||||||
|
|
||||||
// ShallowWidth returns value of "width" config parameter.
|
// ShallowWidth returns the value of "width" config parameter.
|
||||||
//
|
//
|
||||||
// Returns ShallowWidthDefault if value is not a positive number.
|
// Returns ShallowWidthDefault if the value is not a positive number.
|
||||||
func (x *Config) ShallowWidth() uint64 {
|
func (x *Config) ShallowWidth() uint64 {
|
||||||
d := config.UintSafe(
|
d := config.UintSafe(
|
||||||
(*config.Config)(x),
|
(*config.Config)(x),
|
||||||
|
@ -76,9 +76,9 @@ func (x *Config) ShallowWidth() uint64 {
|
||||||
return ShallowWidthDefault
|
return ShallowWidthDefault
|
||||||
}
|
}
|
||||||
|
|
||||||
// OpenedCacheSize returns value of "opened_cache_capacity" config parameter.
|
// OpenedCacheSize returns the value of "opened_cache_capacity" config parameter.
|
||||||
//
|
//
|
||||||
// Returns OpenedCacheSizeDefault if value is not a positive number.
|
// Returns OpenedCacheSizeDefault if the value is not a positive number.
|
||||||
func (x *Config) OpenedCacheSize() int {
|
func (x *Config) OpenedCacheSize() int {
|
||||||
d := config.IntSafe(
|
d := config.IntSafe(
|
||||||
(*config.Config)(x),
|
(*config.Config)(x),
|
||||||
|
|
|
@ -29,9 +29,9 @@ func From(c *config.Config) *Config {
|
||||||
return (*Config)(c)
|
return (*Config)(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Path returns value of "path" config parameter.
|
// Path returns the value of "path" config parameter.
|
||||||
//
|
//
|
||||||
// Panics if value is not a non-empty string.
|
// Panics if the value is not a non-empty string.
|
||||||
func (x *Config) Path() string {
|
func (x *Config) Path() string {
|
||||||
p := config.String(
|
p := config.String(
|
||||||
(*config.Config)(x),
|
(*config.Config)(x),
|
||||||
|
@ -45,9 +45,9 @@ func (x *Config) Path() string {
|
||||||
return p
|
return p
|
||||||
}
|
}
|
||||||
|
|
||||||
// Perm returns value of "perm" config parameter as a fs.FileMode.
|
// Perm returns the value of "perm" config parameter as a fs.FileMode.
|
||||||
//
|
//
|
||||||
// Returns PermDefault if value is not a non-zero number.
|
// Returns PermDefault if the value is not a non-zero number.
|
||||||
func (x *Config) Perm() fs.FileMode {
|
func (x *Config) Perm() fs.FileMode {
|
||||||
p := config.UintSafe(
|
p := config.UintSafe(
|
||||||
(*config.Config)(x),
|
(*config.Config)(x),
|
||||||
|
@ -61,9 +61,9 @@ func (x *Config) Perm() fs.FileMode {
|
||||||
return fs.FileMode(p)
|
return fs.FileMode(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ShallowDepth returns value of "depth" config parameter.
|
// ShallowDepth returns the value of "depth" config parameter.
|
||||||
//
|
//
|
||||||
// Returns ShallowDepthDefault if value is out of
|
// Returns ShallowDepthDefault if the value is out of
|
||||||
// [1:fstree.MaxDepth] range.
|
// [1:fstree.MaxDepth] range.
|
||||||
func (x *Config) ShallowDepth() int {
|
func (x *Config) ShallowDepth() int {
|
||||||
d := config.IntSafe(
|
d := config.IntSafe(
|
||||||
|
@ -78,9 +78,9 @@ func (x *Config) ShallowDepth() int {
|
||||||
return ShallowDepthDefault
|
return ShallowDepthDefault
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compress returns value of "compress" config parameter.
|
// Compress returns the value of "compress" config parameter.
|
||||||
//
|
//
|
||||||
// Returns false if value is not a valid bool.
|
// Returns false if the value is not a valid bool.
|
||||||
func (x *Config) Compress() bool {
|
func (x *Config) Compress() bool {
|
||||||
return config.BoolSafe(
|
return config.BoolSafe(
|
||||||
(*config.Config)(x),
|
(*config.Config)(x),
|
||||||
|
@ -88,18 +88,18 @@ func (x *Config) Compress() bool {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// UncompressableContentTypes returns value of "compress_skip_content_types" config parameter.
|
// UncompressableContentTypes returns the value of "compress_skip_content_types" config parameter.
|
||||||
//
|
//
|
||||||
// Returns nil if a value is missing or is invalid.
|
// Returns nil if a the value is missing or is invalid.
|
||||||
func (x *Config) UncompressableContentTypes() []string {
|
func (x *Config) UncompressableContentTypes() []string {
|
||||||
return config.StringSliceSafe(
|
return config.StringSliceSafe(
|
||||||
(*config.Config)(x),
|
(*config.Config)(x),
|
||||||
"compression_exclude_content_types")
|
"compression_exclude_content_types")
|
||||||
}
|
}
|
||||||
|
|
||||||
// SmallSizeLimit returns value of "small_object_size" config parameter.
|
// SmallSizeLimit returns the value of "small_object_size" config parameter.
|
||||||
//
|
//
|
||||||
// Returns SmallSizeLimitDefault if value is not a positive number.
|
// Returns SmallSizeLimitDefault if the value is not a positive number.
|
||||||
func (x *Config) SmallSizeLimit() uint64 {
|
func (x *Config) SmallSizeLimit() uint64 {
|
||||||
l := config.SizeInBytesSafe(
|
l := config.SizeInBytesSafe(
|
||||||
(*config.Config)(x),
|
(*config.Config)(x),
|
||||||
|
|
|
@ -52,9 +52,9 @@ func (x *Config) GC() *gcconfig.Config {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// RefillMetabase returns value of "resync_metabase" config parameter.
|
// RefillMetabase returns the value of "resync_metabase" config parameter.
|
||||||
//
|
//
|
||||||
// Returns false if value is not a valid bool.
|
// Returns false if the value is not a valid bool.
|
||||||
func (x *Config) RefillMetabase() bool {
|
func (x *Config) RefillMetabase() bool {
|
||||||
return config.BoolSafe(
|
return config.BoolSafe(
|
||||||
(*config.Config)(x),
|
(*config.Config)(x),
|
||||||
|
@ -62,9 +62,9 @@ func (x *Config) RefillMetabase() bool {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mode return value of "mode" config parameter.
|
// Mode return the value of "mode" config parameter.
|
||||||
//
|
//
|
||||||
// Panics if read value is not one of predefined
|
// Panics if read the value is not one of predefined
|
||||||
// shard modes.
|
// shard modes.
|
||||||
func (x *Config) Mode() (m shard.Mode) {
|
func (x *Config) Mode() (m shard.Mode) {
|
||||||
s := config.StringSafe(
|
s := config.StringSafe(
|
||||||
|
|
|
@ -24,10 +24,10 @@ func From(c *config.Config) *Config {
|
||||||
return (*Config)(c)
|
return (*Config)(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
// RemoverBatchSize returns value of "remover_batch_size"
|
// RemoverBatchSize returns the value of "remover_batch_size"
|
||||||
// config parameter.
|
// config parameter.
|
||||||
//
|
//
|
||||||
// Returns RemoverBatchSizeDefault if value is not a positive number.
|
// Returns RemoverBatchSizeDefault if the value is not a positive number.
|
||||||
func (x *Config) RemoverBatchSize() int {
|
func (x *Config) RemoverBatchSize() int {
|
||||||
s := config.IntSafe(
|
s := config.IntSafe(
|
||||||
(*config.Config)(x),
|
(*config.Config)(x),
|
||||||
|
@ -41,10 +41,10 @@ func (x *Config) RemoverBatchSize() int {
|
||||||
return RemoverBatchSizeDefault
|
return RemoverBatchSizeDefault
|
||||||
}
|
}
|
||||||
|
|
||||||
// RemoverSleepInterval returns value of "remover_sleep_interval"
|
// RemoverSleepInterval returns the value of "remover_sleep_interval"
|
||||||
// config parameter.
|
// config parameter.
|
||||||
//
|
//
|
||||||
// Returns RemoverSleepIntervalDefault if value is not a positive number.
|
// Returns RemoverSleepIntervalDefault if the value is not a positive number.
|
||||||
func (x *Config) RemoverSleepInterval() time.Duration {
|
func (x *Config) RemoverSleepInterval() time.Duration {
|
||||||
s := config.DurationSafe(
|
s := config.DurationSafe(
|
||||||
(*config.Config)(x),
|
(*config.Config)(x),
|
||||||
|
|
|
@ -21,9 +21,9 @@ func From(c *config.Config) *Config {
|
||||||
return (*Config)(c)
|
return (*Config)(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Path returns value of "path" config parameter.
|
// Path returns the value of "path" config parameter.
|
||||||
//
|
//
|
||||||
// Panics if value is not a non-empty string.
|
// Panics if the value is not a non-empty string.
|
||||||
func (x *Config) Path() string {
|
func (x *Config) Path() string {
|
||||||
p := config.String(
|
p := config.String(
|
||||||
(*config.Config)(x),
|
(*config.Config)(x),
|
||||||
|
@ -37,9 +37,9 @@ func (x *Config) Path() string {
|
||||||
return p
|
return p
|
||||||
}
|
}
|
||||||
|
|
||||||
// Perm returns value of "perm" config parameter as a fs.FileMode.
|
// Perm returns the value of "perm" config parameter as a fs.FileMode.
|
||||||
//
|
//
|
||||||
// Returns PermDefault if value is not a positive number.
|
// Returns PermDefault if the value is not a positive number.
|
||||||
func (x *Config) Perm() fs.FileMode {
|
func (x *Config) Perm() fs.FileMode {
|
||||||
p := config.UintSafe(
|
p := config.UintSafe(
|
||||||
(*config.Config)(x),
|
(*config.Config)(x),
|
||||||
|
|
|
@ -33,14 +33,14 @@ func From(c *config.Config) *Config {
|
||||||
|
|
||||||
// Enabled returns true if write-cache is enabled and false otherwise.
|
// Enabled returns true if write-cache is enabled and false otherwise.
|
||||||
//
|
//
|
||||||
// Panics if value is not a boolean.
|
// Panics if the value is not a boolean.
|
||||||
func (x *Config) Enabled() bool {
|
func (x *Config) Enabled() bool {
|
||||||
return config.Bool((*config.Config)(x), "enabled")
|
return config.Bool((*config.Config)(x), "enabled")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Path returns value of "path" config parameter.
|
// Path returns the value of "path" config parameter.
|
||||||
//
|
//
|
||||||
// Panics if value is not a non-empty string.
|
// Panics if the value is not a non-empty string.
|
||||||
func (x *Config) Path() string {
|
func (x *Config) Path() string {
|
||||||
p := config.String(
|
p := config.String(
|
||||||
(*config.Config)(x),
|
(*config.Config)(x),
|
||||||
|
@ -54,9 +54,9 @@ func (x *Config) Path() string {
|
||||||
return p
|
return p
|
||||||
}
|
}
|
||||||
|
|
||||||
// MemSize returns value of "memcache_capacity" config parameter.
|
// MemSize returns the value of "memcache_capacity" config parameter.
|
||||||
//
|
//
|
||||||
// Returns MemSizeDefault if value is not a positive number.
|
// Returns MemSizeDefault if the value is not a positive number.
|
||||||
func (x *Config) MemSize() uint64 {
|
func (x *Config) MemSize() uint64 {
|
||||||
s := config.SizeInBytesSafe(
|
s := config.SizeInBytesSafe(
|
||||||
(*config.Config)(x),
|
(*config.Config)(x),
|
||||||
|
@ -70,9 +70,9 @@ func (x *Config) MemSize() uint64 {
|
||||||
return MemSizeDefault
|
return MemSizeDefault
|
||||||
}
|
}
|
||||||
|
|
||||||
// SmallObjectSize returns value of "small_object_size" config parameter.
|
// SmallObjectSize returns the value of "small_object_size" config parameter.
|
||||||
//
|
//
|
||||||
// Returns SmallSizeDefault if value is not a positive number.
|
// Returns SmallSizeDefault if the value is not a positive number.
|
||||||
func (x *Config) SmallObjectSize() uint64 {
|
func (x *Config) SmallObjectSize() uint64 {
|
||||||
s := config.SizeInBytesSafe(
|
s := config.SizeInBytesSafe(
|
||||||
(*config.Config)(x),
|
(*config.Config)(x),
|
||||||
|
@ -86,9 +86,9 @@ func (x *Config) SmallObjectSize() uint64 {
|
||||||
return SmallSizeDefault
|
return SmallSizeDefault
|
||||||
}
|
}
|
||||||
|
|
||||||
// MaxObjectSize returns value of "max_object_size" config parameter.
|
// MaxObjectSize returns the value of "max_object_size" config parameter.
|
||||||
//
|
//
|
||||||
// Returns MaxSizeDefault if value is not a positive number.
|
// Returns MaxSizeDefault if the value is not a positive number.
|
||||||
func (x *Config) MaxObjectSize() uint64 {
|
func (x *Config) MaxObjectSize() uint64 {
|
||||||
s := config.SizeInBytesSafe(
|
s := config.SizeInBytesSafe(
|
||||||
(*config.Config)(x),
|
(*config.Config)(x),
|
||||||
|
@ -102,9 +102,9 @@ func (x *Config) MaxObjectSize() uint64 {
|
||||||
return MaxSizeDefault
|
return MaxSizeDefault
|
||||||
}
|
}
|
||||||
|
|
||||||
// WorkersNumber returns value of "workers_number" config parameter.
|
// WorkersNumber returns the value of "workers_number" config parameter.
|
||||||
//
|
//
|
||||||
// Returns WorkersNumberDefault if value is not a positive number.
|
// Returns WorkersNumberDefault if the value is not a positive number.
|
||||||
func (x *Config) WorkersNumber() int {
|
func (x *Config) WorkersNumber() int {
|
||||||
c := config.IntSafe(
|
c := config.IntSafe(
|
||||||
(*config.Config)(x),
|
(*config.Config)(x),
|
||||||
|
@ -118,9 +118,9 @@ func (x *Config) WorkersNumber() int {
|
||||||
return WorkersNumberDefault
|
return WorkersNumberDefault
|
||||||
}
|
}
|
||||||
|
|
||||||
// SizeLimit returns value of "capacity" config parameter.
|
// SizeLimit returns the value of "capacity" config parameter.
|
||||||
//
|
//
|
||||||
// Returns SizeLimitDefault if value is not a positive number.
|
// Returns SizeLimitDefault if the value is not a positive number.
|
||||||
func (x *Config) SizeLimit() uint64 {
|
func (x *Config) SizeLimit() uint64 {
|
||||||
c := config.SizeInBytesSafe(
|
c := config.SizeInBytesSafe(
|
||||||
(*config.Config)(x),
|
(*config.Config)(x),
|
||||||
|
|
|
@ -17,9 +17,9 @@ var (
|
||||||
// which provides access to gRPC server configurations.
|
// which provides access to gRPC server configurations.
|
||||||
type Config config.Config
|
type Config config.Config
|
||||||
|
|
||||||
// Endpoint returns value of "endpoint" config parameter.
|
// Endpoint returns the value of "endpoint" config parameter.
|
||||||
//
|
//
|
||||||
// Panics if value is not a non-empty string.
|
// Panics if the value is not a non-empty string.
|
||||||
func (x *Config) Endpoint() string {
|
func (x *Config) Endpoint() string {
|
||||||
v := config.StringSafe(
|
v := config.StringSafe(
|
||||||
(*config.Config)(x),
|
(*config.Config)(x),
|
||||||
|
@ -54,9 +54,9 @@ type TLSConfig struct {
|
||||||
cfg *config.Config
|
cfg *config.Config
|
||||||
}
|
}
|
||||||
|
|
||||||
// KeyFile returns value of "key" config parameter.
|
// KeyFile returns the value of "key" config parameter.
|
||||||
//
|
//
|
||||||
// Panics if value is not a non-empty string.
|
// Panics if the value is not a non-empty string.
|
||||||
func (tls TLSConfig) KeyFile() string {
|
func (tls TLSConfig) KeyFile() string {
|
||||||
v := config.StringSafe(tls.cfg, "key")
|
v := config.StringSafe(tls.cfg, "key")
|
||||||
if v == "" {
|
if v == "" {
|
||||||
|
@ -66,9 +66,9 @@ func (tls TLSConfig) KeyFile() string {
|
||||||
return v
|
return v
|
||||||
}
|
}
|
||||||
|
|
||||||
// CertificateFile returns value of "certificate" config parameter.
|
// CertificateFile returns the value of "certificate" config parameter.
|
||||||
//
|
//
|
||||||
// Panics if value is not a non-empty string.
|
// Panics if the value is not a non-empty string.
|
||||||
func (tls TLSConfig) CertificateFile() string {
|
func (tls TLSConfig) CertificateFile() string {
|
||||||
v := config.StringSafe(tls.cfg, "certificate")
|
v := config.StringSafe(tls.cfg, "certificate")
|
||||||
if v == "" {
|
if v == "" {
|
||||||
|
|
|
@ -11,7 +11,7 @@ const EnvPrefix = "neofs"
|
||||||
// EnvSeparator is a section separator in ENV variables.
|
// EnvSeparator is a section separator in ENV variables.
|
||||||
const EnvSeparator = "_"
|
const EnvSeparator = "_"
|
||||||
|
|
||||||
// Env returns ENV variable key for particular config parameter.
|
// Env returns ENV variable key for a particular config parameter.
|
||||||
func Env(path ...string) string {
|
func Env(path ...string) string {
|
||||||
return strings.ToUpper(
|
return strings.ToUpper(
|
||||||
strings.Join(
|
strings.Join(
|
||||||
|
|
|
@ -10,10 +10,10 @@ const (
|
||||||
LevelDefault = "info"
|
LevelDefault = "info"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Level returns value of "level" config parameter
|
// Level returns the value of "level" config parameter
|
||||||
// from "logger" section.
|
// from "logger" section.
|
||||||
//
|
//
|
||||||
// Returns LevelDefault if value is not a non-empty string.
|
// Returns LevelDefault if the value is not a non-empty string.
|
||||||
func Level(c *config.Config) string {
|
func Level(c *config.Config) string {
|
||||||
v := config.StringSafe(
|
v := config.StringSafe(
|
||||||
c.Sub("logger"),
|
c.Sub("logger"),
|
||||||
|
|
|
@ -13,18 +13,18 @@ const (
|
||||||
DialTimeoutDefault = 5 * time.Second
|
DialTimeoutDefault = 5 * time.Second
|
||||||
)
|
)
|
||||||
|
|
||||||
// RPCEndpoint returns list of values of "rpc_endpoint" config parameter
|
// RPCEndpoint returns a list of the values of "rpc_endpoint" config parameter
|
||||||
// from "mainchain" section.
|
// from "mainchain" section.
|
||||||
//
|
//
|
||||||
// Returns empty list if value is not a non-empty string array.
|
// Returns empty list if the value is not a non-empty string array.
|
||||||
func RPCEndpoint(c *config.Config) []string {
|
func RPCEndpoint(c *config.Config) []string {
|
||||||
return config.StringSliceSafe(c.Sub(subsection), "rpc_endpoint")
|
return config.StringSliceSafe(c.Sub(subsection), "rpc_endpoint")
|
||||||
}
|
}
|
||||||
|
|
||||||
// DialTimeout returns value of "dial_timeout" config parameter
|
// DialTimeout returns the value of "dial_timeout" config parameter
|
||||||
// from "mainchain" section.
|
// from "mainchain" section.
|
||||||
//
|
//
|
||||||
// Returns DialTimeoutDefault if value is not positive duration.
|
// Returns DialTimeoutDefault if the value is not positive duration.
|
||||||
func DialTimeout(c *config.Config) time.Duration {
|
func DialTimeout(c *config.Config) time.Duration {
|
||||||
v := config.DurationSafe(c.Sub(subsection), "dial_timeout")
|
v := config.DurationSafe(c.Sub(subsection), "dial_timeout")
|
||||||
if v > 0 {
|
if v > 0 {
|
||||||
|
|
|
@ -16,10 +16,10 @@ const (
|
||||||
AddressDefault = ""
|
AddressDefault = ""
|
||||||
)
|
)
|
||||||
|
|
||||||
// ShutdownTimeout returns value of "shutdown_timeout" config parameter
|
// ShutdownTimeout returns the value of "shutdown_timeout" config parameter
|
||||||
// from "metrics" section.
|
// from "metrics" section.
|
||||||
//
|
//
|
||||||
// Returns ShutdownTimeoutDefault if value is not positive duration.
|
// Returns ShutdownTimeoutDefault if the value is not positive duration.
|
||||||
func ShutdownTimeout(c *config.Config) time.Duration {
|
func ShutdownTimeout(c *config.Config) time.Duration {
|
||||||
v := config.DurationSafe(c.Sub(subsection), "shutdown_timeout")
|
v := config.DurationSafe(c.Sub(subsection), "shutdown_timeout")
|
||||||
if v > 0 {
|
if v > 0 {
|
||||||
|
@ -29,10 +29,10 @@ func ShutdownTimeout(c *config.Config) time.Duration {
|
||||||
return ShutdownTimeoutDefault
|
return ShutdownTimeoutDefault
|
||||||
}
|
}
|
||||||
|
|
||||||
// Address returns value of "address" config parameter
|
// Address returns the value of "address" config parameter
|
||||||
// from "metrics" section.
|
// from "metrics" section.
|
||||||
//
|
//
|
||||||
// Returns AddressDefault if value is not set.
|
// Returns AddressDefault if the value is not set.
|
||||||
func Address(c *config.Config) string {
|
func Address(c *config.Config) string {
|
||||||
v := config.StringSafe(c.Sub(subsection), "address")
|
v := config.StringSafe(c.Sub(subsection), "address")
|
||||||
if v != "" {
|
if v != "" {
|
||||||
|
|
|
@ -24,7 +24,7 @@ const (
|
||||||
MaxConnPerHostDefault = 10
|
MaxConnPerHostDefault = 10
|
||||||
)
|
)
|
||||||
|
|
||||||
// RPCEndpoint returns list of values of "rpc_endpoint" config parameter
|
// RPCEndpoint returns list of the values of "rpc_endpoint" config parameter
|
||||||
// from "morph" section.
|
// from "morph" section.
|
||||||
//
|
//
|
||||||
// Throws panic if list is empty.
|
// Throws panic if list is empty.
|
||||||
|
@ -37,10 +37,10 @@ func RPCEndpoint(c *config.Config) []string {
|
||||||
return v
|
return v
|
||||||
}
|
}
|
||||||
|
|
||||||
// DialTimeout returns value of "dial_timeout" config parameter
|
// DialTimeout returns the value of "dial_timeout" config parameter
|
||||||
// from "morph" section.
|
// from "morph" section.
|
||||||
//
|
//
|
||||||
// Returns DialTimeoutDefault if value is not positive duration.
|
// Returns DialTimeoutDefault if the value is not positive duration.
|
||||||
func DialTimeout(c *config.Config) time.Duration {
|
func DialTimeout(c *config.Config) time.Duration {
|
||||||
v := config.DurationSafe(c.Sub(subsection), "dial_timeout")
|
v := config.DurationSafe(c.Sub(subsection), "dial_timeout")
|
||||||
if v > 0 {
|
if v > 0 {
|
||||||
|
@ -50,7 +50,7 @@ func DialTimeout(c *config.Config) time.Duration {
|
||||||
return DialTimeoutDefault
|
return DialTimeoutDefault
|
||||||
}
|
}
|
||||||
|
|
||||||
// DisableCache returns value of "disable_cache" config parameter
|
// DisableCache returns the value of "disable_cache" config parameter
|
||||||
// from "morph" section.
|
// from "morph" section.
|
||||||
func DisableCache(c *config.Config) bool {
|
func DisableCache(c *config.Config) bool {
|
||||||
return config.BoolSafe(c.Sub(subsection), "disable_cache")
|
return config.BoolSafe(c.Sub(subsection), "disable_cache")
|
||||||
|
|
|
@ -45,12 +45,12 @@ const (
|
||||||
NotificationTimeoutDefault = 5 * time.Second
|
NotificationTimeoutDefault = 5 * time.Second
|
||||||
)
|
)
|
||||||
|
|
||||||
// Key returns value of "key" config parameter
|
// Key returns the value of "key" config parameter
|
||||||
// from "node" section.
|
// from "node" section.
|
||||||
//
|
//
|
||||||
// If value is not set, fallbacks to Wallet section.
|
// If the value is not set, fallbacks to Wallet section.
|
||||||
//
|
//
|
||||||
// Panics if value is incorrect filename of binary encoded private key.
|
// Panics if the value is incorrect filename of binary encoded private key.
|
||||||
func Key(c *config.Config) *keys.PrivateKey {
|
func Key(c *config.Config) *keys.PrivateKey {
|
||||||
v := config.StringSafe(c.Sub(subsection), "key")
|
v := config.StringSafe(c.Sub(subsection), "key")
|
||||||
if v == "" {
|
if v == "" {
|
||||||
|
@ -73,7 +73,7 @@ func Key(c *config.Config) *keys.PrivateKey {
|
||||||
return key
|
return key
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wallet returns value of node private key from "node" section.
|
// Wallet returns the value of a node private key from "node" section.
|
||||||
//
|
//
|
||||||
// Panics if section contains invalid values.
|
// Panics if section contains invalid values.
|
||||||
func Wallet(c *config.Config) *keys.PrivateKey {
|
func Wallet(c *config.Config) *keys.PrivateKey {
|
||||||
|
@ -103,10 +103,10 @@ func (x stringAddressGroup) NumberOfAddresses() int {
|
||||||
return len(x)
|
return len(x)
|
||||||
}
|
}
|
||||||
|
|
||||||
// BootstrapAddresses returns value of "addresses" config parameter
|
// BootstrapAddresses returns the value of "addresses" config parameter
|
||||||
// from "node" section as network.AddressGroup.
|
// from "node" section as network.AddressGroup.
|
||||||
//
|
//
|
||||||
// Panics if value is not a string list of valid NeoFS network addresses.
|
// Panics if the value is not a string list of valid NeoFS network addresses.
|
||||||
func BootstrapAddresses(c *config.Config) (addr network.AddressGroup) {
|
func BootstrapAddresses(c *config.Config) (addr network.AddressGroup) {
|
||||||
v := config.StringSlice(c.Sub(subsection), "addresses")
|
v := config.StringSlice(c.Sub(subsection), "addresses")
|
||||||
|
|
||||||
|
@ -136,10 +136,10 @@ func Attributes(c *config.Config) (attrs []string) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Relay returns value of "relay" config parameter
|
// Relay returns the value of "relay" config parameter
|
||||||
// from "node" section.
|
// from "node" section.
|
||||||
//
|
//
|
||||||
// Returns false if value is not set.
|
// Returns false if the value is not set.
|
||||||
func Relay(c *config.Config) bool {
|
func Relay(c *config.Config) bool {
|
||||||
return config.BoolSafe(c.Sub(subsection), "relay")
|
return config.BoolSafe(c.Sub(subsection), "relay")
|
||||||
}
|
}
|
||||||
|
@ -152,9 +152,9 @@ func PersistentSessions(c *config.Config) PersistentSessionsConfig {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Path returns value of "path" config parameter.
|
// Path returns the value of "path" config parameter.
|
||||||
//
|
//
|
||||||
// Returns PersistentStatePathDefault if value is not a non-empty string.
|
// Returns PersistentStatePathDefault if the value is not a non-empty string.
|
||||||
func (p PersistentSessionsConfig) Path() string {
|
func (p PersistentSessionsConfig) Path() string {
|
||||||
return config.String(p.cfg, "path")
|
return config.String(p.cfg, "path")
|
||||||
}
|
}
|
||||||
|
@ -167,9 +167,9 @@ func PersistentState(c *config.Config) PersistentStateConfig {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Path returns value of "path" config parameter.
|
// Path returns the value of "path" config parameter.
|
||||||
//
|
//
|
||||||
// Returns PersistentStatePathDefault if value is not a non-empty string.
|
// Returns PersistentStatePathDefault if the value is not a non-empty string.
|
||||||
func (p PersistentStateConfig) Path() string {
|
func (p PersistentStateConfig) Path() string {
|
||||||
v := config.String(p.cfg, "path")
|
v := config.String(p.cfg, "path")
|
||||||
if v != "" {
|
if v != "" {
|
||||||
|
@ -188,16 +188,16 @@ func (x *SubnetConfig) Init(root config.Config) {
|
||||||
*x = SubnetConfig(*root.Sub(subsection).Sub("subnet"))
|
*x = SubnetConfig(*root.Sub(subsection).Sub("subnet"))
|
||||||
}
|
}
|
||||||
|
|
||||||
// ExitZero returns value of "exit_zero" config parameter as bool.
|
// ExitZero returns the value of "exit_zero" config parameter as bool.
|
||||||
// Returns false if value can not be cast.
|
// Returns false if the value can not be cast.
|
||||||
func (x SubnetConfig) ExitZero() bool {
|
func (x SubnetConfig) ExitZero() bool {
|
||||||
return config.BoolSafe((*config.Config)(&x), "exit_zero")
|
return config.BoolSafe((*config.Config)(&x), "exit_zero")
|
||||||
}
|
}
|
||||||
|
|
||||||
// IterateSubnets casts value of "entries" config parameter to string slice,
|
// IterateSubnets casts the value of "entries" config parameter to string slice,
|
||||||
// iterates over all of its elements and passes them to f.
|
// iterates over all of its elements and passes them to f.
|
||||||
//
|
//
|
||||||
// Does nothing if value can not be cast to string slice.
|
// Does nothing if the value can not be cast to string slice.
|
||||||
func (x SubnetConfig) IterateSubnets(f func(string)) {
|
func (x SubnetConfig) IterateSubnets(f func(string)) {
|
||||||
ids := config.StringSliceSafe((*config.Config)(&x), "entries")
|
ids := config.StringSliceSafe((*config.Config)(&x), "entries")
|
||||||
|
|
||||||
|
@ -214,34 +214,34 @@ func Notification(c *config.Config) NotificationConfig {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enabled returns value of "enabled" config parameter from "notification"
|
// Enabled returns the value of "enabled" config parameter from "notification"
|
||||||
// subsection of "node" section.
|
// subsection of "node" section.
|
||||||
//
|
//
|
||||||
// Returns false if value is not presented.
|
// Returns false if the value is not presented.
|
||||||
func (n NotificationConfig) Enabled() bool {
|
func (n NotificationConfig) Enabled() bool {
|
||||||
return config.BoolSafe(n.cfg, "enabled")
|
return config.BoolSafe(n.cfg, "enabled")
|
||||||
}
|
}
|
||||||
|
|
||||||
// DefaultTopic returns value of "default_topic" config parameter from
|
// DefaultTopic returns the value of "default_topic" config parameter from
|
||||||
// "notification" subsection of "node" section.
|
// "notification" subsection of "node" section.
|
||||||
//
|
//
|
||||||
// Returns empty string if value is not presented.
|
// Returns empty string if the value is not presented.
|
||||||
func (n NotificationConfig) DefaultTopic() string {
|
func (n NotificationConfig) DefaultTopic() string {
|
||||||
return config.StringSafe(n.cfg, "default_topic")
|
return config.StringSafe(n.cfg, "default_topic")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Endpoint returns value of "endpoint" config parameter from "notification"
|
// Endpoint returns the value of "endpoint" config parameter from "notification"
|
||||||
// subsection of "node" section.
|
// subsection of "node" section.
|
||||||
//
|
//
|
||||||
// Returns empty string if value is not presented.
|
// Returns empty string if the value is not presented.
|
||||||
func (n NotificationConfig) Endpoint() string {
|
func (n NotificationConfig) Endpoint() string {
|
||||||
return config.StringSafe(n.cfg, "endpoint")
|
return config.StringSafe(n.cfg, "endpoint")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Timeout returns value of "timeout" config parameter from "notification"
|
// Timeout returns the value of "timeout" config parameter from "notification"
|
||||||
// subsection of "node" section.
|
// subsection of "node" section.
|
||||||
//
|
//
|
||||||
// Returns NotificationTimeoutDefault if value is not positive.
|
// Returns NotificationTimeoutDefault if the value is not positive.
|
||||||
func (n NotificationConfig) Timeout() time.Duration {
|
func (n NotificationConfig) Timeout() time.Duration {
|
||||||
v := config.DurationSafe(n.cfg, "timeout")
|
v := config.DurationSafe(n.cfg, "timeout")
|
||||||
if v > 0 {
|
if v > 0 {
|
||||||
|
@ -251,26 +251,26 @@ func (n NotificationConfig) Timeout() time.Duration {
|
||||||
return NotificationTimeoutDefault
|
return NotificationTimeoutDefault
|
||||||
}
|
}
|
||||||
|
|
||||||
// CertPath returns value of "certificate_path" config parameter from "notification"
|
// CertPath returns the value of "certificate_path" config parameter from "notification"
|
||||||
// subsection of "node" section.
|
// subsection of "node" section.
|
||||||
//
|
//
|
||||||
// Returns empty string if value is not presented.
|
// Returns empty string if the value is not presented.
|
||||||
func (n NotificationConfig) CertPath() string {
|
func (n NotificationConfig) CertPath() string {
|
||||||
return config.StringSafe(n.cfg, "certificate")
|
return config.StringSafe(n.cfg, "certificate")
|
||||||
}
|
}
|
||||||
|
|
||||||
// KeyPath returns value of "key_path" config parameter from
|
// KeyPath returns the value of "key_path" config parameter from
|
||||||
// "notification" subsection of "node" section.
|
// "notification" subsection of "node" section.
|
||||||
//
|
//
|
||||||
// Returns empty string if value is not presented.
|
// Returns empty string if the value is not presented.
|
||||||
func (n NotificationConfig) KeyPath() string {
|
func (n NotificationConfig) KeyPath() string {
|
||||||
return config.StringSafe(n.cfg, "key")
|
return config.StringSafe(n.cfg, "key")
|
||||||
}
|
}
|
||||||
|
|
||||||
// CAPath returns value of "ca_path" config parameter from
|
// CAPath returns the value of "ca_path" config parameter from
|
||||||
// "notification" subsection of "node" section.
|
// "notification" subsection of "node" section.
|
||||||
//
|
//
|
||||||
// Returns empty string if value is not presented.
|
// Returns empty string if the value is not presented.
|
||||||
func (n NotificationConfig) CAPath() string {
|
func (n NotificationConfig) CAPath() string {
|
||||||
return config.StringSafe(n.cfg, "ca")
|
return config.StringSafe(n.cfg, "ca")
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,9 +28,9 @@ func Put(c *config.Config) PutConfig {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// PoolSizeRemote returns value of "pool_size_remote" config parameter.
|
// PoolSizeRemote returns the value of "pool_size_remote" config parameter.
|
||||||
//
|
//
|
||||||
// Returns PutPoolSizeDefault if value is not positive number.
|
// Returns PutPoolSizeDefault if the value is not a positive number.
|
||||||
func (g PutConfig) PoolSizeRemote() int {
|
func (g PutConfig) PoolSizeRemote() int {
|
||||||
v := config.Int(g.cfg, "pool_size_remote")
|
v := config.Int(g.cfg, "pool_size_remote")
|
||||||
if v > 0 {
|
if v > 0 {
|
||||||
|
|
|
@ -8,10 +8,10 @@ func defaultOpts() *opts {
|
||||||
return new(opts)
|
return new(opts)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Option allows to set optional parameter of the Config.
|
// Option allows to set an optional parameter of the Config.
|
||||||
type Option func(*opts)
|
type Option func(*opts)
|
||||||
|
|
||||||
// WithConfigFile returns option to set system path
|
// WithConfigFile returns an option to set the system path
|
||||||
// to the configuration file.
|
// to the configuration file.
|
||||||
func WithConfigFile(path string) Option {
|
func WithConfigFile(path string) Option {
|
||||||
return func(o *opts) {
|
return func(o *opts) {
|
||||||
|
|
|
@ -13,10 +13,10 @@ const (
|
||||||
HeadTimeoutDefault = 5 * time.Second
|
HeadTimeoutDefault = 5 * time.Second
|
||||||
)
|
)
|
||||||
|
|
||||||
// HeadTimeout returns value of "head_timeout" config parameter
|
// HeadTimeout returns the value of "head_timeout" config parameter
|
||||||
// from "policer" section.
|
// from "policer" section.
|
||||||
//
|
//
|
||||||
// Returns HeadTimeoutDefault if value is not positive duration.
|
// Returns HeadTimeoutDefault if the value is not positive duration.
|
||||||
func HeadTimeout(c *config.Config) time.Duration {
|
func HeadTimeout(c *config.Config) time.Duration {
|
||||||
v := config.DurationSafe(c.Sub(subsection), "head_timeout")
|
v := config.DurationSafe(c.Sub(subsection), "head_timeout")
|
||||||
if v > 0 {
|
if v > 0 {
|
||||||
|
|
|
@ -16,10 +16,10 @@ const (
|
||||||
AddressDefault = ""
|
AddressDefault = ""
|
||||||
)
|
)
|
||||||
|
|
||||||
// ShutdownTimeout returns value of "shutdown_timeout" config parameter
|
// ShutdownTimeout returns the value of "shutdown_timeout" config parameter
|
||||||
// from "profiler" section.
|
// from "profiler" section.
|
||||||
//
|
//
|
||||||
// Returns ShutdownTimeoutDefault if value is not positive duration.
|
// Returns ShutdownTimeoutDefault if the value is not positive duration.
|
||||||
func ShutdownTimeout(c *config.Config) time.Duration {
|
func ShutdownTimeout(c *config.Config) time.Duration {
|
||||||
v := config.DurationSafe(c.Sub(subsection), "shutdown_timeout")
|
v := config.DurationSafe(c.Sub(subsection), "shutdown_timeout")
|
||||||
if v > 0 {
|
if v > 0 {
|
||||||
|
@ -29,10 +29,10 @@ func ShutdownTimeout(c *config.Config) time.Duration {
|
||||||
return ShutdownTimeoutDefault
|
return ShutdownTimeoutDefault
|
||||||
}
|
}
|
||||||
|
|
||||||
// Address returns value of "address" config parameter
|
// Address returns the value of "address" config parameter
|
||||||
// from "profiler" section.
|
// from "profiler" section.
|
||||||
//
|
//
|
||||||
// Returns AddressDefault if value is not set.
|
// Returns AddressDefault if the value is not set.
|
||||||
func Address(c *config.Config) string {
|
func Address(c *config.Config) string {
|
||||||
v := config.StringSafe(c.Sub(subsection), "address")
|
v := config.StringSafe(c.Sub(subsection), "address")
|
||||||
if v != "" {
|
if v != "" {
|
||||||
|
|
|
@ -13,10 +13,10 @@ const (
|
||||||
PutTimeoutDefault = 5 * time.Second
|
PutTimeoutDefault = 5 * time.Second
|
||||||
)
|
)
|
||||||
|
|
||||||
// PutTimeout returns value of "put_timeout" config parameter
|
// PutTimeout returns the value of "put_timeout" config parameter
|
||||||
// from "replicator" section.
|
// from "replicator" section.
|
||||||
//
|
//
|
||||||
// Returns PutTimeoutDefault if value is not positive duration.
|
// Returns PutTimeoutDefault if the value is not positive duration.
|
||||||
func PutTimeout(c *config.Config) time.Duration {
|
func PutTimeout(c *config.Config) time.Duration {
|
||||||
v := config.DurationSafe(c.Sub(subsection), "put_timeout")
|
v := config.DurationSafe(c.Sub(subsection), "put_timeout")
|
||||||
if v > 0 {
|
if v > 0 {
|
||||||
|
|
|
@ -11,7 +11,7 @@ import (
|
||||||
func fromFile(path string) *config.Config {
|
func fromFile(path string) *config.Config {
|
||||||
var p config.Prm
|
var p config.Prm
|
||||||
|
|
||||||
os.Clearenv() // ENVs have priority over config files so we do this in tests
|
os.Clearenv() // ENVs have priority over config files, so we do this in tests
|
||||||
|
|
||||||
return config.New(p,
|
return config.New(p,
|
||||||
config.WithConfigFile(path),
|
config.WithConfigFile(path),
|
||||||
|
|
|
@ -21,10 +21,10 @@ import (
|
||||||
const (
|
const (
|
||||||
newEpochNotification = "NewEpoch"
|
newEpochNotification = "NewEpoch"
|
||||||
|
|
||||||
// notaryDepositExtraBlocks is amount of extra blocks to overlap two deposits,
|
// notaryDepositExtraBlocks is the amount of extra blocks to overlap two deposits,
|
||||||
// we do that to make sure that there won't be any blocks without deposited
|
// we do that to make sure that there won't be any blocks without deposited
|
||||||
// assets in notary contract; make sure it is bigger than any extra rounding
|
// assets in a notary contract; make sure it is bigger than any extra rounding
|
||||||
// value in notary client.
|
// value in a notary client.
|
||||||
notaryDepositExtraBlocks = 300
|
notaryDepositExtraBlocks = 300
|
||||||
|
|
||||||
// amount of tries(blocks) before notary deposit timeout.
|
// amount of tries(blocks) before notary deposit timeout.
|
||||||
|
|
|
@ -15,16 +15,16 @@ type clientCache interface {
|
||||||
Get(client.NodeInfo) (client.Client, error)
|
Get(client.NodeInfo) (client.Client, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// clientKeyRemoteProvider must provide remote writer and take into account
|
// clientKeyRemoteProvider must provide a remote writer and take into account
|
||||||
// that requests must be sent via passed api client and must be signed with
|
// that requests must be sent via the passed api client and must be signed with
|
||||||
// passed private key.
|
// the passed private key.
|
||||||
type clientKeyRemoteProvider interface {
|
type clientKeyRemoteProvider interface {
|
||||||
WithClient(client.Client) reputationcommon.WriterProvider
|
WithClient(client.Client) reputationcommon.WriterProvider
|
||||||
}
|
}
|
||||||
|
|
||||||
// remoteTrustProvider is implementation of reputation RemoteWriterProvider interface.
|
// remoteTrustProvider is an implementation of reputation RemoteWriterProvider interface.
|
||||||
// It caches clients, checks if it is the end of the route and checks either current
|
// It caches clients, checks if it is the end of the route and checks either the current
|
||||||
// node is remote target or not.
|
// node is a remote target or not.
|
||||||
//
|
//
|
||||||
// remoteTrustProvider requires to be provided with clientKeyRemoteProvider.
|
// remoteTrustProvider requires to be provided with clientKeyRemoteProvider.
|
||||||
type remoteTrustProvider struct {
|
type remoteTrustProvider struct {
|
||||||
|
|
|
@ -27,7 +27,7 @@ func (NopReputationWriter) Close() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// OnlyKeyRemoteServerInfo if implementation of reputation.ServerInfo
|
// OnlyKeyRemoteServerInfo is an implementation of reputation.ServerInfo
|
||||||
// interface but with only public key data.
|
// interface but with only public key data.
|
||||||
type OnlyKeyRemoteServerInfo struct {
|
type OnlyKeyRemoteServerInfo struct {
|
||||||
Key []byte
|
Key []byte
|
||||||
|
|
|
@ -11,7 +11,7 @@ import (
|
||||||
eigentrustctrl "github.com/nspcc-dev/neofs-node/pkg/services/reputation/eigentrust/controller"
|
eigentrustctrl "github.com/nspcc-dev/neofs-node/pkg/services/reputation/eigentrust/controller"
|
||||||
)
|
)
|
||||||
|
|
||||||
// InitialTrustSource is implementation of the
|
// InitialTrustSource is an implementation of the
|
||||||
// reputation/eigentrust/calculator's InitialTrustSource interface.
|
// reputation/eigentrust/calculator's InitialTrustSource interface.
|
||||||
type InitialTrustSource struct {
|
type InitialTrustSource struct {
|
||||||
NetMap netmap.Source
|
NetMap netmap.Source
|
||||||
|
@ -19,7 +19,7 @@ type InitialTrustSource struct {
|
||||||
|
|
||||||
var ErrEmptyNetMap = errors.New("empty NepMap")
|
var ErrEmptyNetMap = errors.New("empty NepMap")
|
||||||
|
|
||||||
// InitialTrust returns `initialTrust` as initial trust value.
|
// InitialTrust returns `initialTrust` as an initial trust value.
|
||||||
func (i InitialTrustSource) InitialTrust(reputation.PeerID) (reputation.TrustValue, error) {
|
func (i InitialTrustSource) InitialTrust(reputation.PeerID) (reputation.TrustValue, error) {
|
||||||
nm, err := i.NetMap.GetNetMap(1)
|
nm, err := i.NetMap.GetNetMap(1)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -34,13 +34,13 @@ func (i InitialTrustSource) InitialTrust(reputation.PeerID) (reputation.TrustVal
|
||||||
return reputation.TrustOne.Div(nodeCount), nil
|
return reputation.TrustOne.Div(nodeCount), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// DaughtersTrustCalculator wraps EigenTrust calculator and implements
|
// DaughtersTrustCalculator wraps EigenTrust calculator and implements the
|
||||||
// eigentrust/calculator's DaughtersTrustCalculator interface.
|
// eigentrust/calculator's DaughtersTrustCalculator interface.
|
||||||
type DaughtersTrustCalculator struct {
|
type DaughtersTrustCalculator struct {
|
||||||
Calculator *eigencalc.Calculator
|
Calculator *eigencalc.Calculator
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calculate converts and passes values to wrapped calculator.
|
// Calculate converts and passes values to the wrapped calculator.
|
||||||
func (c *DaughtersTrustCalculator) Calculate(ctx eigentrustctrl.IterationContext) {
|
func (c *DaughtersTrustCalculator) Calculate(ctx eigentrustctrl.IterationContext) {
|
||||||
calcPrm := eigencalc.CalculatePrm{}
|
calcPrm := eigencalc.CalculatePrm{}
|
||||||
epochIteration := eigentrust.EpochIteration{}
|
epochIteration := eigentrust.EpochIteration{}
|
||||||
|
|
|
@ -14,16 +14,16 @@ import (
|
||||||
|
|
||||||
var ErrIncorrectContextPanicMsg = "could not write intermediate trust: passed context incorrect"
|
var ErrIncorrectContextPanicMsg = "could not write intermediate trust: passed context incorrect"
|
||||||
|
|
||||||
// ConsumerStorageWriterProvider is implementation of reputation.WriterProvider
|
// ConsumerStorageWriterProvider is an implementation of the reputation.WriterProvider
|
||||||
// interface that provides ConsumerTrustWriter writer.
|
// interface that provides ConsumerTrustWriter writer.
|
||||||
type ConsumerStorageWriterProvider struct {
|
type ConsumerStorageWriterProvider struct {
|
||||||
Log *logger.Logger
|
Log *logger.Logger
|
||||||
Storage *consumerstorage.Storage
|
Storage *consumerstorage.Storage
|
||||||
}
|
}
|
||||||
|
|
||||||
// ConsumerTrustWriter is implementation of reputation.Writer interface
|
// ConsumerTrustWriter is an implementation of the reputation.Writer interface
|
||||||
// that writes passed consumer's Trust values to Consumer storage. After writing
|
// that writes passed consumer's Trust values to the Consumer storage. After writing
|
||||||
// that values can be used in eigenTrust algorithm's iterations.
|
// that, values can be used in eigenTrust algorithm's iterations.
|
||||||
type ConsumerTrustWriter struct {
|
type ConsumerTrustWriter struct {
|
||||||
log *logger.Logger
|
log *logger.Logger
|
||||||
storage *consumerstorage.Storage
|
storage *consumerstorage.Storage
|
||||||
|
|
|
@ -43,7 +43,7 @@ func NewFinalWriterProvider(prm FinalWriterProviderPrm, opts ...FinalWriterOptio
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// FinalWriterProvider is implementation of reputation.eigentrust.calculator
|
// FinalWriterProvider is an implementation of the reputation.eigentrust.calculator
|
||||||
// IntermediateWriterProvider interface. It inits FinalWriter.
|
// IntermediateWriterProvider interface. It inits FinalWriter.
|
||||||
type FinalWriterProvider struct {
|
type FinalWriterProvider struct {
|
||||||
prm FinalWriterProviderPrm
|
prm FinalWriterProviderPrm
|
||||||
|
@ -60,7 +60,7 @@ func (fwp FinalWriterProvider) InitIntermediateWriter(
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// FinalWriter is implementation of reputation.eigentrust.calculator IntermediateWriter
|
// FinalWriter is an implementation of the reputation.eigentrust.calculator IntermediateWriter
|
||||||
// interface that writes GlobalTrust to contract directly.
|
// interface that writes GlobalTrust to contract directly.
|
||||||
type FinalWriter struct {
|
type FinalWriter struct {
|
||||||
privatKey *ecdsa.PrivateKey
|
privatKey *ecdsa.PrivateKey
|
||||||
|
|
|
@ -10,16 +10,16 @@ import (
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
)
|
)
|
||||||
|
|
||||||
// DaughterStorageWriterProvider is implementation of reputation.WriterProvider
|
// DaughterStorageWriterProvider is an implementation of the reputation.WriterProvider
|
||||||
// interface that provides DaughterTrustWriter writer.
|
// interface that provides DaughterTrustWriter writer.
|
||||||
type DaughterStorageWriterProvider struct {
|
type DaughterStorageWriterProvider struct {
|
||||||
Log *logger.Logger
|
Log *logger.Logger
|
||||||
Storage *daughters.Storage
|
Storage *daughters.Storage
|
||||||
}
|
}
|
||||||
|
|
||||||
// DaughterTrustWriter is implementation of reputation.Writer interface
|
// DaughterTrustWriter is an implementation of the reputation.Writer interface
|
||||||
// that writes passed daughter's Trust values to Daughter storage. After writing
|
// that writes passed daughter's Trust values to Daughter storage. After writing
|
||||||
// that values can be used in eigenTrust algorithm's iterations.
|
// that, values can be used in eigenTrust algorithm's iterations.
|
||||||
type DaughterTrustWriter struct {
|
type DaughterTrustWriter struct {
|
||||||
log *logger.Logger
|
log *logger.Logger
|
||||||
storage *daughters.Storage
|
storage *daughters.Storage
|
||||||
|
|
|
@ -87,7 +87,7 @@ type RemoteTrustWriter struct {
|
||||||
log *logger.Logger
|
log *logger.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write sends trust value to remote node via ReputationService.AnnounceIntermediateResult RPC.
|
// Write sends a trust value to a remote node via ReputationService.AnnounceIntermediateResult RPC.
|
||||||
func (rtp *RemoteTrustWriter) Write(t reputation.Trust) error {
|
func (rtp *RemoteTrustWriter) Write(t reputation.Trust) error {
|
||||||
epoch := rtp.eiCtx.Epoch()
|
epoch := rtp.eiCtx.Epoch()
|
||||||
i := rtp.eiCtx.I()
|
i := rtp.eiCtx.I()
|
||||||
|
|
|
@ -10,14 +10,14 @@ import (
|
||||||
"github.com/nspcc-dev/neofs-node/pkg/services/reputation/eigentrust/storage/daughters"
|
"github.com/nspcc-dev/neofs-node/pkg/services/reputation/eigentrust/storage/daughters"
|
||||||
)
|
)
|
||||||
|
|
||||||
// DaughterTrustIteratorProvider is implementation of the
|
// DaughterTrustIteratorProvider is an implementation of the
|
||||||
// reputation/eigentrust/calculator's DaughterTrustIteratorProvider interface.
|
// reputation/eigentrust/calculator's DaughterTrustIteratorProvider interface.
|
||||||
type DaughterTrustIteratorProvider struct {
|
type DaughterTrustIteratorProvider struct {
|
||||||
DaughterStorage *daughters.Storage
|
DaughterStorage *daughters.Storage
|
||||||
ConsumerStorage *consumerstorage.Storage
|
ConsumerStorage *consumerstorage.Storage
|
||||||
}
|
}
|
||||||
|
|
||||||
// InitDaughterIterator returns iterator over received
|
// InitDaughterIterator returns an iterator over the received
|
||||||
// local trusts for ctx.Epoch() epoch from daughter p.
|
// local trusts for ctx.Epoch() epoch from daughter p.
|
||||||
func (ip *DaughterTrustIteratorProvider) InitDaughterIterator(ctx eigentrustcalc.Context,
|
func (ip *DaughterTrustIteratorProvider) InitDaughterIterator(ctx eigentrustcalc.Context,
|
||||||
p reputation.PeerID) (eigentrustcalc.TrustIterator, error) {
|
p reputation.PeerID) (eigentrustcalc.TrustIterator, error) {
|
||||||
|
@ -34,7 +34,7 @@ func (ip *DaughterTrustIteratorProvider) InitDaughterIterator(ctx eigentrustcalc
|
||||||
return daughterIterator, nil
|
return daughterIterator, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// InitAllDaughtersIterator returns iterator over all
|
// InitAllDaughtersIterator returns an iterator over all
|
||||||
// daughters of the current node(manager) and all local
|
// daughters of the current node(manager) and all local
|
||||||
// trusts received from them for ctx.Epoch() epoch.
|
// trusts received from them for ctx.Epoch() epoch.
|
||||||
func (ip *DaughterTrustIteratorProvider) InitAllDaughtersIterator(
|
func (ip *DaughterTrustIteratorProvider) InitAllDaughtersIterator(
|
||||||
|
@ -49,7 +49,7 @@ func (ip *DaughterTrustIteratorProvider) InitAllDaughtersIterator(
|
||||||
return iter, nil
|
return iter, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// InitConsumersIterator returns iterator over all daughters
|
// InitConsumersIterator returns an iterator over all daughters
|
||||||
// of the current node(manager) and all their consumers' local
|
// of the current node(manager) and all their consumers' local
|
||||||
// trusts for ctx.Epoch() epoch and ctx.I() iteration.
|
// trusts for ctx.Epoch() epoch and ctx.I() iteration.
|
||||||
func (ip *DaughterTrustIteratorProvider) InitConsumersIterator(
|
func (ip *DaughterTrustIteratorProvider) InitConsumersIterator(
|
||||||
|
|
|
@ -15,7 +15,7 @@ type commonPrm struct {
|
||||||
ctx context.Context
|
ctx context.Context
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetClient sets base client for NeoFS API communication.
|
// SetClient sets the base client for NeoFS API communication.
|
||||||
//
|
//
|
||||||
// Required parameter.
|
// Required parameter.
|
||||||
func (x *commonPrm) SetClient(cli coreclient.Client) {
|
func (x *commonPrm) SetClient(cli coreclient.Client) {
|
||||||
|
@ -36,24 +36,24 @@ type AnnounceLocalPrm struct {
|
||||||
cliPrm client.PrmAnnounceLocalTrust
|
cliPrm client.PrmAnnounceLocalTrust
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetEpoch sets epoch in which the trust was assessed.
|
// SetEpoch sets the epoch in which the trust was assessed.
|
||||||
func (x *AnnounceLocalPrm) SetEpoch(epoch uint64) {
|
func (x *AnnounceLocalPrm) SetEpoch(epoch uint64) {
|
||||||
x.cliPrm.SetEpoch(epoch)
|
x.cliPrm.SetEpoch(epoch)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetTrusts sets list of local trust values.
|
// SetTrusts sets a list of local trust values.
|
||||||
func (x *AnnounceLocalPrm) SetTrusts(ts []reputation.Trust) {
|
func (x *AnnounceLocalPrm) SetTrusts(ts []reputation.Trust) {
|
||||||
x.cliPrm.SetValues(ts)
|
x.cliPrm.SetValues(ts)
|
||||||
}
|
}
|
||||||
|
|
||||||
// AnnounceLocalRes groups resulting values of AnnounceLocal operation.
|
// AnnounceLocalRes groups the resulting values of AnnounceLocal operation.
|
||||||
type AnnounceLocalRes struct{}
|
type AnnounceLocalRes struct{}
|
||||||
|
|
||||||
// AnnounceLocal sends estimations of local trust to the remote node.
|
// AnnounceLocal sends estimations of local trust to the remote node.
|
||||||
//
|
//
|
||||||
// Client, context and key must be set.
|
// Client, context and key must be set.
|
||||||
//
|
//
|
||||||
// Returns any error prevented the operation from completing correctly in error return.
|
// Returns any error which prevented the operation from completing correctly in error return.
|
||||||
func AnnounceLocal(prm AnnounceLocalPrm) (res AnnounceLocalRes, err error) {
|
func AnnounceLocal(prm AnnounceLocalPrm) (res AnnounceLocalRes, err error) {
|
||||||
var cliRes *client.ResAnnounceLocalTrust
|
var cliRes *client.ResAnnounceLocalTrust
|
||||||
|
|
||||||
|
@ -73,30 +73,30 @@ type AnnounceIntermediatePrm struct {
|
||||||
cliPrm client.PrmAnnounceIntermediateTrust
|
cliPrm client.PrmAnnounceIntermediateTrust
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetEpoch sets number of the epoch when the trust calculation's iteration was executed.
|
// SetEpoch sets the number of the epoch when the trust calculation's iteration was executed.
|
||||||
func (x *AnnounceIntermediatePrm) SetEpoch(epoch uint64) {
|
func (x *AnnounceIntermediatePrm) SetEpoch(epoch uint64) {
|
||||||
x.cliPrm.SetEpoch(epoch)
|
x.cliPrm.SetEpoch(epoch)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetIteration sets number of the iteration of the trust calculation algorithm.
|
// SetIteration sets the number of the iteration of the trust calculation algorithm.
|
||||||
func (x *AnnounceIntermediatePrm) SetIteration(iter uint32) {
|
func (x *AnnounceIntermediatePrm) SetIteration(iter uint32) {
|
||||||
x.cliPrm.SetIteration(iter)
|
x.cliPrm.SetIteration(iter)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetTrust sets current global trust value computed at the iteration.
|
// SetTrust sets the current global trust value computed at the iteration.
|
||||||
func (x *AnnounceIntermediatePrm) SetTrust(t reputation.PeerToPeerTrust) {
|
func (x *AnnounceIntermediatePrm) SetTrust(t reputation.PeerToPeerTrust) {
|
||||||
x.cliPrm.SetCurrentValue(t)
|
x.cliPrm.SetCurrentValue(t)
|
||||||
}
|
}
|
||||||
|
|
||||||
// AnnounceIntermediateRes groups resulting values of AnnounceIntermediate operation.
|
// AnnounceIntermediateRes groups the resulting values of AnnounceIntermediate operation.
|
||||||
type AnnounceIntermediateRes struct{}
|
type AnnounceIntermediateRes struct{}
|
||||||
|
|
||||||
// AnnounceIntermediate sends global trust value calculated at the specified iteration
|
// AnnounceIntermediate sends the global trust value calculated at the specified iteration
|
||||||
// and epoch to to the remote node.
|
// and epoch to to the remote node.
|
||||||
//
|
//
|
||||||
// Client, context and key must be set.
|
// Client, context and key must be set.
|
||||||
//
|
//
|
||||||
// Returns any error prevented the operation from completing correctly in error return.
|
// Returns any error which prevented the operation from completing correctly in error return.
|
||||||
func AnnounceIntermediate(prm AnnounceIntermediatePrm) (res AnnounceIntermediateRes, err error) {
|
func AnnounceIntermediate(prm AnnounceIntermediatePrm) (res AnnounceIntermediateRes, err error) {
|
||||||
var cliRes *client.ResAnnounceIntermediateTrust
|
var cliRes *client.ResAnnounceIntermediateTrust
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
//
|
//
|
||||||
// In this regard, this package provides functions over base API client necessary for the application.
|
// In this regard, this package provides functions over base API client necessary for the application.
|
||||||
// This allows you to concentrate the entire spectrum of the client's use in one place (this will be convenient
|
// This allows you to concentrate the entire spectrum of the client's use in one place (this will be convenient
|
||||||
// both when updating the base client and for evaluating the UX of SDK library). So it is expected that all
|
// both when updating the base client and for evaluating the UX of SDK library). So, it is expected that all
|
||||||
// Reputation service packages will be limited to this package for the development of functionality requiring
|
// Reputation service packages will be limited to this package for the development of functionality requiring
|
||||||
// NeoFS API communication.
|
// NeoFS API communication.
|
||||||
package internal
|
package internal
|
||||||
|
|
|
@ -8,7 +8,7 @@ import (
|
||||||
// IterationHandler is a callback of a certain block advance.
|
// IterationHandler is a callback of a certain block advance.
|
||||||
type IterationHandler func()
|
type IterationHandler func()
|
||||||
|
|
||||||
// IterationsTicker represents fixed tick number block timer.
|
// IterationsTicker represents a fixed tick number block timer.
|
||||||
//
|
//
|
||||||
// It can tick the blocks and perform certain actions
|
// It can tick the blocks and perform certain actions
|
||||||
// on block time intervals.
|
// on block time intervals.
|
||||||
|
@ -25,12 +25,12 @@ type IterationsTicker struct {
|
||||||
|
|
||||||
// NewIterationsTicker creates a new IterationsTicker.
|
// NewIterationsTicker creates a new IterationsTicker.
|
||||||
//
|
//
|
||||||
// It guaranties that handler would be called the
|
// It guaranties that a handler would be called the
|
||||||
// specified amount of times in the specified amount
|
// specified amount of times in the specified amount
|
||||||
// of blocks. After the last meaningful Tick IterationsTicker
|
// of blocks. After the last meaningful Tick, IterationsTicker
|
||||||
// becomes no-op timer.
|
// becomes no-op timer.
|
||||||
//
|
//
|
||||||
// Returns error only if times is greater than totalBlocks.
|
// Returns an error only if times is greater than totalBlocks.
|
||||||
func NewIterationsTicker(totalBlocks uint64, times uint64, h IterationHandler) (*IterationsTicker, error) {
|
func NewIterationsTicker(totalBlocks uint64, times uint64, h IterationHandler) (*IterationsTicker, error) {
|
||||||
period := totalBlocks / times
|
period := totalBlocks / times
|
||||||
|
|
||||||
|
|
|
@ -1,17 +1,17 @@
|
||||||
# N3 Mainnet Storage node configuration
|
# N3 Mainnet Storage node configuration
|
||||||
|
|
||||||
Here is the template for simple storage node configuration in N3 Mainnet.
|
Here is a template for simple storage node configuration in N3 Mainnet.
|
||||||
Make sure to specify correct values instead of `<...>` placeholders.
|
Make sure to specify correct values instead of `<...>` placeholders.
|
||||||
Do not change `contracts` section. Run latest neofs-node release with
|
Do not change `contracts` section. Run the latest neofs-node release with
|
||||||
fixed config `neofs-node -c config.yml`
|
the fixed config `neofs-node -c config.yml`
|
||||||
|
|
||||||
To use NeoFS in the Mainnet you need to deposit assets to NeoFS contract.
|
To use NeoFS in the Mainnet, you need to deposit assets to NeoFS contract.
|
||||||
The contract sript hash is `2cafa46838e8b564468ebd868dcafdd99dce6221`
|
The contract sript hash is `2cafa46838e8b564468ebd868dcafdd99dce6221`
|
||||||
(N3 address `NNxVrKjLsRkWsmGgmuNXLcMswtxTGaNQLk`)
|
(N3 address `NNxVrKjLsRkWsmGgmuNXLcMswtxTGaNQLk`)
|
||||||
|
|
||||||
## Tips
|
## Tips
|
||||||
|
|
||||||
Use `grpcs://` scheme in announced address if you enable TLS in grpc server.
|
Use `grpcs://` scheme in the announced address if you enable TLS in grpc server.
|
||||||
```yaml
|
```yaml
|
||||||
node:
|
node:
|
||||||
addresses:
|
addresses:
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# N3 Testnet Storage node configuration
|
# N3 Testnet Storage node configuration
|
||||||
|
|
||||||
There is a prepared configuration for NeoFS Storage Node deployment in
|
There is a prepared configuration for NeoFS Storage Node deployment in
|
||||||
N3 Testnet. The easiest way to deploy Storage Node is to use prepared
|
N3 Testnet. The easiest way to deploy a Storage Node is to use the prepared
|
||||||
docker image and run it with docker-compose.
|
docker image and run it with docker-compose.
|
||||||
|
|
||||||
## Build image
|
## Build image
|
||||||
|
@ -19,20 +19,20 @@ Successfully tagged nspccdev/neofs-storage-testnet:0.25.1
|
||||||
|
|
||||||
## Deploy node
|
## Deploy node
|
||||||
|
|
||||||
To run storage node in N3 Testnet environment you should deposit GAS assets,
|
To run a storage node in N3 Testnet environment, you should deposit GAS assets,
|
||||||
update docker-compose file and start the node.
|
update docker-compose file and start the node.
|
||||||
|
|
||||||
### Deposit
|
### Deposit
|
||||||
|
|
||||||
Storage Node owner should deposit GAS to NeoFS smart contract. It generates a
|
The Storage Node owner should deposit GAS to NeoFS smart contract. It generates a
|
||||||
bit of side chain GAS in node's wallet. Side chain GAS used to send bootstrap tx.
|
bit of sidechain GAS in the node's wallet. Sidechain GAS is used to send bootstrap tx.
|
||||||
|
|
||||||
First obtain GAS in N3 Testnet chain. You can do that with
|
First, obtain GAS in N3 Testnet chain. You can do that with
|
||||||
[faucet](https://neowish.ngd.network) service.
|
[faucet](https://neowish.ngd.network) service.
|
||||||
|
|
||||||
Then make a deposit by transferring GAS to NeoFS contract in N3 Testnet.
|
Then, make a deposit by transferring GAS to NeoFS contract in N3 Testnet.
|
||||||
You can provide scripthash in the `data` argument of transfer tx to make a
|
You can provide scripthash in the `data` argument of transfer tx to make a
|
||||||
deposit to specified account. Otherwise, deposit is made to tx sender.
|
deposit to a specified account. Otherwise, deposit is made to the tx sender.
|
||||||
|
|
||||||
NeoFS contract scripthash in N3 Testnet is `b65d8243ac63983206d17e5221af0653a7266fa1`,
|
NeoFS contract scripthash in N3 Testnet is `b65d8243ac63983206d17e5221af0653a7266fa1`,
|
||||||
so the address is `NadZ8YfvkddivcFFkztZgfwxZyKf1acpRF`.
|
so the address is `NadZ8YfvkddivcFFkztZgfwxZyKf1acpRF`.
|
||||||
|
@ -49,7 +49,7 @@ neo-go wallet nep17 transfer -w wallet.json -r https://rpc01.testnet.n3.nspcc.ru
|
||||||
|
|
||||||
### Configure
|
### Configure
|
||||||
|
|
||||||
Then configure `node_config.env` file. Change endpoints values. Both
|
Next, configure `node_config.env` file. Change endpoints values. Both
|
||||||
should contain your **public** IP.
|
should contain your **public** IP.
|
||||||
|
|
||||||
```
|
```
|
||||||
|
@ -79,8 +79,8 @@ Subdivision: [SPE] Sankt-Peterburg
|
||||||
Coordinates: 59.53, 30.15
|
Coordinates: 59.53, 30.15
|
||||||
```
|
```
|
||||||
|
|
||||||
It is recommended to pass node's key as a file. To do so convert your wallet
|
It is recommended to pass the node's key as a file. To do so, convert your wallet
|
||||||
WIF to 32-byte hex (via `neofs-cli` for example) and save it to file.
|
WIF to 32-byte hex (via `neofs-cli` for example) and save it to a file.
|
||||||
|
|
||||||
```
|
```
|
||||||
// Print WIF in a 32-byte hex format
|
// Print WIF in a 32-byte hex format
|
||||||
|
@ -96,7 +96,7 @@ ScriptHash3.0BE dc4b0b44d01c16667880062e2fd4508f9939fedf
|
||||||
$ echo '11ab917cd99170cb8d0d48e78fca317564e6b3aaff7f7058952d6175cdca0f56' | xxd -r -p > my_wallet.key
|
$ echo '11ab917cd99170cb8d0d48e78fca317564e6b3aaff7f7058952d6175cdca0f56' | xxd -r -p > my_wallet.key
|
||||||
```
|
```
|
||||||
|
|
||||||
Then specify path to this file in `docker-compose.yml`
|
Then, specify the path to this file in `docker-compose.yml`
|
||||||
```yaml
|
```yaml
|
||||||
volumes:
|
volumes:
|
||||||
- neofs_storage:/storage
|
- neofs_storage:/storage
|
||||||
|
@ -105,8 +105,8 @@ Then specify path to this file in `docker-compose.yml`
|
||||||
|
|
||||||
|
|
||||||
NeoFS objects will be stored on your machine. By default, docker-compose
|
NeoFS objects will be stored on your machine. By default, docker-compose
|
||||||
configured to store objects in named docker volume `neofs_storage`. You can
|
is configured to store objects in named docker volume `neofs_storage`. You can
|
||||||
specify directory on the filesystem to store objects there.
|
specify a directory on the filesystem to store objects there.
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
volumes:
|
volumes:
|
||||||
|
@ -116,12 +116,12 @@ specify directory on the filesystem to store objects there.
|
||||||
|
|
||||||
### Start
|
### Start
|
||||||
|
|
||||||
Run node with `docker-compose up` command and stop it with `docker-compose down`.
|
Run the node with `docker-compose up` command and stop it with `docker-compose down`.
|
||||||
|
|
||||||
### Debug
|
### Debug
|
||||||
|
|
||||||
To print node logs use `docker logs neofs-testnet`. To print debug messages in
|
To print node logs, use `docker logs neofs-testnet`. To print debug messages in
|
||||||
log, setup log level to debug with this env:
|
log, set up log level to debug with this env:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
environment:
|
environment:
|
||||||
|
|
|
@ -19,8 +19,8 @@ describing the most significant changes done in this release. Add
|
||||||
and changes. Describe each change in detail with a reference to GitHub issues if
|
and changes. Describe each change in detail with a reference to GitHub issues if
|
||||||
possible.
|
possible.
|
||||||
|
|
||||||
Update supported version of neofs-contract in `README.md` if there were
|
Update the supported version of neofs-contract in `README.md` if there were
|
||||||
changes between releases.
|
changes in releases.
|
||||||
|
|
||||||
## Tag the release
|
## Tag the release
|
||||||
|
|
||||||
|
|
|
@ -35,31 +35,31 @@ type MultiAddressClient interface {
|
||||||
RawForAddress(network.Address, func(cli *rawclient.Client) error) error
|
RawForAddress(network.Address, func(cli *rawclient.Client) error) error
|
||||||
}
|
}
|
||||||
|
|
||||||
// NodeInfo groups information about NeoFS storage node needed for Client construction.
|
// NodeInfo groups information about a NeoFS storage node needed for Client construction.
|
||||||
type NodeInfo struct {
|
type NodeInfo struct {
|
||||||
addrGroup network.AddressGroup
|
addrGroup network.AddressGroup
|
||||||
|
|
||||||
key []byte
|
key []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetAddressGroup sets group of network addresses.
|
// SetAddressGroup sets a group of network addresses.
|
||||||
func (x *NodeInfo) SetAddressGroup(v network.AddressGroup) {
|
func (x *NodeInfo) SetAddressGroup(v network.AddressGroup) {
|
||||||
x.addrGroup = v
|
x.addrGroup = v
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddressGroup returns group of network addresses.
|
// AddressGroup returns a group of network addresses.
|
||||||
func (x NodeInfo) AddressGroup() network.AddressGroup {
|
func (x NodeInfo) AddressGroup() network.AddressGroup {
|
||||||
return x.addrGroup
|
return x.addrGroup
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetPublicKey sets public key in a binary format.
|
// SetPublicKey sets a public key in a binary format.
|
||||||
//
|
//
|
||||||
// Argument must not be mutated.
|
// Argument must not be mutated.
|
||||||
func (x *NodeInfo) SetPublicKey(v []byte) {
|
func (x *NodeInfo) SetPublicKey(v []byte) {
|
||||||
x.key = v
|
x.key = v
|
||||||
}
|
}
|
||||||
|
|
||||||
// PublicKey returns public key in a binary format.
|
// PublicKey returns a public key in a binary format.
|
||||||
//
|
//
|
||||||
// Result must not be mutated.
|
// Result must not be mutated.
|
||||||
func (x *NodeInfo) PublicKey() []byte {
|
func (x *NodeInfo) PublicKey() []byte {
|
||||||
|
|
|
@ -33,7 +33,7 @@ func NodeInfoFromRawNetmapElement(dst *NodeInfo, info interface {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// NodeInfoFromNetmapElement fills NodeInfo structure from the interface of parsed netmap member's descriptor.
|
// NodeInfoFromNetmapElement fills NodeInfo structure from the interface of the parsed netmap member's descriptor.
|
||||||
//
|
//
|
||||||
// Args must not be nil.
|
// Args must not be nil.
|
||||||
func NodeInfoFromNetmapElement(dst *NodeInfo, info interface {
|
func NodeInfoFromNetmapElement(dst *NodeInfo, info interface {
|
||||||
|
@ -43,7 +43,7 @@ func NodeInfoFromNetmapElement(dst *NodeInfo, info interface {
|
||||||
nodeInfoFromKeyAddr(dst, info.PublicKey(), info.Addresses())
|
nodeInfoFromKeyAddr(dst, info.PublicKey(), info.Addresses())
|
||||||
}
|
}
|
||||||
|
|
||||||
// AssertKeyResponseCallback returns client response callback which checks if the response was signed by expected key.
|
// AssertKeyResponseCallback returns client response callback which checks if the response was signed by the expected key.
|
||||||
// Returns ErrWrongPublicKey in case of key mismatch.
|
// Returns ErrWrongPublicKey in case of key mismatch.
|
||||||
func AssertKeyResponseCallback(expectedKey []byte) func(client.ResponseMetaInfo) error {
|
func AssertKeyResponseCallback(expectedKey []byte) func(client.ResponseMetaInfo) error {
|
||||||
return func(info client.ResponseMetaInfo) error {
|
return func(info client.ResponseMetaInfo) error {
|
||||||
|
|
|
@ -15,36 +15,36 @@ type RemovalWitness struct {
|
||||||
token *session.Token
|
token *session.Token
|
||||||
}
|
}
|
||||||
|
|
||||||
// ContainerID returns identifier of the container
|
// ContainerID returns the identifier of the container
|
||||||
// to be removed.
|
// to be removed.
|
||||||
func (x RemovalWitness) ContainerID() *cid.ID {
|
func (x RemovalWitness) ContainerID() *cid.ID {
|
||||||
return x.cid
|
return x.cid
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetContainerID sets identifier of the container
|
// SetContainerID sets the identifier of the container
|
||||||
// to be removed.
|
// to be removed.
|
||||||
func (x *RemovalWitness) SetContainerID(id *cid.ID) {
|
func (x *RemovalWitness) SetContainerID(id *cid.ID) {
|
||||||
x.cid = id
|
x.cid = id
|
||||||
}
|
}
|
||||||
|
|
||||||
// Signature returns signature of the container identifier.
|
// Signature returns the signature of the container identifier.
|
||||||
func (x RemovalWitness) Signature() []byte {
|
func (x RemovalWitness) Signature() []byte {
|
||||||
return x.sig
|
return x.sig
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetSignature sets signature of the container identifier.
|
// SetSignature sets a signature of the container identifier.
|
||||||
func (x *RemovalWitness) SetSignature(sig []byte) {
|
func (x *RemovalWitness) SetSignature(sig []byte) {
|
||||||
x.sig = sig
|
x.sig = sig
|
||||||
}
|
}
|
||||||
|
|
||||||
// SessionToken returns token of the session within
|
// SessionToken returns the token of the session within
|
||||||
// which container was removed.
|
// which the container was removed.
|
||||||
func (x RemovalWitness) SessionToken() *session.Token {
|
func (x RemovalWitness) SessionToken() *session.Token {
|
||||||
return x.token
|
return x.token
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetSessionToken sets token of the session within
|
// SetSessionToken sets the token of the session within
|
||||||
// which container was removed.
|
// which the container was removed.
|
||||||
func (x *RemovalWitness) SetSessionToken(tok *session.Token) {
|
func (x *RemovalWitness) SetSessionToken(tok *session.Token) {
|
||||||
x.token = tok
|
x.token = tok
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,7 @@ var (
|
||||||
// CheckFormat conducts an initial check of the v2 container data.
|
// CheckFormat conducts an initial check of the v2 container data.
|
||||||
//
|
//
|
||||||
// It is expected that if a container fails this test,
|
// It is expected that if a container fails this test,
|
||||||
// it will not be inner-ring approved.
|
// it will not be approved by the inner ring.
|
||||||
func CheckFormat(c *container.Container) error {
|
func CheckFormat(c *container.Container) error {
|
||||||
if c.PlacementPolicy() == nil {
|
if c.PlacementPolicy() == nil {
|
||||||
return errNilPolicy
|
return errNilPolicy
|
||||||
|
|
|
@ -11,23 +11,23 @@ import (
|
||||||
// Source is an interface that wraps
|
// Source is an interface that wraps
|
||||||
// basic container receiving method.
|
// basic container receiving method.
|
||||||
type Source interface {
|
type Source interface {
|
||||||
// Get reads the container from the storage by identifier.
|
// Get reads the container from the storage by its identifier.
|
||||||
// It returns the pointer to requested container and any error encountered.
|
// It returns the pointer to the requested container and any error encountered.
|
||||||
//
|
//
|
||||||
// Get must return exactly one non-nil value.
|
// Get must return exactly one non-nil value.
|
||||||
// Get must return an error of type apistatus.ContainerNotFound if the container is not in storage.
|
// Get must return an error of type apistatus.ContainerNotFound if the container is not in the storage.
|
||||||
//
|
//
|
||||||
// Implementations must not retain the container pointer and modify
|
// Implementations must not retain the container pointer and modify
|
||||||
// the container through it.
|
// the container through it.
|
||||||
Get(*cid.ID) (*container.Container, error)
|
Get(*cid.ID) (*container.Container, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsErrNotFound checks if error returned by Source.Get corresponds
|
// IsErrNotFound checks if the error returned by Source.Get corresponds
|
||||||
// to missing container.
|
// to the missing container.
|
||||||
func IsErrNotFound(err error) bool {
|
func IsErrNotFound(err error) bool {
|
||||||
return errors.As(err, new(apistatus.ContainerNotFound))
|
return errors.As(err, new(apistatus.ContainerNotFound))
|
||||||
}
|
}
|
||||||
|
|
||||||
// ErrEACLNotFound is returned by eACL storage implementations when
|
// ErrEACLNotFound is returned by eACL storage implementations when
|
||||||
// requested eACL table is not in storage.
|
// the requested eACL table is not in the storage.
|
||||||
var ErrEACLNotFound = errors.New("extended ACL table is not set for this container")
|
var ErrEACLNotFound = errors.New("extended ACL table is not set for this container")
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package netmap
|
package netmap
|
||||||
|
|
||||||
// AnnouncedKeys is an interface of utility for working with announced public keys of the storage nodes.
|
// AnnouncedKeys is an interface of utility for working with the announced public keys of the storage nodes.
|
||||||
type AnnouncedKeys interface {
|
type AnnouncedKeys interface {
|
||||||
// Checks if key was announced by local node.
|
// Checks if the key was announced by a local node.
|
||||||
IsLocalKey(key []byte) bool
|
IsLocalKey(key []byte) bool
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package netmap
|
package netmap
|
||||||
|
|
||||||
// State groups current system state parameters.
|
// State groups the current system state parameters.
|
||||||
type State interface {
|
type State interface {
|
||||||
// CurrentEpoch returns number of current NeoFS epoch.
|
// CurrentEpoch returns the number of the current NeoFS epoch.
|
||||||
CurrentEpoch() uint64
|
CurrentEpoch() uint64
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,18 +8,18 @@ import (
|
||||||
// basic network map receiving method.
|
// basic network map receiving method.
|
||||||
type Source interface {
|
type Source interface {
|
||||||
// GetNetMap reads the diff-th past network map from the storage.
|
// GetNetMap reads the diff-th past network map from the storage.
|
||||||
// Calling with zero diff returns latest network map.
|
// Calling with zero diff returns the latest network map.
|
||||||
// It returns the pointer to requested network map and any error encountered.
|
// It returns the pointer to the requested network map and any error encountered.
|
||||||
//
|
//
|
||||||
// GetNetMap must return exactly one non-nil value.
|
// GetNetMap must return exactly one non-nil value.
|
||||||
// GetNetMap must return ErrNotFound if the network map is not in storage.
|
// GetNetMap must return ErrNotFound if the network map is not in the storage.
|
||||||
//
|
//
|
||||||
// Implementations must not retain the network map pointer and modify
|
// Implementations must not retain the network map pointer and modify
|
||||||
// the network map through it.
|
// the network map through it.
|
||||||
GetNetMap(diff uint64) (*netmap.Netmap, error)
|
GetNetMap(diff uint64) (*netmap.Netmap, error)
|
||||||
|
|
||||||
// GetNetMapByEpoch reads network map by the epoch number from the storage.
|
// GetNetMapByEpoch reads network map by the epoch number from the storage.
|
||||||
// It returns the pointer to requested network map and any error encountered.
|
// It returns the pointer to the requested network map and any error encountered.
|
||||||
//
|
//
|
||||||
// Must return exactly one non-nil value.
|
// Must return exactly one non-nil value.
|
||||||
//
|
//
|
||||||
|
@ -27,19 +27,19 @@ type Source interface {
|
||||||
// the network map through it.
|
// the network map through it.
|
||||||
GetNetMapByEpoch(epoch uint64) (*netmap.Netmap, error)
|
GetNetMapByEpoch(epoch uint64) (*netmap.Netmap, error)
|
||||||
|
|
||||||
// Epoch reads current epoch from the storage.
|
// Epoch reads the current epoch from the storage.
|
||||||
// It returns number of the current epoch and any error encountered.
|
// It returns thw number of the current epoch and any error encountered.
|
||||||
//
|
//
|
||||||
// Must return exactly one non-default value.
|
// Must return exactly one non-default value.
|
||||||
Epoch() (uint64, error)
|
Epoch() (uint64, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetLatestNetworkMap requests and returns latest network map from storage.
|
// GetLatestNetworkMap requests and returns the latest network map from the storage.
|
||||||
func GetLatestNetworkMap(src Source) (*netmap.Netmap, error) {
|
func GetLatestNetworkMap(src Source) (*netmap.Netmap, error) {
|
||||||
return src.GetNetMap(0)
|
return src.GetNetMap(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPreviousNetworkMap requests and returns previous from latest network map from storage.
|
// GetPreviousNetworkMap requests and returns previous from the latest network map from the storage.
|
||||||
func GetPreviousNetworkMap(src Source) (*netmap.Netmap, error) {
|
func GetPreviousNetworkMap(src Source) (*netmap.Netmap, error) {
|
||||||
return src.GetNetMap(1)
|
return src.GetNetMap(1)
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,12 +19,12 @@ import (
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/storagegroup"
|
"github.com/nspcc-dev/neofs-sdk-go/storagegroup"
|
||||||
)
|
)
|
||||||
|
|
||||||
// FormatValidator represents object format validator.
|
// FormatValidator represents an object format validator.
|
||||||
type FormatValidator struct {
|
type FormatValidator struct {
|
||||||
*cfg
|
*cfg
|
||||||
}
|
}
|
||||||
|
|
||||||
// FormatValidatorOption represents FormatValidator constructor option.
|
// FormatValidatorOption represents a FormatValidator constructor option.
|
||||||
type FormatValidatorOption func(*cfg)
|
type FormatValidatorOption func(*cfg)
|
||||||
|
|
||||||
type cfg struct {
|
type cfg struct {
|
||||||
|
@ -37,7 +37,7 @@ type cfg struct {
|
||||||
|
|
||||||
// DeleteHandler is an interface of delete queue processor.
|
// DeleteHandler is an interface of delete queue processor.
|
||||||
type DeleteHandler interface {
|
type DeleteHandler interface {
|
||||||
// DeleteObjects objects places objects to removal queue.
|
// DeleteObjects places objects to a removal queue.
|
||||||
//
|
//
|
||||||
// Returns apistatus.LockNonRegularObject if at least one object
|
// Returns apistatus.LockNonRegularObject if at least one object
|
||||||
// is locked.
|
// is locked.
|
||||||
|
@ -85,7 +85,7 @@ func NewFormatValidator(opts ...FormatValidatorOption) *FormatValidator {
|
||||||
// Does not validate payload checksum and content.
|
// Does not validate payload checksum and content.
|
||||||
// If unprepared is true, only fields set by user are validated.
|
// If unprepared is true, only fields set by user are validated.
|
||||||
//
|
//
|
||||||
// Returns nil error if object has valid structure.
|
// Returns nil error if the object has valid structure.
|
||||||
func (v *FormatValidator) Validate(obj *object.Object, unprepared bool) error {
|
func (v *FormatValidator) Validate(obj *object.Object, unprepared bool) error {
|
||||||
if obj == nil {
|
if obj == nil {
|
||||||
return errNilObject
|
return errNilObject
|
||||||
|
@ -153,7 +153,7 @@ func (v *FormatValidator) checkOwnerKey(id *owner.ID, key []byte) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ValidateContent validates payload content according to object type.
|
// ValidateContent validates payload content according to the object type.
|
||||||
func (v *FormatValidator) ValidateContent(o *object.Object) error {
|
func (v *FormatValidator) ValidateContent(o *object.Object) error {
|
||||||
switch o.Type() {
|
switch o.Type() {
|
||||||
case object.TypeRegular:
|
case object.TypeRegular:
|
||||||
|
@ -169,7 +169,7 @@ func (v *FormatValidator) ValidateContent(o *object.Object) error {
|
||||||
return fmt.Errorf("(%T) could not unmarshal tombstone content: %w", v, err)
|
return fmt.Errorf("(%T) could not unmarshal tombstone content: %w", v, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// check if tombstone has the same expiration in body and header
|
// check if the tombstone has the same expiration in the body and the header
|
||||||
exp, err := expirationEpochAttribute(o)
|
exp, err := expirationEpochAttribute(o)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -179,7 +179,7 @@ func (v *FormatValidator) ValidateContent(o *object.Object) error {
|
||||||
return errTombstoneExpiration
|
return errTombstoneExpiration
|
||||||
}
|
}
|
||||||
|
|
||||||
// mark all objects from tombstone body as removed in storage engine
|
// mark all objects from the tombstone body as removed in the storage engine
|
||||||
cid := o.ContainerID()
|
cid := o.ContainerID()
|
||||||
idList := tombstone.Members()
|
idList := tombstone.Members()
|
||||||
addrList := make([]*addressSDK.Address, 0, len(idList))
|
addrList := make([]*addressSDK.Address, 0, len(idList))
|
||||||
|
@ -226,7 +226,7 @@ func (v *FormatValidator) ValidateContent(o *object.Object) error {
|
||||||
return errors.New("missing locked members")
|
return errors.New("missing locked members")
|
||||||
}
|
}
|
||||||
|
|
||||||
// mark all objects from lock list as locked in storage engine
|
// mark all objects from lock list as locked in the storage engine
|
||||||
locklist := make([]oid.ID, num)
|
locklist := make([]oid.ID, num)
|
||||||
lock.ReadMembers(locklist)
|
lock.ReadMembers(locklist)
|
||||||
|
|
||||||
|
@ -303,7 +303,7 @@ func (v *FormatValidator) checkAttributes(obj *object.Object) error {
|
||||||
var errIncorrectOwner = errors.New("incorrect object owner")
|
var errIncorrectOwner = errors.New("incorrect object owner")
|
||||||
|
|
||||||
func (v *FormatValidator) checkOwner(obj *object.Object) error {
|
func (v *FormatValidator) checkOwner(obj *object.Object) error {
|
||||||
// TODO: use appropriate functionality after neofs-api-go#352
|
// TODO: use an appropriate functionality after neofs-api-go#352
|
||||||
if len(obj.OwnerID().ToV2().GetValue()) != owner.NEO3WalletSize {
|
if len(obj.OwnerID().ToV2().GetValue()) != owner.NEO3WalletSize {
|
||||||
return errIncorrectOwner
|
return errIncorrectOwner
|
||||||
}
|
}
|
||||||
|
@ -311,21 +311,21 @@ func (v *FormatValidator) checkOwner(obj *object.Object) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithNetState returns options to set network state interface.
|
// WithNetState returns options to set the network state interface.
|
||||||
func WithNetState(netState netmap.State) FormatValidatorOption {
|
func WithNetState(netState netmap.State) FormatValidatorOption {
|
||||||
return func(c *cfg) {
|
return func(c *cfg) {
|
||||||
c.netState = netState
|
c.netState = netState
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithDeleteHandler returns option to set delete queue processor.
|
// WithDeleteHandler returns an option to set delete queue processor.
|
||||||
func WithDeleteHandler(v DeleteHandler) FormatValidatorOption {
|
func WithDeleteHandler(v DeleteHandler) FormatValidatorOption {
|
||||||
return func(c *cfg) {
|
return func(c *cfg) {
|
||||||
c.deleteHandler = v
|
c.deleteHandler = v
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithLocker returns option to set object lock storage.
|
// WithLocker returns an option to set object lock storage.
|
||||||
func WithLocker(v Locker) FormatValidatorOption {
|
func WithLocker(v Locker) FormatValidatorOption {
|
||||||
return func(c *cfg) {
|
return func(c *cfg) {
|
||||||
c.locker = v
|
c.locker = v
|
||||||
|
|
|
@ -5,7 +5,7 @@ import (
|
||||||
addressSDK "github.com/nspcc-dev/neofs-sdk-go/object/address"
|
addressSDK "github.com/nspcc-dev/neofs-sdk-go/object/address"
|
||||||
)
|
)
|
||||||
|
|
||||||
// AddressOf returns address of the object.
|
// AddressOf returns the address of the object.
|
||||||
func AddressOf(obj *object.Object) *addressSDK.Address {
|
func AddressOf(obj *object.Object) *addressSDK.Address {
|
||||||
if obj != nil {
|
if obj != nil {
|
||||||
addr := addressSDK.NewAddress()
|
addr := addressSDK.NewAddress()
|
||||||
|
|
|
@ -2,11 +2,11 @@ package config
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Config package contains GlobalConfig structure that implements config
|
Config package contains GlobalConfig structure that implements config
|
||||||
reader from both local and global configurations. Most of the time inner ring
|
reader from both local and global configurations. Most of the time the inner ring
|
||||||
does not need this, as for application it has static config with timeouts,
|
does not need this; as for application, it has static config with timeouts,
|
||||||
caches sizes etc. However there are routines that use global configuration
|
caches sizes etc. However, there are routines that use global configuration
|
||||||
values that can be changed in runtime, e.g. basic income rate. Local
|
values that can be changed in runtime, e.g. basic income rate. Local
|
||||||
configuration value overrides global one so it is easy to debug and test
|
configuration value overrides the global one so it is easy to debug and test
|
||||||
in different environments.
|
in different environments.
|
||||||
|
|
||||||
Implemented as a part of https://github.com/nspcc-dev/neofs-node/issues/363
|
Implemented as a part of https://github.com/nspcc-dev/neofs-node/issues/363
|
||||||
|
|
|
@ -46,13 +46,13 @@ type IrFetcherWithoutNotary struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// InnerRingKeys fetches list of innerring keys from NeoFSAlphabet
|
// InnerRingKeys fetches list of innerring keys from NeoFSAlphabet
|
||||||
// role in side chain.
|
// role in the sidechain.
|
||||||
func (fN IrFetcherWithNotary) InnerRingKeys() (keys.PublicKeys, error) {
|
func (fN IrFetcherWithNotary) InnerRingKeys() (keys.PublicKeys, error) {
|
||||||
return fN.cli.NeoFSAlphabetList()
|
return fN.cli.NeoFSAlphabetList()
|
||||||
}
|
}
|
||||||
|
|
||||||
// InnerRingKeys fetches list of innerring keys from netmap contract
|
// InnerRingKeys fetches list of innerring keys from netmap contract
|
||||||
// in side chain.
|
// in the sidechain.
|
||||||
func (f IrFetcherWithoutNotary) InnerRingKeys() (keys.PublicKeys, error) {
|
func (f IrFetcherWithoutNotary) InnerRingKeys() (keys.PublicKeys, error) {
|
||||||
return f.nm.GetInnerRingList()
|
return f.nm.GetInnerRingList()
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,12 +24,12 @@ type Client struct {
|
||||||
c clientcore.Client
|
c clientcore.Client
|
||||||
}
|
}
|
||||||
|
|
||||||
// WrapBasicClient wraps client.Client instance to use it for NeoFS API RPC.
|
// WrapBasicClient wraps a client.Client instance to use it for NeoFS API RPC.
|
||||||
func (x *Client) WrapBasicClient(c clientcore.Client) {
|
func (x *Client) WrapBasicClient(c clientcore.Client) {
|
||||||
x.c = c
|
x.c = c
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetPrivateKey sets private key to sign RPC requests.
|
// SetPrivateKey sets a private key to sign RPC requests.
|
||||||
func (x *Client) SetPrivateKey(key *ecdsa.PrivateKey) {
|
func (x *Client) SetPrivateKey(key *ecdsa.PrivateKey) {
|
||||||
x.key = key
|
x.key = key
|
||||||
}
|
}
|
||||||
|
@ -41,17 +41,17 @@ type SearchSGPrm struct {
|
||||||
cnrID *cid.ID
|
cnrID *cid.ID
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetContainerID sets ID of the container to search for storage groups.
|
// SetContainerID sets the ID of the container to search for storage groups.
|
||||||
func (x *SearchSGPrm) SetContainerID(id *cid.ID) {
|
func (x *SearchSGPrm) SetContainerID(id *cid.ID) {
|
||||||
x.cnrID = id
|
x.cnrID = id
|
||||||
}
|
}
|
||||||
|
|
||||||
// SearchSGRes groups resulting values of SearchSG operation.
|
// SearchSGRes groups the resulting values of SearchSG operation.
|
||||||
type SearchSGRes struct {
|
type SearchSGRes struct {
|
||||||
cliRes []oid.ID
|
cliRes []oid.ID
|
||||||
}
|
}
|
||||||
|
|
||||||
// IDList returns list of IDs of storage groups in container.
|
// IDList returns a list of IDs of storage groups in the container.
|
||||||
func (x SearchSGRes) IDList() []oid.ID {
|
func (x SearchSGRes) IDList() []oid.ID {
|
||||||
return x.cliRes
|
return x.cliRes
|
||||||
}
|
}
|
||||||
|
@ -60,7 +60,7 @@ var sgFilter = storagegroup.SearchQuery()
|
||||||
|
|
||||||
// SearchSG lists objects of storage group type in the container.
|
// SearchSG lists objects of storage group type in the container.
|
||||||
//
|
//
|
||||||
// Returns any error prevented the operation from completing correctly in error return.
|
// Returns any error which prevented the operation from completing correctly in error return.
|
||||||
func (x Client) SearchSG(prm SearchSGPrm) (*SearchSGRes, error) {
|
func (x Client) SearchSG(prm SearchSGPrm) (*SearchSGRes, error) {
|
||||||
var cliPrm client.PrmObjectSearch
|
var cliPrm client.PrmObjectSearch
|
||||||
|
|
||||||
|
@ -109,19 +109,19 @@ type GetObjectPrm struct {
|
||||||
getObjectPrm
|
getObjectPrm
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetObjectRes groups resulting values of GetObject operation.
|
// GetObjectRes groups the resulting values of GetObject operation.
|
||||||
type GetObjectRes struct {
|
type GetObjectRes struct {
|
||||||
obj *object.Object
|
obj *object.Object
|
||||||
}
|
}
|
||||||
|
|
||||||
// Object returns received object.
|
// Object returns the received object.
|
||||||
func (x GetObjectRes) Object() *object.Object {
|
func (x GetObjectRes) Object() *object.Object {
|
||||||
return x.obj
|
return x.obj
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetObject reads the object by address.
|
// GetObject reads the object by address.
|
||||||
//
|
//
|
||||||
// Returns any error prevented the operation from completing correctly in error return.
|
// Returns any error which prevented the operation from completing correctly in error return.
|
||||||
func (x Client) GetObject(prm GetObjectPrm) (*GetObjectRes, error) {
|
func (x Client) GetObject(prm GetObjectPrm) (*GetObjectRes, error) {
|
||||||
var cliPrm client.PrmObjectGet
|
var cliPrm client.PrmObjectGet
|
||||||
|
|
||||||
|
@ -185,20 +185,20 @@ func (x *HeadObjectPrm) SetTTL(ttl uint32) {
|
||||||
x.local = ttl < 2
|
x.local = ttl < 2
|
||||||
}
|
}
|
||||||
|
|
||||||
// HeadObjectRes groups resulting values of HeadObject operation.
|
// HeadObjectRes groups the resulting values of HeadObject operation.
|
||||||
type HeadObjectRes struct {
|
type HeadObjectRes struct {
|
||||||
hdr *object.Object
|
hdr *object.Object
|
||||||
}
|
}
|
||||||
|
|
||||||
// Header returns received object header.
|
// Header returns the received object header.
|
||||||
func (x HeadObjectRes) Header() *object.Object {
|
func (x HeadObjectRes) Header() *object.Object {
|
||||||
return x.hdr
|
return x.hdr
|
||||||
}
|
}
|
||||||
|
|
||||||
// HeadObject reads short object header by address.
|
// HeadObject reads short object header by address.
|
||||||
//
|
//
|
||||||
// Returns any error prevented the operation from completing correctly in error return.
|
// Returns any error which prevented the operation from completing correctly in error return.
|
||||||
// For raw requests, returns *object.SplitInfoError error if requested object is virtual.
|
// For raw requests, returns *object.SplitInfoError error if the requested object is virtual.
|
||||||
func (x Client) HeadObject(prm HeadObjectPrm) (*HeadObjectRes, error) {
|
func (x Client) HeadObject(prm HeadObjectPrm) (*HeadObjectRes, error) {
|
||||||
var cliPrm client.PrmObjectHead
|
var cliPrm client.PrmObjectHead
|
||||||
|
|
||||||
|
@ -239,9 +239,9 @@ func (x Client) HeadObject(prm HeadObjectPrm) (*HeadObjectRes, error) {
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetObjectPayload reads object by address from NeoFS via Client and returns its payload.
|
// GetObjectPayload reads an object by address from NeoFS via Client and returns its payload.
|
||||||
//
|
//
|
||||||
// Returns any error prevented the operation from completing correctly in error return.
|
// Returns any error which prevented the operation from completing correctly in error return.
|
||||||
func GetObjectPayload(ctx context.Context, c Client, addr *addressSDK.Address) ([]byte, error) {
|
func GetObjectPayload(ctx context.Context, c Client, addr *addressSDK.Address) ([]byte, error) {
|
||||||
var prm GetObjectPrm
|
var prm GetObjectPrm
|
||||||
|
|
||||||
|
@ -275,12 +275,12 @@ func headObject(ctx context.Context, c Client, addr *addressSDK.Address, raw boo
|
||||||
return obj.Header(), nil
|
return obj.Header(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetRawObjectHeaderLocally reads raw short object header from server's local storage by address via Client.
|
// GetRawObjectHeaderLocally reads the raw short object header from the server's local storage by address via Client.
|
||||||
func GetRawObjectHeaderLocally(ctx context.Context, c Client, addr *addressSDK.Address) (*object.Object, error) {
|
func GetRawObjectHeaderLocally(ctx context.Context, c Client, addr *addressSDK.Address) (*object.Object, error) {
|
||||||
return headObject(ctx, c, addr, true, 1)
|
return headObject(ctx, c, addr, true, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetObjectHeaderFromContainer reads short object header by address via Client with TTL = 10
|
// GetObjectHeaderFromContainer reads the short object header by address via Client with TTL = 10
|
||||||
// for deep traversal of the container.
|
// for deep traversal of the container.
|
||||||
func GetObjectHeaderFromContainer(ctx context.Context, c Client, addr *addressSDK.Address) (*object.Object, error) {
|
func GetObjectHeaderFromContainer(ctx context.Context, c Client, addr *addressSDK.Address) (*object.Object, error) {
|
||||||
return headObject(ctx, c, addr, false, 10)
|
return headObject(ctx, c, addr, false, 10)
|
||||||
|
@ -298,12 +298,12 @@ func (x *HashPayloadRangePrm) SetRange(rng *object.Range) {
|
||||||
x.rng = rng
|
x.rng = rng
|
||||||
}
|
}
|
||||||
|
|
||||||
// HashPayloadRangeRes groups resulting values of HashPayloadRange operation.
|
// HashPayloadRangeRes groups the resulting values of HashPayloadRange operation.
|
||||||
type HashPayloadRangeRes struct {
|
type HashPayloadRangeRes struct {
|
||||||
h []byte
|
h []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
// Hash returns hash of the object payload range.
|
// Hash returns the hash of the object payload range.
|
||||||
func (x HashPayloadRangeRes) Hash() []byte {
|
func (x HashPayloadRangeRes) Hash() []byte {
|
||||||
return x.h
|
return x.h
|
||||||
}
|
}
|
||||||
|
@ -311,7 +311,7 @@ func (x HashPayloadRangeRes) Hash() []byte {
|
||||||
// HashPayloadRange requests to calculate Tillich-Zemor hash of the payload range of the object
|
// HashPayloadRange requests to calculate Tillich-Zemor hash of the payload range of the object
|
||||||
// from the remote server's local storage.
|
// from the remote server's local storage.
|
||||||
//
|
//
|
||||||
// Returns any error prevented the operation from completing correctly in error return.
|
// Returns any error which prevented the operation from completing correctly in error return.
|
||||||
func (x Client) HashPayloadRange(prm HashPayloadRangePrm) (res HashPayloadRangeRes, err error) {
|
func (x Client) HashPayloadRange(prm HashPayloadRangePrm) (res HashPayloadRangeRes, err error) {
|
||||||
var cliPrm client.PrmObjectHash
|
var cliPrm client.PrmObjectHash
|
||||||
|
|
||||||
|
@ -348,7 +348,7 @@ func (x Client) HashPayloadRange(prm HashPayloadRangePrm) (res HashPayloadRangeR
|
||||||
// HashObjectRange reads Tillich-Zemor hash of the object payload range by address
|
// HashObjectRange reads Tillich-Zemor hash of the object payload range by address
|
||||||
// from the remote server's local storage via Client.
|
// from the remote server's local storage via Client.
|
||||||
//
|
//
|
||||||
// Returns any error prevented the operation from completing correctly in error return.
|
// Returns any error which prevented the operation from completing correctly in error return.
|
||||||
func HashObjectRange(ctx context.Context, c Client, addr *addressSDK.Address, rng *object.Range) ([]byte, error) {
|
func HashObjectRange(ctx context.Context, c Client, addr *addressSDK.Address, rng *object.Range) ([]byte, error) {
|
||||||
var prm HashPayloadRangePrm
|
var prm HashPayloadRangePrm
|
||||||
|
|
||||||
|
|
|
@ -4,9 +4,9 @@
|
||||||
// However, although it encapsulates a useful piece of business logic (e.g. the signature mechanism),
|
// However, although it encapsulates a useful piece of business logic (e.g. the signature mechanism),
|
||||||
// the IR application does not fully use the client's flexible interface.
|
// the IR application does not fully use the client's flexible interface.
|
||||||
//
|
//
|
||||||
// In this regard, this package represents an abstraction - a type-wrapper over the base client.
|
// In this regard, this package represents an abstraction -- a type-wrapper over the base client.
|
||||||
// The type provides the minimum interface necessary for the application, and also allows you to concentrate
|
// The type provides the minimum interface necessary for the application and also allows you to concentrate
|
||||||
// the entire spectrum of the client's use in one place (this will be convenient both when updating the base client
|
// the entire spectrum of the client's use in one place (this will be convenient both when updating the base client
|
||||||
// and for evaluating the UX of SDK library). So it is expected that all application packages will be limited
|
// and for evaluating the UX of SDK library). So, it is expected that all application packages will be limited
|
||||||
// to this package for the development of functionality requiring NeoFS API communication.
|
// to this package for the development of functionality requiring NeoFS API communication.
|
||||||
package neofsapiclient
|
package neofsapiclient
|
||||||
|
|
|
@ -21,16 +21,16 @@ type (
|
||||||
// Contracts is an interface of the storage
|
// Contracts is an interface of the storage
|
||||||
// of the alphabet contract addresses.
|
// of the alphabet contract addresses.
|
||||||
Contracts interface {
|
Contracts interface {
|
||||||
// GetByIndex must return address of the
|
// GetByIndex must return the address of the
|
||||||
// alphabet contract by index of the glagolitic
|
// alphabet contract by index of the glagolitic
|
||||||
// letter (e.g 0 for Az, 40 for Izhitsa).
|
// letter (e.g 0 for Az, 40 for Izhitsa).
|
||||||
//
|
//
|
||||||
// Must return false if index does not
|
// Must return false if the index does not
|
||||||
// match to any alphabet contract.
|
// match any alphabet contract.
|
||||||
GetByIndex(int) (util.Uint160, bool)
|
GetByIndex(int) (util.Uint160, bool)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Processor of events produced for alphabet contracts in sidechain.
|
// Processor of events produced for alphabet contracts in the sidechain.
|
||||||
Processor struct {
|
Processor struct {
|
||||||
log *zap.Logger
|
log *zap.Logger
|
||||||
pool *ants.Pool
|
pool *ants.Pool
|
||||||
|
@ -53,7 +53,7 @@ type (
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// New creates neofs mainnet contract processor instance.
|
// New creates a neofs mainnet contract processor instance.
|
||||||
func New(p *Params) (*Processor, error) {
|
func New(p *Params) (*Processor, error) {
|
||||||
switch {
|
switch {
|
||||||
case p.Log == nil:
|
case p.Log == nil:
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
package audit
|
package audit
|
||||||
|
|
||||||
// Start is a event to start new round of data audit.
|
// Start is an event to start a new round of data audit.
|
||||||
type Start struct {
|
type Start struct {
|
||||||
epoch uint64
|
epoch uint64
|
||||||
}
|
}
|
||||||
|
|
||||||
// MorphEvent implements Event interface.
|
// MorphEvent implements the Event interface.
|
||||||
func (a Start) MorphEvent() {}
|
func (a Start) MorphEvent() {}
|
||||||
|
|
||||||
func NewAuditStartEvent(epoch uint64) Start {
|
func NewAuditStartEvent(epoch uint64) Start {
|
||||||
|
|
|
@ -12,7 +12,7 @@ func (ap *Processor) handleNewAuditRound(ev event.Event) {
|
||||||
|
|
||||||
ap.log.Info("new round of audit", zap.Uint64("epoch", epoch))
|
ap.log.Info("new round of audit", zap.Uint64("epoch", epoch))
|
||||||
|
|
||||||
// send event to the worker pool
|
// send an event to the worker pool
|
||||||
|
|
||||||
err := ap.pool.Submit(func() { ap.processStartAudit(epoch) })
|
err := ap.pool.Submit(func() { ap.processStartAudit(epoch) })
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -33,7 +33,7 @@ type (
|
||||||
Reset() int
|
Reset() int
|
||||||
}
|
}
|
||||||
|
|
||||||
// Processor of events related with data audit.
|
// Processor of events related to data audit.
|
||||||
Processor struct {
|
Processor struct {
|
||||||
log *zap.Logger
|
log *zap.Logger
|
||||||
pool *ants.Pool
|
pool *ants.Pool
|
||||||
|
@ -77,22 +77,22 @@ func (x SearchSGPrm) Context() context.Context {
|
||||||
return x.ctx
|
return x.ctx
|
||||||
}
|
}
|
||||||
|
|
||||||
// CID returns identifier of the container to search SG in.
|
// CID returns the identifier of the container to search SG in.
|
||||||
func (x SearchSGPrm) CID() *cid.ID {
|
func (x SearchSGPrm) CID() *cid.ID {
|
||||||
return x.id
|
return x.id
|
||||||
}
|
}
|
||||||
|
|
||||||
// NodeInfo returns information about storage node to communicate with.
|
// NodeInfo returns information about a storage node to communicate with.
|
||||||
func (x SearchSGPrm) NodeInfo() client.NodeInfo {
|
func (x SearchSGPrm) NodeInfo() client.NodeInfo {
|
||||||
return x.info
|
return x.info
|
||||||
}
|
}
|
||||||
|
|
||||||
// SearchSGDst groups target values which Processor expects from SG searching to process.
|
// SearchSGDst groups the target values which Processor expects from SG searching to process.
|
||||||
type SearchSGDst struct {
|
type SearchSGDst struct {
|
||||||
ids []oidSDK.ID
|
ids []oidSDK.ID
|
||||||
}
|
}
|
||||||
|
|
||||||
// WriteIDList writes list of identifiers of storage group objects stored in the container.
|
// WriteIDList writes a list of identifiers of storage group objects stored in the container.
|
||||||
func (x *SearchSGDst) WriteIDList(ids []oidSDK.ID) {
|
func (x *SearchSGDst) WriteIDList(ids []oidSDK.ID) {
|
||||||
x.ids = ids
|
x.ids = ids
|
||||||
}
|
}
|
||||||
|
@ -112,8 +112,8 @@ type epochAuditReporter struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// ProcessorPoolSize limits pool size for audit Processor. Processor manages
|
// ProcessorPoolSize limits pool size for audit Processor. Processor manages
|
||||||
// audit tasks and fills queue for next epoch. This process must not be interrupted
|
// audit tasks and fills queue for the next epoch. This process must not be interrupted
|
||||||
// by new audit epoch, so we limit pool size for processor to one.
|
// by a new audit epoch, so we limit the pool size for the processor to one.
|
||||||
const ProcessorPoolSize = 1
|
const ProcessorPoolSize = 1
|
||||||
|
|
||||||
// New creates audit processor instance.
|
// New creates audit processor instance.
|
||||||
|
|
|
@ -14,7 +14,7 @@ func (bp *Processor) handleLock(ev event.Event) {
|
||||||
zap.String("type", "lock"),
|
zap.String("type", "lock"),
|
||||||
zap.String("value", hex.EncodeToString(lock.ID())))
|
zap.String("value", hex.EncodeToString(lock.ID())))
|
||||||
|
|
||||||
// send event to the worker pool
|
// send an event to the worker pool
|
||||||
|
|
||||||
err := bp.pool.Submit(func() { bp.processLock(&lock) })
|
err := bp.pool.Submit(func() { bp.processLock(&lock) })
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -22,7 +22,7 @@ type (
|
||||||
ToFixed8(int64) int64
|
ToFixed8(int64) int64
|
||||||
}
|
}
|
||||||
|
|
||||||
// Processor of events produced by balance contract in morph chain.
|
// Processor of events produced by balance contract in the morphchain.
|
||||||
Processor struct {
|
Processor struct {
|
||||||
log *zap.Logger
|
log *zap.Logger
|
||||||
pool *ants.Pool
|
pool *ants.Pool
|
||||||
|
@ -45,7 +45,7 @@ const (
|
||||||
lockNotification = "Lock"
|
lockNotification = "Lock"
|
||||||
)
|
)
|
||||||
|
|
||||||
// New creates balance contract processor instance.
|
// New creates a balance contract processor instance.
|
||||||
func New(p *Params) (*Processor, error) {
|
func New(p *Params) (*Processor, error) {
|
||||||
switch {
|
switch {
|
||||||
case p.Log == nil:
|
case p.Log == nil:
|
||||||
|
|
|
@ -17,7 +17,7 @@ func (cp *Processor) handlePut(ev event.Event) {
|
||||||
zap.String("type", "container put"),
|
zap.String("type", "container put"),
|
||||||
zap.String("id", base58.Encode(id[:])))
|
zap.String("id", base58.Encode(id[:])))
|
||||||
|
|
||||||
// send event to the worker pool
|
// send an event to the worker pool
|
||||||
|
|
||||||
err := cp.pool.Submit(func() { cp.processContainerPut(put) })
|
err := cp.pool.Submit(func() { cp.processContainerPut(put) })
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -33,7 +33,7 @@ func (cp *Processor) handleDelete(ev event.Event) {
|
||||||
zap.String("type", "container delete"),
|
zap.String("type", "container delete"),
|
||||||
zap.String("id", base58.Encode(del.ContainerID())))
|
zap.String("id", base58.Encode(del.ContainerID())))
|
||||||
|
|
||||||
// send event to the worker pool
|
// send an event to the worker pool
|
||||||
|
|
||||||
err := cp.pool.Submit(func() { cp.processContainerDelete(&del) })
|
err := cp.pool.Submit(func() { cp.processContainerDelete(&del) })
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -50,7 +50,7 @@ func (cp *Processor) handleSetEACL(ev event.Event) {
|
||||||
zap.String("type", "set EACL"),
|
zap.String("type", "set EACL"),
|
||||||
)
|
)
|
||||||
|
|
||||||
// send event to the worker pool
|
// send an event to the worker pool
|
||||||
|
|
||||||
err := cp.pool.Submit(func() {
|
err := cp.pool.Submit(func() {
|
||||||
cp.processSetEACL(e)
|
cp.processSetEACL(e)
|
||||||
|
|
|
@ -38,8 +38,8 @@ type putContainerContext struct {
|
||||||
name, zone string // from container structure
|
name, zone string // from container structure
|
||||||
}
|
}
|
||||||
|
|
||||||
// Process new container from the user by checking container sanity
|
// Process a new container from the user by checking the container sanity
|
||||||
// and sending approve tx back to morph.
|
// and sending approve tx back to the morph.
|
||||||
func (cp *Processor) processContainerPut(put putEvent) {
|
func (cp *Processor) processContainerPut(put putEvent) {
|
||||||
if !cp.alphabetState.IsAlphabet() {
|
if !cp.alphabetState.IsAlphabet() {
|
||||||
cp.log.Info("non alphabet mode, ignore container put")
|
cp.log.Info("non alphabet mode, ignore container put")
|
||||||
|
|
|
@ -78,7 +78,7 @@ func (cp *Processor) checkSetEACL(e container.SetEACL) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// statement below is a little hack, but if we write token from event to container,
|
// statement below is a little hack, but if we write a token from an event to the container,
|
||||||
// checkKeyOwnership method will work just as it should:
|
// checkKeyOwnership method will work just as it should:
|
||||||
// * tok == nil => we will check if key is a container owner's key
|
// * tok == nil => we will check if key is a container owner's key
|
||||||
// * tok != nil => we will check if token was signed correctly (context is checked at the statement above)
|
// * tok != nil => we will check if token was signed correctly (context is checked at the statement above)
|
||||||
|
|
|
@ -20,7 +20,7 @@ type (
|
||||||
IsAlphabet() bool
|
IsAlphabet() bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// Processor of events produced by container contract in morph chain.
|
// Processor of events produced by container contract in the sidechain.
|
||||||
Processor struct {
|
Processor struct {
|
||||||
log *zap.Logger
|
log *zap.Logger
|
||||||
pool *ants.Pool
|
pool *ants.Pool
|
||||||
|
@ -48,7 +48,7 @@ type (
|
||||||
// NetworkState is an interface of a component
|
// NetworkState is an interface of a component
|
||||||
// that provides access to network state.
|
// that provides access to network state.
|
||||||
type NetworkState interface {
|
type NetworkState interface {
|
||||||
// Epoch must return number of the current epoch.
|
// Epoch must return the number of the current epoch.
|
||||||
//
|
//
|
||||||
// Must return any error encountered
|
// Must return any error encountered
|
||||||
// which did not allow reading the value.
|
// which did not allow reading the value.
|
||||||
|
@ -62,7 +62,7 @@ const (
|
||||||
setEACLNotification = "setEACL"
|
setEACLNotification = "setEACL"
|
||||||
)
|
)
|
||||||
|
|
||||||
// New creates container contract processor instance.
|
// New creates a container contract processor instance.
|
||||||
func New(p *Params) (*Processor, error) {
|
func New(p *Params) (*Processor, error) {
|
||||||
switch {
|
switch {
|
||||||
case p.Log == nil:
|
case p.Log == nil:
|
||||||
|
|
|
@ -14,11 +14,11 @@ var (
|
||||||
errEmptySidechain = errors.New("sidechain list is empty")
|
errEmptySidechain = errors.New("sidechain list is empty")
|
||||||
)
|
)
|
||||||
|
|
||||||
// newAlphabetList returns updated list of sidechain keys with no more than 1\3
|
// newAlphabetList returns an updated list of sidechain keys with no more than 1\3
|
||||||
// of new keys from mainnet list. Function returns `errEmptySidechain` if
|
// of new keys from the mainnet list. The function returns `errEmptySidechain` if
|
||||||
// sidechain list is empty. Function returns `errNotEnoughKeys` if mainnet
|
// the sidechain list is empty. The function returns `errNotEnoughKeys` if the mainnet
|
||||||
// list contains less keys than sidechain list. Function returns (nil, nil) if
|
// list contains less keys than the sidechain list. The function returns (nil, nil) if
|
||||||
// mainnet list contains all keys from sidechain list.
|
// the mainnet list contains all keys from the sidechain list.
|
||||||
//
|
//
|
||||||
// Sorts passed slices.
|
// Sorts passed slices.
|
||||||
func newAlphabetList(sidechain, mainnet keys.PublicKeys) (keys.PublicKeys, error) {
|
func newAlphabetList(sidechain, mainnet keys.PublicKeys) (keys.PublicKeys, error) {
|
||||||
|
@ -84,8 +84,8 @@ func newAlphabetList(sidechain, mainnet keys.PublicKeys) (keys.PublicKeys, error
|
||||||
}
|
}
|
||||||
|
|
||||||
// updateInnerRing function removes `before` keys from `innerRing` and adds
|
// updateInnerRing function removes `before` keys from `innerRing` and adds
|
||||||
// `after` keys in the list. If length of `before` and `after` is not the same
|
// `after` keys in the list. If the length of `before` and `after` is not the same,
|
||||||
// then function returns errNotEqualLen
|
// the function returns errNotEqualLen
|
||||||
func updateInnerRing(innerRing, before, after keys.PublicKeys) (keys.PublicKeys, error) {
|
func updateInnerRing(innerRing, before, after keys.PublicKeys) (keys.PublicKeys, error) {
|
||||||
lnBefore := len(before)
|
lnBefore := len(before)
|
||||||
if lnBefore != len(after) {
|
if lnBefore != len(after) {
|
||||||
|
|
|
@ -60,14 +60,14 @@ func (gp *Processor) processAlphabetSync(txHash util.Uint256) {
|
||||||
Hash: &txHash,
|
Hash: &txHash,
|
||||||
}
|
}
|
||||||
|
|
||||||
// 1. Vote to side chain committee via alphabet contracts.
|
// 1. Vote to sidechain committee via alphabet contracts.
|
||||||
err = gp.voter.VoteForSidechainValidator(votePrm)
|
err = gp.voter.VoteForSidechainValidator(votePrm)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
gp.log.Error("can't vote for side chain committee",
|
gp.log.Error("can't vote for side chain committee",
|
||||||
zap.String("error", err.Error()))
|
zap.String("error", err.Error()))
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. Update NeoFSAlphabet role in side chain.
|
// 2. Update NeoFSAlphabet role in the sidechain.
|
||||||
innerRing, err := gp.irFetcher.InnerRingKeys()
|
innerRing, err := gp.irFetcher.InnerRingKeys()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
gp.log.Error("can't fetch inner ring list from side chain",
|
gp.log.Error("can't fetch inner ring list from side chain",
|
||||||
|
@ -109,7 +109,7 @@ func (gp *Processor) processAlphabetSync(txHash util.Uint256) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if !gp.notaryDisabled {
|
if !gp.notaryDisabled {
|
||||||
// 3. Update notary role in side chain.
|
// 3. Update notary role in the sidechain.
|
||||||
|
|
||||||
updPrm := client.UpdateNotaryListPrm{}
|
updPrm := client.UpdateNotaryListPrm{}
|
||||||
|
|
||||||
|
@ -123,7 +123,7 @@ func (gp *Processor) processAlphabetSync(txHash util.Uint256) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 4. Update NeoFS contract in main net.
|
// 4. Update NeoFS contract in the mainnet.
|
||||||
epoch := gp.epochState.EpochCounter()
|
epoch := gp.epochState.EpochCounter()
|
||||||
|
|
||||||
buf := make([]byte, 8)
|
buf := make([]byte, 8)
|
||||||
|
|
|
@ -16,9 +16,9 @@ import (
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ProcessorPoolSize limits pool size for governance Processor. Processor manages
|
// ProcessorPoolSize limits the pool size for governance Processor. Processor manages
|
||||||
// governance sync tasks. This process must not be interrupted by other sync
|
// governance sync tasks. This process must not be interrupted by other sync
|
||||||
// operation, so we limit pool size for processor to one.
|
// operation, so we limit the pool size for the processor to one.
|
||||||
const ProcessorPoolSize = 1
|
const ProcessorPoolSize = 1
|
||||||
|
|
||||||
type (
|
type (
|
||||||
|
@ -91,7 +91,7 @@ type (
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// New creates balance contract processor instance.
|
// New creates a balance contract processor instance.
|
||||||
func New(p *Params) (*Processor, error) {
|
func New(p *Params) (*Processor, error) {
|
||||||
switch {
|
switch {
|
||||||
case p.Log == nil:
|
case p.Log == nil:
|
||||||
|
|
|
@ -8,12 +8,12 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// lockAccountLifeTime defines amount of epochs when lock account is valid.
|
// lockAccountLifeTime defines the amount of epochs when lock account is valid.
|
||||||
lockAccountLifetime uint64 = 20
|
lockAccountLifetime uint64 = 20
|
||||||
)
|
)
|
||||||
|
|
||||||
// Process deposit event by invoking balance contract and sending native
|
// Process deposit event by invoking a balance contract and sending native
|
||||||
// gas in morph chain.
|
// gas in the sidechain.
|
||||||
func (np *Processor) processDeposit(deposit *neofsEvent.Deposit) {
|
func (np *Processor) processDeposit(deposit *neofsEvent.Deposit) {
|
||||||
if !np.alphabetState.IsAlphabet() {
|
if !np.alphabetState.IsAlphabet() {
|
||||||
np.log.Info("non alphabet mode, ignore deposit")
|
np.log.Info("non alphabet mode, ignore deposit")
|
||||||
|
@ -26,7 +26,7 @@ func (np *Processor) processDeposit(deposit *neofsEvent.Deposit) {
|
||||||
prm.SetAmount(np.converter.ToBalancePrecision(deposit.Amount()))
|
prm.SetAmount(np.converter.ToBalancePrecision(deposit.Amount()))
|
||||||
prm.SetID(deposit.ID())
|
prm.SetID(deposit.ID())
|
||||||
|
|
||||||
// send transferX to balance contract
|
// send transferX to a balance contract
|
||||||
err := np.balanceClient.Mint(prm)
|
err := np.balanceClient.Mint(prm)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
np.log.Error("can't transfer assets to balance contract", zap.Error(err))
|
np.log.Error("can't transfer assets to balance contract", zap.Error(err))
|
||||||
|
@ -35,7 +35,7 @@ func (np *Processor) processDeposit(deposit *neofsEvent.Deposit) {
|
||||||
curEpoch := np.epochState.EpochCounter()
|
curEpoch := np.epochState.EpochCounter()
|
||||||
receiver := deposit.To()
|
receiver := deposit.To()
|
||||||
|
|
||||||
// check if receiver already received some mint GAS emissions
|
// check if the receiver has already received some mint GAS emissions
|
||||||
// we should lock there even though LRU cache is already thread save
|
// we should lock there even though LRU cache is already thread save
|
||||||
// we lock there because GAS transfer AND cache update must be atomic
|
// we lock there because GAS transfer AND cache update must be atomic
|
||||||
np.mintEmitLock.Lock()
|
np.mintEmitLock.Lock()
|
||||||
|
@ -52,7 +52,7 @@ func (np *Processor) processDeposit(deposit *neofsEvent.Deposit) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// get gas balance of the node
|
// get gas balance of the node
|
||||||
// before gas transfer check if the balance is greater than threshold
|
// before gas transfer check if the balance is greater than the threshold
|
||||||
balance, err := np.morphClient.GasBalance()
|
balance, err := np.morphClient.GasBalance()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
np.log.Error("can't get gas balance of the node", zap.Error(err))
|
np.log.Error("can't get gas balance of the node", zap.Error(err))
|
||||||
|
@ -78,7 +78,7 @@ func (np *Processor) processDeposit(deposit *neofsEvent.Deposit) {
|
||||||
np.mintEmitCache.Add(receiver.String(), curEpoch)
|
np.mintEmitCache.Add(receiver.String(), curEpoch)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Process withdraw event by locking assets in balance account.
|
// Process withdraw event by locking assets in the balance account.
|
||||||
func (np *Processor) processWithdraw(withdraw *neofsEvent.Withdraw) {
|
func (np *Processor) processWithdraw(withdraw *neofsEvent.Withdraw) {
|
||||||
if !np.alphabetState.IsAlphabet() {
|
if !np.alphabetState.IsAlphabet() {
|
||||||
np.log.Info("non alphabet mode, ignore withdraw")
|
np.log.Info("non alphabet mode, ignore withdraw")
|
||||||
|
@ -108,8 +108,8 @@ func (np *Processor) processWithdraw(withdraw *neofsEvent.Withdraw) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Process cheque event by transferring assets from lock account back to
|
// Process cheque event by transferring assets from the lock account back to
|
||||||
// reserve account.
|
// the reserve account.
|
||||||
func (np *Processor) processCheque(cheque *neofsEvent.Cheque) {
|
func (np *Processor) processCheque(cheque *neofsEvent.Cheque) {
|
||||||
if !np.alphabetState.IsAlphabet() {
|
if !np.alphabetState.IsAlphabet() {
|
||||||
np.log.Info("non alphabet mode, ignore cheque")
|
np.log.Info("non alphabet mode, ignore cheque")
|
||||||
|
|
|
@ -6,8 +6,8 @@ import (
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Process config event by setting configuration value from main chain in
|
// Process config event by setting configuration value from the mainchain in
|
||||||
// side chain.
|
// the sidechain.
|
||||||
func (np *Processor) processConfig(config *neofsEvent.Config) {
|
func (np *Processor) processConfig(config *neofsEvent.Config) {
|
||||||
if !np.alphabetState.IsAlphabet() {
|
if !np.alphabetState.IsAlphabet() {
|
||||||
np.log.Info("non alphabet mode, ignore config")
|
np.log.Info("non alphabet mode, ignore config")
|
||||||
|
|
|
@ -14,7 +14,7 @@ func (np *Processor) HandleNewEpochTick(ev event.Event) {
|
||||||
_ = ev.(timerEvent.NewEpochTick)
|
_ = ev.(timerEvent.NewEpochTick)
|
||||||
np.log.Info("tick", zap.String("type", "epoch"))
|
np.log.Info("tick", zap.String("type", "epoch"))
|
||||||
|
|
||||||
// send event to the worker pool
|
// send an event to the worker pool
|
||||||
|
|
||||||
err := np.pool.Submit(func() { np.processNewEpochTick() })
|
err := np.pool.Submit(func() { np.processNewEpochTick() })
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -30,7 +30,7 @@ func (np *Processor) handleNewEpoch(ev event.Event) {
|
||||||
zap.String("type", "new epoch"),
|
zap.String("type", "new epoch"),
|
||||||
zap.Uint64("value", epochEvent.EpochNumber()))
|
zap.Uint64("value", epochEvent.EpochNumber()))
|
||||||
|
|
||||||
// send event to the worker pool
|
// send an event to the worker pool
|
||||||
|
|
||||||
err := np.pool.Submit(func() {
|
err := np.pool.Submit(func() {
|
||||||
np.processNewEpoch(epochEvent)
|
np.processNewEpoch(epochEvent)
|
||||||
|
@ -49,7 +49,7 @@ func (np *Processor) handleAddPeer(ev event.Event) {
|
||||||
zap.String("type", "add peer"),
|
zap.String("type", "add peer"),
|
||||||
)
|
)
|
||||||
|
|
||||||
// send event to the worker pool
|
// send an event to the worker pool
|
||||||
|
|
||||||
err := np.pool.Submit(func() {
|
err := np.pool.Submit(func() {
|
||||||
np.processAddPeer(newPeer)
|
np.processAddPeer(newPeer)
|
||||||
|
|
|
@ -6,17 +6,17 @@ import "github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
type netmapCleanupTick struct {
|
type netmapCleanupTick struct {
|
||||||
epoch uint64
|
epoch uint64
|
||||||
|
|
||||||
// txHash is used in notary environmental
|
// txHash is used in notary environment
|
||||||
// for calculating unique but same for
|
// for calculating unique but same for
|
||||||
// all notification receivers values.
|
// all notification receivers values.
|
||||||
txHash util.Uint256
|
txHash util.Uint256
|
||||||
}
|
}
|
||||||
|
|
||||||
// TxHash returns hash of the TX that triggers
|
// TxHash returns the hash of the TX that triggers
|
||||||
// synchronization process.
|
// synchronization process.
|
||||||
func (s netmapCleanupTick) TxHash() util.Uint256 {
|
func (s netmapCleanupTick) TxHash() util.Uint256 {
|
||||||
return s.txHash
|
return s.txHash
|
||||||
}
|
}
|
||||||
|
|
||||||
// MorphEvent implements Event interface.
|
// MorphEvent implements the Event interface.
|
||||||
func (netmapCleanupTick) MorphEvent() {}
|
func (netmapCleanupTick) MorphEvent() {}
|
||||||
|
|
|
@ -14,13 +14,13 @@ var errMissingRequiredAttr = errors.New("missing required attribute in DB record
|
||||||
// and adds a group of related attributes.
|
// and adds a group of related attributes.
|
||||||
//
|
//
|
||||||
// If n contains at least one of the LOCODE-derived attributes,
|
// If n contains at least one of the LOCODE-derived attributes,
|
||||||
// an error returns.
|
// an error is returned.
|
||||||
//
|
//
|
||||||
// If n contains UN-LOCODE attribute and its value does not
|
// If n contains UN-LOCODE attribute and its value does not
|
||||||
// match the UN/LOCODE format, an error returns.
|
// match the UN/LOCODE format, an error is returned.
|
||||||
//
|
//
|
||||||
// New attributes are formed from the record of DB instance (Prm).
|
// New attributes are formed from the record of DB instance (Prm).
|
||||||
// If DB entry R was found w/o errors, then new attributes are:
|
// If DB entry R was found w/o errors, new attributes are:
|
||||||
// * CountryCode: R.CountryCode().String();
|
// * CountryCode: R.CountryCode().String();
|
||||||
// * Country: R.CountryName();
|
// * Country: R.CountryName();
|
||||||
// * Location: Record.LocationName();
|
// * Location: Record.LocationName();
|
||||||
|
@ -32,7 +32,7 @@ var errMissingRequiredAttr = errors.New("missing required attribute in DB record
|
||||||
func (v *Validator) VerifyAndUpdate(n *netmap.NodeInfo) error {
|
func (v *Validator) VerifyAndUpdate(n *netmap.NodeInfo) error {
|
||||||
mAttr := uniqueAttributes(n.Attributes())
|
mAttr := uniqueAttributes(n.Attributes())
|
||||||
|
|
||||||
// check if derived attributes are presented
|
// check if the derived attributes are presented
|
||||||
for attrKey := range v.mAttr {
|
for attrKey := range v.mAttr {
|
||||||
if _, ok := mAttr[attrKey]; ok {
|
if _, ok := mAttr[attrKey]; ok {
|
||||||
return fmt.Errorf("attribute derived from %s is presented: %s",
|
return fmt.Errorf("attribute derived from %s is presented: %s",
|
||||||
|
|
|
@ -16,11 +16,11 @@ type Prm struct {
|
||||||
DB DB
|
DB DB
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validator is an utility that verifies and updates
|
// Validator is a utility that verifies and updates
|
||||||
// node attributes associated with its geographical location
|
// node attributes associated with its geographical location
|
||||||
// (LOCODE).
|
// (LOCODE).
|
||||||
//
|
//
|
||||||
// For correct operation, Validator must be created
|
// For correct operation, the Validator must be created
|
||||||
// using the constructor (New) based on the required parameters
|
// using the constructor (New) based on the required parameters
|
||||||
// and optional components. After successful creation,
|
// and optional components. After successful creation,
|
||||||
// the Validator is immediately ready to work through API.
|
// the Validator is immediately ready to work through API.
|
||||||
|
|
|
@ -3,7 +3,7 @@ package maddress
|
||||||
// Validator is an utility that verifies node
|
// Validator is an utility that verifies node
|
||||||
// multiaddress.
|
// multiaddress.
|
||||||
//
|
//
|
||||||
// For correct operation, Validator must be created
|
// For correct operation, the Validator must be created
|
||||||
// using the constructor (New). After successful creation,
|
// using the constructor (New). After successful creation,
|
||||||
// the Validator is immediately ready to work through API.
|
// the Validator is immediately ready to work through API.
|
||||||
type Validator struct{}
|
type Validator struct{}
|
||||||
|
|
|
@ -17,7 +17,7 @@ import (
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
)
|
)
|
||||||
|
|
||||||
// CalculatePrm groups required parameters of
|
// CalculatePrm groups the required parameters of
|
||||||
// Calculator.CalculateForEpoch call.
|
// Calculator.CalculateForEpoch call.
|
||||||
type CalculatePrm struct {
|
type CalculatePrm struct {
|
||||||
// Number of epoch to perform the calculation.
|
// Number of epoch to perform the calculation.
|
||||||
|
|
|
@ -5,7 +5,7 @@ import (
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Calculator represents component for calculating payments
|
// Calculator represents a component for calculating payments
|
||||||
// based on data audit results and sending remittances to the chain.
|
// based on data audit results and sending remittances to the chain.
|
||||||
type Calculator struct {
|
type Calculator struct {
|
||||||
prm *CalculatorPrm
|
prm *CalculatorPrm
|
||||||
|
@ -26,7 +26,7 @@ func defaultOptions() *options {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewCalculator creates, initializes and returns new Calculator instance.
|
// NewCalculator creates, initializes and returns a new Calculator instance.
|
||||||
func NewCalculator(p *CalculatorPrm, opts ...CalculatorOption) *Calculator {
|
func NewCalculator(p *CalculatorPrm, opts ...CalculatorOption) *Calculator {
|
||||||
o := defaultOptions()
|
o := defaultOptions()
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@ func NewCalculator(p *CalculatorPrm, opts ...CalculatorOption) *Calculator {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithLogger returns option to specify logging component.
|
// WithLogger returns an option to specify the logging component.
|
||||||
func WithLogger(l *logger.Logger) CalculatorOption {
|
func WithLogger(l *logger.Logger) CalculatorOption {
|
||||||
return func(o *options) {
|
return func(o *options) {
|
||||||
o.log = l
|
o.log = l
|
||||||
|
|
|
@ -73,9 +73,9 @@ func (inc *IncomeSettlementContext) Collect() {
|
||||||
common.TransferAssets(inc.exchange, txTable, common.BasicIncomeCollectionDetails(inc.epoch))
|
common.TransferAssets(inc.exchange, txTable, common.BasicIncomeCollectionDetails(inc.epoch))
|
||||||
}
|
}
|
||||||
|
|
||||||
// avgEstimation returns estimation value for single container. Right now it
|
// avgEstimation returns estimation value for a single container. Right now it
|
||||||
// simply calculates average of all announcements, however it can be smarter and
|
// simply calculates an average of all announcements, however it can be smarter and
|
||||||
// base result on reputation of announcers and clever math.
|
// base the result on reputation of the announcers and clever math.
|
||||||
func (inc *IncomeSettlementContext) avgEstimation(e *cntClient.Estimations) (avg uint64) {
|
func (inc *IncomeSettlementContext) avgEstimation(e *cntClient.Estimations) (avg uint64) {
|
||||||
if len(e.Values) == 0 {
|
if len(e.Values) == 0 {
|
||||||
return 0
|
return 0
|
||||||
|
|
|
@ -6,21 +6,21 @@ import (
|
||||||
subnetid "github.com/nspcc-dev/neofs-sdk-go/subnet/id"
|
subnetid "github.com/nspcc-dev/neofs-sdk-go/subnet/id"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Delete represents notification about NeoFS subnet removal.
|
// Delete represents a notification about NeoFS subnet removal.
|
||||||
// Generated by a contract when intending to delete a subnet.
|
// Generated by a contract when intending to delete a subnet.
|
||||||
type Delete interface {
|
type Delete interface {
|
||||||
// Contains ID of the subnet to be removed.
|
// Contains the ID of the subnet to be removed.
|
||||||
eventWithID
|
eventWithID
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeleteValidator asserts intent to remove a subnet.
|
// DeleteValidator asserts intent to remove a subnet.
|
||||||
type DeleteValidator struct{}
|
type DeleteValidator struct{}
|
||||||
|
|
||||||
// Assert processes the attempt to remove a subnet. Approves the removal through nil return.
|
// Assert processes the attempt to remove a subnet. It approves the removal through nil return.
|
||||||
//
|
//
|
||||||
// All read errors of Delete are forwarded.
|
// All read errors of Delete are forwarded.
|
||||||
//
|
//
|
||||||
// Returns an error on:
|
// It returns an error on:
|
||||||
// * zero subnet creation;
|
// * zero subnet creation;
|
||||||
// * empty ID or different from the one wired into info;
|
// * empty ID or different from the one wired into info;
|
||||||
// * empty owner ID or different from the one wired into info.
|
// * empty owner ID or different from the one wired into info.
|
||||||
|
|
|
@ -9,34 +9,34 @@ import (
|
||||||
subnetid "github.com/nspcc-dev/neofs-sdk-go/subnet/id"
|
subnetid "github.com/nspcc-dev/neofs-sdk-go/subnet/id"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Put represents notification about NeoFS subnet creation.
|
// Put represents a notification about NeoFS subnet creation.
|
||||||
// Generated by a contract when intending to create a subnet.
|
// Generated by a contract when intending to create a subnet.
|
||||||
type Put interface {
|
type Put interface {
|
||||||
// Contains ID of the subnet to be created.
|
// Contains the ID of the subnet to be created.
|
||||||
eventWithID
|
eventWithID
|
||||||
|
|
||||||
// ReadCreator reads user ID of the subnet creator.
|
// ReadCreator reads the user ID of the subnet creator.
|
||||||
// Returns an error if ID is missing.
|
// Returns an error if the ID is missing.
|
||||||
ReadCreator(id *owner.ID) error
|
ReadCreator(id *owner.ID) error
|
||||||
|
|
||||||
// ReadInfo reads information about subnet to be created.
|
// ReadInfo reads information about a subnet to be created.
|
||||||
ReadInfo(info *subnet.Info) error
|
ReadInfo(info *subnet.Info) error
|
||||||
}
|
}
|
||||||
|
|
||||||
// PutValidator asserts intent to create a subnet.
|
// PutValidator asserts intent to create a subnet.
|
||||||
type PutValidator struct{}
|
type PutValidator struct{}
|
||||||
|
|
||||||
// errDiffOwner is returned when subnet owners differ.
|
// errDiffOwner is returned when the subnet owners differ.
|
||||||
var errDiffOwner = errors.New("diff subnet owners")
|
var errDiffOwner = errors.New("diff subnet owners")
|
||||||
|
|
||||||
// errDiffID is returned when subnet IDs differ.
|
// errDiffID is returned when the subnet IDs differ.
|
||||||
var errDiffID = errors.New("diff subnet IDs")
|
var errDiffID = errors.New("diff subnet IDs")
|
||||||
|
|
||||||
// Assert processes the attempt to create a subnet. Approves the creation through nil return.
|
// Assert processes the attempt to create a subnet. It approves the creation through nil return.
|
||||||
//
|
//
|
||||||
// All read errors of Put are forwarded.
|
// All read errors of Put are forwarded.
|
||||||
//
|
//
|
||||||
// Returns an error on:
|
// It returns an error on:
|
||||||
// * zero subnet creation;
|
// * zero subnet creation;
|
||||||
// * empty ID or different from the one wired into info;
|
// * empty ID or different from the one wired into info;
|
||||||
// * empty owner ID or different from the one wired into info.
|
// * empty owner ID or different from the one wired into info.
|
||||||
|
@ -68,12 +68,12 @@ func (x PutValidator) Assert(event Put) error {
|
||||||
return fmt.Errorf("read info: %w", err)
|
return fmt.Errorf("read info: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// check if explicit ID equals to the one from info
|
// check if the explicit ID equals to the one from info
|
||||||
if !subnet.IDEquals(info, id) {
|
if !subnet.IDEquals(info, id) {
|
||||||
return errDiffID
|
return errDiffID
|
||||||
}
|
}
|
||||||
|
|
||||||
// check if explicit creator equals to the one from info
|
// check if the explicit creator equals to the one from info
|
||||||
if !subnet.IsOwner(info, creator) {
|
if !subnet.IsOwner(info, creator) {
|
||||||
return errDiffOwner
|
return errDiffOwner
|
||||||
}
|
}
|
||||||
|
|
|
@ -139,13 +139,13 @@ func (s *Server) voteForSidechainValidator(prm governance.VoteValidatorPrm) erro
|
||||||
}
|
}
|
||||||
|
|
||||||
// VoteForSidechainValidator calls vote method on alphabet contracts with
|
// VoteForSidechainValidator calls vote method on alphabet contracts with
|
||||||
// provided list of keys.
|
// the provided list of keys.
|
||||||
func (s *Server) VoteForSidechainValidator(prm governance.VoteValidatorPrm) error {
|
func (s *Server) VoteForSidechainValidator(prm governance.VoteValidatorPrm) error {
|
||||||
sort.Sort(prm.Validators)
|
sort.Sort(prm.Validators)
|
||||||
return s.voteForSidechainValidator(prm)
|
return s.voteForSidechainValidator(prm)
|
||||||
}
|
}
|
||||||
|
|
||||||
// WriteReport composes audit result structure from audit report
|
// WriteReport composes the audit result structure from the audit report
|
||||||
// and sends it to Audit contract.
|
// and sends it to Audit contract.
|
||||||
func (s *Server) WriteReport(r *audit.Report) error {
|
func (s *Server) WriteReport(r *audit.Report) error {
|
||||||
res := r.Result()
|
res := r.Result()
|
||||||
|
@ -157,9 +157,9 @@ func (s *Server) WriteReport(r *audit.Report) error {
|
||||||
return s.auditClient.PutAuditResult(prm)
|
return s.auditClient.PutAuditResult(prm)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ResetEpochTimer resets block timer that produces events to update epoch
|
// ResetEpochTimer resets the block timer that produces events to update epoch
|
||||||
// counter in netmap contract. Used to synchronize this even production
|
// counter in the netmap contract. It is used to synchronize this even production
|
||||||
// based on block with notification of last epoch.
|
// based on the block with a notification of the last epoch.
|
||||||
func (s *Server) ResetEpochTimer(h uint32) error {
|
func (s *Server) ResetEpochTimer(h uint32) error {
|
||||||
s.epochTimer.Tick(h)
|
s.epochTimer.Tick(h)
|
||||||
return s.epochTimer.Reset()
|
return s.epochTimer.Reset()
|
||||||
|
@ -169,7 +169,7 @@ func (s *Server) setHealthStatus(hs control.HealthStatus) {
|
||||||
s.healthStatus.Store(hs)
|
s.healthStatus.Store(hs)
|
||||||
}
|
}
|
||||||
|
|
||||||
// HealthStatus returns current health status of IR application.
|
// HealthStatus returns the current health status of the IR application.
|
||||||
func (s *Server) HealthStatus() control.HealthStatus {
|
func (s *Server) HealthStatus() control.HealthStatus {
|
||||||
return s.healthStatus.Load().(control.HealthStatus)
|
return s.healthStatus.Load().(control.HealthStatus)
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,8 +36,8 @@ type subnetConfig struct {
|
||||||
queueSize uint32
|
queueSize uint32
|
||||||
}
|
}
|
||||||
|
|
||||||
// makes IR server to catch Subnet notifications from sidechain listener,
|
// makes IR server to catch Subnet notifications from the sidechain listener,
|
||||||
// and to release corresponding processing queue on stop.
|
// and to release the corresponding processing queue on stop.
|
||||||
func (s *Server) initSubnet(cfg subnetConfig) {
|
func (s *Server) initSubnet(cfg subnetConfig) {
|
||||||
s.registerStarter(func() error {
|
s.registerStarter(func() error {
|
||||||
var err error
|
var err error
|
||||||
|
@ -92,11 +92,11 @@ const (
|
||||||
notarySubnetCreateEvName = "put"
|
notarySubnetCreateEvName = "put"
|
||||||
)
|
)
|
||||||
|
|
||||||
// makes IR server to listen notifications of Subnet contract.
|
// makes the IR server to listen to notifications of Subnet contract.
|
||||||
// All required resources must be initialized before (initSubnet).
|
// All required resources must be initialized before (initSubnet).
|
||||||
// Works in one of two modes (configured): notary and non-notary.
|
// It works in one of two modes (configured): notary and non-notary.
|
||||||
//
|
//
|
||||||
// All handlers are executed only if local node is an alphabet one.
|
// All handlers are executed only if the local node is an alphabet one.
|
||||||
//
|
//
|
||||||
// Events (notary):
|
// Events (notary):
|
||||||
// * put (parser: subnetevents.ParseNotaryPut, handler: catchSubnetCreation);
|
// * put (parser: subnetevents.ParseNotaryPut, handler: catchSubnetCreation);
|
||||||
|
@ -183,15 +183,15 @@ type putSubnetEvent struct {
|
||||||
ev subnetevents.Put
|
ev subnetevents.Put
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReadID unmarshals subnet ID from a binary NeoFS API protocol's format.
|
// ReadID unmarshals the subnet ID from a binary NeoFS API protocol's format.
|
||||||
func (x putSubnetEvent) ReadID(id *subnetid.ID) error {
|
func (x putSubnetEvent) ReadID(id *subnetid.ID) error {
|
||||||
return id.Unmarshal(x.ev.ID())
|
return id.Unmarshal(x.ev.ID())
|
||||||
}
|
}
|
||||||
|
|
||||||
var errMissingSubnetOwner = errors.New("missing subnet owner")
|
var errMissingSubnetOwner = errors.New("missing subnet owner")
|
||||||
|
|
||||||
// ReadCreator unmarshals subnet creator from a binary NeoFS API protocol's format.
|
// ReadCreator unmarshals the subnet creator from a binary NeoFS API protocol's format.
|
||||||
// Returns an error if byte array is empty.
|
// Returns an error if the byte array is empty.
|
||||||
func (x putSubnetEvent) ReadCreator(id *owner.ID) error {
|
func (x putSubnetEvent) ReadCreator(id *owner.ID) error {
|
||||||
data := x.ev.Owner()
|
data := x.ev.Owner()
|
||||||
|
|
||||||
|
@ -210,12 +210,12 @@ func (x putSubnetEvent) ReadCreator(id *owner.ID) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReadInfo unmarshal subnet info from a binary NeoFS API protocol's format.
|
// ReadInfo unmarshal the subnet info from a binary NeoFS API protocol's format.
|
||||||
func (x putSubnetEvent) ReadInfo(info *subnet.Info) error {
|
func (x putSubnetEvent) ReadInfo(info *subnet.Info) error {
|
||||||
return info.Unmarshal(x.ev.Info())
|
return info.Unmarshal(x.ev.Info())
|
||||||
}
|
}
|
||||||
|
|
||||||
// handleSubnetCreation handles event of subnet creation parsed via subnetevents.ParsePut.
|
// handleSubnetCreation handles an event of subnet creation parsed via subnetevents.ParsePut.
|
||||||
//
|
//
|
||||||
// Validates the event using irsubnet.PutValidator. Logs message about (dis)agreement.
|
// Validates the event using irsubnet.PutValidator. Logs message about (dis)agreement.
|
||||||
func (s *Server) handleSubnetCreation(e event.Event) {
|
func (s *Server) handleSubnetCreation(e event.Event) {
|
||||||
|
@ -260,7 +260,7 @@ func (s *Server) handleSubnetCreation(e event.Event) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// catchSubnetRemoval catches event of subnet removal from listener and queues the processing.
|
// catchSubnetRemoval catches an event of subnet removal from listener and queues the processing.
|
||||||
func (s *Server) catchSubnetRemoval(e event.Event) {
|
func (s *Server) catchSubnetRemoval(e event.Event) {
|
||||||
err := s.subnetHandler.workerPool.Submit(func() {
|
err := s.subnetHandler.workerPool.Submit(func() {
|
||||||
s.handleSubnetRemoval(e)
|
s.handleSubnetRemoval(e)
|
||||||
|
|
|
@ -55,7 +55,7 @@ func defaultCfg() *cfg {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// New creates and returns new Blobovnicza instance.
|
// New creates and returns a new Blobovnicza instance.
|
||||||
func New(opts ...Option) *Blobovnicza {
|
func New(opts ...Option) *Blobovnicza {
|
||||||
c := defaultCfg()
|
c := defaultCfg()
|
||||||
|
|
||||||
|
@ -76,7 +76,7 @@ func WithPath(path string) Option {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithPermissions returns option to specify permission bits
|
// WithPermissions returns an option to specify permission bits
|
||||||
// of Blobovnicza's system path.
|
// of Blobovnicza's system path.
|
||||||
func WithPermissions(perm fs.FileMode) Option {
|
func WithPermissions(perm fs.FileMode) Option {
|
||||||
return func(c *cfg) {
|
return func(c *cfg) {
|
||||||
|
@ -84,7 +84,7 @@ func WithPermissions(perm fs.FileMode) Option {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithObjectSizeLimit returns option to specify maximum size
|
// WithObjectSizeLimit returns an option to specify the maximum size
|
||||||
// of the objects stored in Blobovnicza.
|
// of the objects stored in Blobovnicza.
|
||||||
func WithObjectSizeLimit(lim uint64) Option {
|
func WithObjectSizeLimit(lim uint64) Option {
|
||||||
return func(c *cfg) {
|
return func(c *cfg) {
|
||||||
|
@ -92,7 +92,7 @@ func WithObjectSizeLimit(lim uint64) Option {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithFullSizeLimit returns option to set maximum sum size
|
// WithFullSizeLimit returns an option to set the maximum sum size
|
||||||
// of all stored objects.
|
// of all stored objects.
|
||||||
func WithFullSizeLimit(lim uint64) Option {
|
func WithFullSizeLimit(lim uint64) Option {
|
||||||
return func(c *cfg) {
|
return func(c *cfg) {
|
||||||
|
@ -100,14 +100,14 @@ func WithFullSizeLimit(lim uint64) Option {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithLogger returns option to specify Blobovnicza's logger.
|
// WithLogger returns an option to specify Blobovnicza's logger.
|
||||||
func WithLogger(l *logger.Logger) Option {
|
func WithLogger(l *logger.Logger) Option {
|
||||||
return func(c *cfg) {
|
return func(c *cfg) {
|
||||||
c.log = l.With(zap.String("component", "Blobovnicza"))
|
c.log = l.With(zap.String("component", "Blobovnicza"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReadOnly returns option to open Blobovnicza in read-only mode.
|
// ReadOnly returns an option to open Blobovnicza in read-only mode.
|
||||||
func ReadOnly() Option {
|
func ReadOnly() Option {
|
||||||
return func(c *cfg) {
|
return func(c *cfg) {
|
||||||
c.boltOptions.ReadOnly = true
|
c.boltOptions.ReadOnly = true
|
||||||
|
|
|
@ -9,9 +9,9 @@ import (
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Open opens an internal database at configured path with configured permissions.
|
// Open opens an internal database at the configured path with the configured permissions.
|
||||||
//
|
//
|
||||||
// If the database file does not exist then it will be created automatically.
|
// If the database file does not exist, it will be created automatically.
|
||||||
func (b *Blobovnicza) Open() error {
|
func (b *Blobovnicza) Open() error {
|
||||||
b.log.Debug("creating directory for BoltDB",
|
b.log.Debug("creating directory for BoltDB",
|
||||||
zap.String("path", b.path),
|
zap.String("path", b.path),
|
||||||
|
@ -39,7 +39,7 @@ func (b *Blobovnicza) Open() error {
|
||||||
|
|
||||||
// Init initializes internal database structure.
|
// Init initializes internal database structure.
|
||||||
//
|
//
|
||||||
// If Blobovnicza is already initialized, then no action is taken.
|
// If Blobovnicza is already initialized, no action is taken.
|
||||||
//
|
//
|
||||||
// Should not be called in read-only configuration.
|
// Should not be called in read-only configuration.
|
||||||
func (b *Blobovnicza) Init() error {
|
func (b *Blobovnicza) Init() error {
|
||||||
|
|
|
@ -12,16 +12,16 @@ type DeletePrm struct {
|
||||||
addr *addressSDK.Address
|
addr *addressSDK.Address
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeleteRes groups resulting values of Delete operation.
|
// DeleteRes groups the resulting values of Delete operation.
|
||||||
type DeleteRes struct {
|
type DeleteRes struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetAddress sets address of the requested object.
|
// SetAddress sets the address of the requested object.
|
||||||
func (p *DeletePrm) SetAddress(addr *addressSDK.Address) {
|
func (p *DeletePrm) SetAddress(addr *addressSDK.Address) {
|
||||||
p.addr = addr
|
p.addr = addr
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete removes object from Blobovnicza by address.
|
// Delete removes an object from Blobovnicza by address.
|
||||||
//
|
//
|
||||||
// Returns any error encountered that
|
// Returns any error encountered that
|
||||||
// did not allow to completely delete the object.
|
// did not allow to completely delete the object.
|
||||||
|
|
|
@ -6,8 +6,8 @@ import (
|
||||||
apistatus "github.com/nspcc-dev/neofs-sdk-go/client/status"
|
apistatus "github.com/nspcc-dev/neofs-sdk-go/client/status"
|
||||||
)
|
)
|
||||||
|
|
||||||
// IsErrNotFound checks if error returned by Blobovnicza Get/Delete method
|
// IsErrNotFound checks if the error returned by Blobovnicza Get/Delete method
|
||||||
// corresponds to missing object.
|
// corresponds to the missing object.
|
||||||
func IsErrNotFound(err error) bool {
|
func IsErrNotFound(err error) bool {
|
||||||
return errors.As(err, new(apistatus.ObjectNotFound))
|
return errors.As(err, new(apistatus.ObjectNotFound))
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,12 +13,12 @@ type GetPrm struct {
|
||||||
addr *addressSDK.Address
|
addr *addressSDK.Address
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetRes groups resulting values of Get operation.
|
// GetRes groups the resulting values of Get operation.
|
||||||
type GetRes struct {
|
type GetRes struct {
|
||||||
obj []byte
|
obj []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetAddress sets address of the requested object.
|
// SetAddress sets the address of the requested object.
|
||||||
func (p *GetPrm) SetAddress(addr *addressSDK.Address) {
|
func (p *GetPrm) SetAddress(addr *addressSDK.Address) {
|
||||||
p.addr = addr
|
p.addr = addr
|
||||||
}
|
}
|
||||||
|
@ -28,12 +28,12 @@ func (p *GetRes) Object() []byte {
|
||||||
return p.obj
|
return p.obj
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get reads the object from Blobovnicza by address.
|
// Get reads an object from Blobovnicza by address.
|
||||||
//
|
//
|
||||||
// Returns any error encountered that
|
// Returns any error encountered that
|
||||||
// did not allow to completely read the object.
|
// did not allow to completely read the object.
|
||||||
//
|
//
|
||||||
// Returns an error of type apistatus.ObjectNotFound if requested object is not
|
// Returns an error of type apistatus.ObjectNotFound if the requested object is not
|
||||||
// presented in Blobovnicza.
|
// presented in Blobovnicza.
|
||||||
func (b *Blobovnicza) Get(prm *GetPrm) (*GetRes, error) {
|
func (b *Blobovnicza) Get(prm *GetPrm) (*GetRes, error) {
|
||||||
var (
|
var (
|
||||||
|
|
|
@ -3,7 +3,7 @@ package blobovnicza
|
||||||
// ID represents Blobovnicza identifier.
|
// ID represents Blobovnicza identifier.
|
||||||
type ID []byte
|
type ID []byte
|
||||||
|
|
||||||
// NewIDFromBytes constructs ID from byte slice.
|
// NewIDFromBytes constructs an ID from a byte slice.
|
||||||
func NewIDFromBytes(v []byte) *ID {
|
func NewIDFromBytes(v []byte) *ID {
|
||||||
return (*ID)(&v)
|
return (*ID)(&v)
|
||||||
}
|
}
|
||||||
|
|
|
@ -106,7 +106,7 @@ func (x *IteratePrm) IgnoreErrors() {
|
||||||
x.ignoreErrors = true
|
x.ignoreErrors = true
|
||||||
}
|
}
|
||||||
|
|
||||||
// IterateRes groups resulting values of Iterate operation.
|
// IterateRes groups the resulting values of Iterate operation.
|
||||||
type IterateRes struct {
|
type IterateRes struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue