Rename "Deploy" method to "Init"

There was a bit of confusion between contract deploying
and calling "Deploy" method. Also new "Init" method
uses generic setter to initialize contract storage.
This commit is contained in:
alexvanin 2020-07-15 19:26:24 +03:00
parent 209740f060
commit 62d5d863f4

View file

@ -30,7 +30,10 @@ const (
tokenHash = "\x3b\x7d\x37\x11\xc6\xf0\xcc\xf9\xb1\xdc\xa9\x03\xd1\xbf\xa1\xd8\x96\xf1\x23\x8c" tokenHash = "\x3b\x7d\x37\x11\xc6\xf0\xcc\xf9\xb1\xdc\xa9\x03\xd1\xbf\xa1\xd8\x96\xf1\x23\x8c"
innerRingCandidateFee = 100 * 1000 * 1000 // 10^8 innerRingCandidateFee = 100 * 1000 * 1000 // 10^8
version = 2 version = 2
innerRingKey = "innerring"
voteKey = "ballots" voteKey = "ballots"
candidatesKey = "candidates"
cashedChequesKey = "cheques"
blockDiff = 20 // change base on performance evaluation blockDiff = 20 // change base on performance evaluation
) )
@ -65,34 +68,31 @@ func Main(op string, args []interface{}) interface{} {
*/ */
ctx := storage.GetContext() ctx := storage.GetContext()
switch op { switch op {
case "Deploy": case "Init":
irList := getSerialized(ctx, "InnerRingList").([]node) if storage.Get(ctx, innerRingKey) != nil {
if len(irList) >= 3 { panic("neofs: contract already deployed")
panic("contract already deployed")
} }
irList = []node{} var irList []node
for i := 0; i < len(args); i++ { for i := 0; i < len(args); i++ {
pub := args[i].([]byte) pub := args[i].([]byte)
irList = append(irList, node{pub: pub}) irList = append(irList, node{pub: pub})
} }
data := binary.Serialize(irList) // initialize all storage slices
storage.Put(ctx, "InnerRingList", data) setSerialized(ctx, innerRingKey, irList)
setSerialized(ctx, voteKey, []ballot{})
setSerialized(ctx, candidatesKey, []node{})
setSerialized(ctx, cashedChequesKey, []cheque{})
data = binary.Serialize([]interface{}{}) runtime.Log("neofs: contract initialized")
storage.Put(ctx, "UsedVerifCheckList", data)
storage.Put(ctx, "InnerRingCandidates", data)
data = binary.Serialize([]ballot{})
storage.Put(ctx, voteKey, data)
return true return true
case "InnerRingList": case "InnerRingList":
irList := getSerialized(ctx, "InnerRingList").([]node) return getInnerRingNodes(ctx)
return irList
case "InnerRingCandidateRemove": case "InnerRingCandidateRemove":
data := args[0].([]byte) // public key data := args[0].([]byte) // public key
if !runtime.CheckWitness(data) { if !runtime.CheckWitness(data) {
@ -308,11 +308,11 @@ func Main(op string, args []interface{}) interface{} {
panic("isInnerRing: incorrect public key") panic("isInnerRing: incorrect public key")
} }
irList := getSerialized(ctx, "InnerRingList").([]node) irList := getInnerRingNodes(ctx)
for i := range irList { for i := range irList {
node := irList[i] node := irList[i]
if util.Equals(node.pub, key) { if bytesEqual(node.pub, key) {
return true return true
} }
} }
@ -517,6 +517,16 @@ func setSerialized(ctx storage.Context, key interface{}, value interface{}) {
storage.Put(ctx, key, data) storage.Put(ctx, key, data)
} }
// getInnerRingNodes returns deserialized slice of inner ring nodes from storage.
func getInnerRingNodes(ctx storage.Context) []node {
data := storage.Get(ctx, innerRingKey)
if data != nil {
return binary.Deserialize(data.([]byte)).([]node)
}
return []node{}
}
// getInnerRingNodes returns deserialized slice of vote ballots. // getInnerRingNodes returns deserialized slice of vote ballots.
func getBallots(ctx storage.Context) []ballot { func getBallots(ctx storage.Context) []ballot {
data := storage.Get(ctx, voteKey) data := storage.Get(ctx, voteKey)