@@ -10,6 +10,8 @@ import (
1010 "github.com/ava-labs/avalanchego/database/prefixdb"
1111 "github.com/ava-labs/avalanchego/database/versiondb"
1212 "github.com/ava-labs/quarkvm/crypto/ed25519"
13+ "github.com/ava-labs/quarkvm/vm/codec"
14+ "github.com/ava-labs/quarkvm/vm/info"
1315)
1416
1517var (
2325 keyPrefix = []byte ("key" )
2426)
2527
28+ var (
29+ ErrKeyExists = errors .New ("key already exists" )
30+ )
31+
2632type Storage interface {
2733 Block () database.Database
2834 Info () database.Database
@@ -68,17 +74,49 @@ func (s *storage) Key() database.Database {
6874 return s .keyDB
6975}
7076
77+ // any non-existent or expired (see below) key can be claimed
78+ // by anyone that submits a sufficient PoW.
7179func (s * storage ) Put (k []byte , v []byte , opts ... OpOption ) error {
7280 ret := & Op {}
7381 ret .applyOpts (opts )
74- if ret .overwrite && ret . owner == nil {
82+ if ret .owner == nil {
7583 return errors .New ("caller must provide the public key to make modification or overwrite" )
7684 }
7785
78- // TODO: look up key
79- // if exists, only overwrite when conditions are met
80- // implement other business logic
86+ if exist , _ := s .keyDB .Has (k ); exist && ! ret .overwrite {
87+ return ErrKeyExists
88+ }
89+
90+ // "a/b" then pfx is "a" and sub is "b"
91+ pfx , sub , _ , err := getPrefix (k )
92+ if err != nil {
93+ return err
94+ }
95+
96+ // find the owner of the prefix
97+ infoBytes , err := s .infoDB .Get (pfx )
98+ if err != nil && err == database .ErrClosed {
99+ // TODO: db returns error if not found?
100+ return err
101+ }
102+
103+ if len (infoBytes ) > 0 {
104+ // TODO: validate with public key
105+ // where to get signature
106+ ret .owner .Verify (infoBytes , nil )
107+
108+ // TODO: update the info key
109+ } else {
110+ info := & info.Info {Owner : ret .owner }
111+ infoBytes , err := codec .Marshal (info )
112+ if err != nil {
113+ return err
114+ }
115+ s .infoDB .Put (pfx , infoBytes )
116+ }
81117
118+ // if validated or new key,
119+ // the owner is allowed to write the key
82120 return s .keyDB .Put (k , v )
83121}
84122
0 commit comments