-
Notifications
You must be signed in to change notification settings - Fork 0
/
rootdomain.go
90 lines (78 loc) · 2.91 KB
/
rootdomain.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
//
// Copyright 2019 Insolar Technologies GmbH
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
package rootdomain
import (
"fmt"
"github.com/pkg/errors"
"github.com/insolar/insolar/insolar"
"github.com/insolar/insolar/logicrunner/builtin/foundation"
"github.com/insolar/insolar/logicrunner/builtin/proxy/helloworld"
"github.com/insolar/insolar/logicrunner/builtin/proxy/pkshard"
)
// RootDomain is smart contract representing entrance point to system.
type RootDomain struct {
foundation.BaseContract
PublicKeyShards []insolar.Reference
NodeDomain insolar.Reference
}
// GetMemberByPublicKey gets member reference by public key.
// ins:immutable
func (rd *RootDomain) GetMemberByPublicKey(publicKey string) (*insolar.Reference, error) {
trimmedPublicKey := foundation.TrimPublicKey(publicKey)
i := foundation.GetShardIndex(trimmedPublicKey, len(rd.PublicKeyShards))
if i >= len(rd.PublicKeyShards) {
return nil, fmt.Errorf("incorrect shard index")
}
s := pkshard.GetObject(rd.PublicKeyShards[i])
refStr, err := s.GetRef(trimmedPublicKey)
if err != nil {
return nil, errors.Wrap(err, "failed to get reference in shard")
}
ref, err := insolar.NewObjectReferenceFromBase58(refStr)
if err != nil {
return nil, errors.Wrap(err, "bad member reference for this public key")
}
return ref, nil
}
// GetNodeDomainRef returns reference of NodeDomain instance
// ins:immutable
func (rd *RootDomain) GetNodeDomainRef() (insolar.Reference, error) {
return rd.NodeDomain, nil
}
var INSATTR_Info_API = true
// AddNewMemberToPublicKeyMap adds new member to PublicKeyMap.
// ins:immutable
func (rd *RootDomain) AddNewMemberToPublicKeyMap(publicKey string, memberRef insolar.Reference) error {
trimmedPublicKey := foundation.TrimPublicKey(publicKey)
shardIndex := foundation.GetShardIndex(trimmedPublicKey, len(rd.PublicKeyShards))
if shardIndex >= len(rd.PublicKeyShards) {
return fmt.Errorf("incorrect public key shard index")
}
pks := pkshard.GetObject(rd.PublicKeyShards[shardIndex])
err := pks.SetRef(trimmedPublicKey, memberRef.String())
if err != nil {
return errors.Wrap(err, "failed to set reference in public key shard")
}
return nil
}
func (rd *RootDomain) CreateHelloWorld() (string, error) {
helloWorldHolder := helloworld.New()
m, err := helloWorldHolder.AsChild(rd.GetReference())
if err != nil {
return "", fmt.Errorf("failed to save as child: %s", err.Error())
}
return m.GetReference().String(), nil
}