//登记认证 //必须拥有NNS的所有权才能成功 static byte[] authenticate(byte[] addr, string[] domainArray) { //只能操作自己的地址 if (!Runtime.CheckWitness(addr)) { return new byte[] { 0 } } ; //使用StorageMap,推荐的存储区使用方式 StorageMap addrCreditMap = Storage.CurrentContext.CreateMap("addrCreditMap"); //使用域名中心计算namehash //byte[] roothash = rootCall("nameHash", new object[] { rootDomain }) as byte[]; //byte[] namehash = rootCall("nameHashSub", new object[] { roothash,subDomain }) as byte[]; byte[] namehash = rootCall("nameHashArray", new object[] { domainArray }) as byte[]; //使用域名中心获取域名信息 OwnerInfo ownerInfo = getOwnerInfo(namehash); //判断NNS有没有初始化,初始化了才进行 if (ownerInfo.owner.Length > 0) { //获取最新块时间 var lastBlockTime = Blockchain.GetHeader(Blockchain.GetHeight()).Timestamp; //如果addr是所有者,而且没有过期,才能登记 if ((ownerInfo.owner == addr) && (lastBlockTime <= ownerInfo.TTL)) { NNScredit creditData = new NNScredit(); creditData.namehash = namehash; //根域名 string fullDomainStr = domainArray[0]; //其它逐级拼接 for (var i = 1; i < domainArray.Length; i++) { fullDomainStr = string.Concat(domainArray[i], string.Concat(".", fullDomainStr)); } creditData.fullDomainName = fullDomainStr; creditData.TTL = ownerInfo.TTL; //creditData.witness = "77e193f1af44a61ed3613e6e3442a0fc809bb4b8".AsByteArray(); //存储 addrCreditMap.Put(addr, creditData.Serialize()); //通知注册 onAddrCreditRegistered(addr, creditData); return(new byte[] { 1 }); } } return(new byte[] { 0 }); }
static NNScredit getCreditInfo(byte[] addr) { //addr不满足地址正常长度,返回失败 //if (addr.Length != 20) return new NNScredit(); //使用StorageMap,推荐的存储区使用方式 StorageMap addrCreditMap = Storage.CurrentContext.CreateMap("addrCreditMap"); byte[] creditData = addrCreditMap.Get(addr); NNScredit nnsCredit = new NNScredit(); //如果存储区没有这个地址的数据,返回空类 if (creditData.Length == 0) { return(new NNScredit()); } //有数据继续操作 //读取并反序列化为类,反序列化前必须先验证是否为null nnsCredit = (NNScredit)creditData.Deserialize(); //获取域名信息 OwnerInfo ownerInfo = getOwnerInfo(nnsCredit.namehash); //获取最新块时间 var lastBlockTime = Blockchain.GetHeader(Blockchain.GetHeight()).Timestamp; //如果NNS所有者变了,或者NNS过期了则不返回数据(即使有) if ((ownerInfo.owner != addr) || (lastBlockTime > ownerInfo.TTL)) { return(new NNScredit()); } return(nnsCredit); }
static NNScredit getCreditInfo(byte[] addr) { //addr不满足地址正常长度,返回失败 //if (addr.Length != 20) return new NNScredit(); //使用StorageMap,推荐的存储区使用方式 StorageMap addrCreditMap = Storage.CurrentContext.CreateMap("addrCreditMap"); byte[] creditData = addrCreditMap.Get(addr); NNScredit nnsCredit = new NNScredit(); //如果存储区没有这个地址的数据,返回空类 if (creditData.Length == 0) { //nnsCredit.namehash = new byte[0]; //nnsCredit.fullDomainName = ""; //nnsCredit.TTL = 0; return(new NNScredit()); } //有数据继续操作 //读取并反序列化为类,反序列化前必须先验证是否为null nnsCredit = (NNScredit)creditData.Deserialize(); //获取域名信息 OwnerInfo ownerInfo = getOwnerInfo(nnsCredit.namehash); //获取最新块时间 var lastBlockTime = Blockchain.GetHeader(Blockchain.GetHeight()).Timestamp; //如果NNS所有者变了,或者NNS过期了则不返回数据(即使有) if ((ownerInfo.owner != addr) || (lastBlockTime > ownerInfo.TTL)) { //为了能够不用发送交易也能正常运行,这里不能做删除操作(修改性操作) ////操作注销 //addrCreditMap.Delete(addr); ////通知注销 //onAddrCreditRevoke(addr); //返回空类 //nnsCredit.namehash = new byte[0]; //nnsCredit.fullDomainName = ""; //nnsCredit.TTL = 0; return(new NNScredit()); } return(nnsCredit); ////判断addr是否做过NNS登记 //if (creditData.namehash.Length > 0) //{ // ////默认返回完整域名名称 // //if (flag == new byte[] { 0 }) // // return creditData.fullDomainName.AsByteArray(); // //else if (flag == new byte[] { 1 }) // // return creditData.namehash; // //else if (flag == new byte[] { 2 }) // // return creditData.TTL.AsByteArray(); // //else // return creditData; //} //else //{ // return new NNScredit(); //} }