[#108] nns: Add GetSubDomains
Signed-off-by: Alexander Chuprov <a.chuprov@yadro.com>
This commit is contained in:
parent
c142971bfd
commit
e3a353fa75
4 changed files with 87 additions and 0 deletions
|
@ -15,6 +15,7 @@ safemethods:
|
|||
- "tokens"
|
||||
- "resolve"
|
||||
- "roots"
|
||||
- "getSubDomains"
|
||||
events:
|
||||
- name: Transfer
|
||||
parameters:
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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",
|
||||
|
|
Loading…
Add table
Reference in a new issue