[#108] nns: Add GetSubDomains
All checks were successful
DCO action / DCO (pull_request) Successful in 38s
Tests / Tests (1.21) (pull_request) Successful in 1m10s
Tests / Tests (1.22) (pull_request) Successful in 1m10s

Signed-off-by: Alexander Chuprov <a.chuprov@yadro.com>
This commit is contained in:
Alexander Chuprov 2024-09-03 18:06:04 +03:00
parent c142971bfd
commit e3a353fa75
4 changed files with 87 additions and 0 deletions

View file

@ -15,6 +15,7 @@ safemethods:
- "tokens"
- "resolve"
- "roots"
- "getSubDomains"
events:
- name: Transfer
parameters:

View file

@ -1064,3 +1064,32 @@ func getAllRecords(ctx storage.Context, name string) iterator.Iterator {
recordsKey := getRecordsKey(tokenID, name)
return storage.Find(ctx, recordsKey, storage.ValuesOnly|storage.DeserializeValues)
}
// GetSubDomain returns a list of subdomains
func GetSubDomains(domain string) [][]byte {
ctx := storage.GetReadOnlyContext()
return getSubDomains(ctx, domain)
}
func getSubDomains(ctx storage.Context, domain string) [][]byte {
if len(domain) > 0 && domain[0] == '.' {
domain = domain[1:]
}
var subDomains [][]byte
it := storage.Find(ctx, []byte{prefixName}, storage.ValuesOnly)
for iterator.Next(it) {
domainRaw := iterator.Value(it).([]byte)
ns := std.Deserialize(domainRaw).(NameState)
fragments := std.StringSplit(ns.Name, ".")
if len(fragments) <= 1 || fragments[len(fragments)-1] != domain {
continue
}
subDomains = append(subDomains, []byte(ns.Name))
}
return subDomains
}

View file

@ -187,6 +187,28 @@ func (c *Contract) GetAllRecordsUnsigned(name string) (*transaction.Transaction,
return c.actor.MakeUnsignedCall(c.hash, "getAllRecords", nil, name)
}
// GetSubDomains creates a transaction invoking `getSubDomains` method of the contract.
// This transaction is signed and immediately sent to the network.
// The values returned are its hash, ValidUntilBlock value and error if any.
func (c *Contract) GetSubDomains(domain string) (util.Uint256, uint32, error) {
return c.actor.SendCall(c.hash, "getSubDomains", domain)
}
// GetSubDomainsTransaction creates a transaction invoking `getSubDomains` method of the contract.
// This transaction is signed, but not sent to the network, instead it's
// returned to the caller.
func (c *Contract) GetSubDomainsTransaction(domain string) (*transaction.Transaction, error) {
return c.actor.MakeCall(c.hash, "getSubDomains", domain)
}
// GetSubDomainsUnsigned creates a transaction invoking `getSubDomains` method of the contract.
// This transaction is not signed, it's simply returned to the caller.
// Any fields of it that do not affect fees can be changed (ValidUntilBlock,
// Nonce), fee values (NetworkFee, SystemFee) can be increased as well.
func (c *Contract) GetSubDomainsUnsigned(domain string) (*transaction.Transaction, error) {
return c.actor.MakeUnsignedCall(c.hash, "getSubDomains", nil, domain)
}
func (c *Contract) scriptForRegister(name string, owner util.Uint160, email string, refresh *big.Int, retry *big.Int, expire *big.Int, ttl *big.Int) ([]byte, error) {
return smartcontract.CreateCallWithAssertScript(c.hash, "register", name, owner, email, refresh, retry, expire, ttl)
}

View file

@ -202,6 +202,41 @@ func TestGlobalDomain(t *testing.T) {
c.InvokeFail(t, "global domain is already taken", "isAvailable", "dom.testdomain.com")
}
func TestGetSubDomains(t *testing.T) {
c := newNNSInvoker(t, false)
accTop := c.NewAccount(t)
refresh, retry, expire, ttl := int64(101), int64(102), int64(103), int64(104)
c1 := c.WithSigners(c.Committee, accTop)
acc := c.NewAccount(t)
c2 := c.WithSigners(c.Committee, acc)
c1.Invoke(t, true, "register",
"com", accTop.ScriptHash(),
"myemail@frostfs.info", refresh, retry, expire, ttl)
c1.Invoke(t, true, "register",
"net", accTop.ScriptHash(),
"myemail@frostfs.info", refresh, retry, expire, ttl)
c1.Invoke(t, true, "register",
"dom.com", accTop.ScriptHash(),
"myemail@frostfs.info", refresh, retry, expire, ttl)
c1.Invoke(t, true, "register",
"globaldomain.com", accTop.ScriptHash(),
"myemail@frostfs.info", refresh, retry, expire, ttl)
c1.Invoke(t, true, "register",
"domik.dom.com", accTop.ScriptHash(),
"myemail@frostfs.info", refresh, retry, expire, ttl)
c1.Invoke(t, []stackitem.Item{stackitem.NewBuffer([]byte("dom.com")), stackitem.NewBuffer([]byte("globaldomain.com")), stackitem.NewBuffer([]byte("domik.dom.com"))}, "getSubDomains", "com")
c2.Invoke(t, []stackitem.Item{stackitem.NewBuffer([]byte("dom.com")), stackitem.NewBuffer([]byte("globaldomain.com")), stackitem.NewBuffer([]byte("domik.dom.com"))}, "getSubDomains", "com")
c1.Invoke(t, stackitem.Null{}, "getSubDomains", "net")
}
func TestTLDRecord(t *testing.T) {
c := newNNSInvoker(t, true)
c.Invoke(t, stackitem.Null{}, "addRecord",