//存储一口价销售信息
        private static void saveFixedSellingInfo(string[] domainArray, byte[] seller, BigInteger price)
        {
            byte[] namehash = getFullNamehashForArray(domainArray);

            fixedSellingInfo fixedSellingInfo = new fixedSellingInfo();

            fixedSellingInfo.fullHash   = namehash;
            fixedSellingInfo.fullDomain = getFullStrForArray(domainArray);
            fixedSellingInfo.seller     = seller;
            fixedSellingInfo.price      = price;
            //fixedSellingInfo.TTL = TTL;

            StorageMap fixedSellingInfoMap = Storage.CurrentContext.CreateMap("fixedSellingInfoMap");

            fixedSellingInfoMap.Put(namehash, fixedSellingInfo.Serialize());

            //通知
            onLaunched(fixedSellingInfo);
        }
        //下架
        public static object Discontinue(byte[] fullHash)
        {
            StorageMap       fixedSellingInfoMap = Storage.CurrentContext.CreateMap("fixedSellingInfoMap");
            fixedSellingInfo FSI = getfixedSellingInfoByFullhash(fullHash);

            //无出售信息不能下架
            if (FSI.fullHash.Length == 0)
            {
                return(false);
            }
            //非出售者或超级管理员不可以下架
            if (!Runtime.CheckWitness(FSI.seller) && !Runtime.CheckWitness(superAdmin))
            {
                return(false);
            }

            //var price = FSI.price;
            //var seller = FSI.seller;
            //if (FSI.price == 0)
            //    return false;

            //将域名所有权转回出售者(域名所有权:DEX合约=>卖家)
            var result = (byte[])centerCall("owner_SetOwner", new object[3] {
                ExecutionEngine.ExecutingScriptHash, fullHash, FSI.seller
            });

            if (result.AsBigInteger() != 1)
            {
                return(false);
            }
            //清除出售信息
            fixedSellingInfoMap.Delete(fullHash);
            //通知
            onDiscontinued(FSI);

            return(true);
        }
        public static object Buy(byte[] buyer, byte[] fullHash)
        {
            //只能用本人的钱购买
            if (!Runtime.CheckWitness(buyer))
            {
                return(false);
            }

            //先获取这个域名的信息
            OwnerInfo ownerInfo = GetOwnerInfo(fullHash);

            //域名没有初始化不能买
            if (ownerInfo.owner.Length == 0)
            {
                return(false);
            }
            //域名已经到期了不能购买
            if (!verifyExpires(ownerInfo.TTL))
            {
                return(false);
            }

            //获取出售信息
            fixedSellingInfo FSI = getfixedSellingInfoByFullhash(fullHash);

            //无出售信息不能买
            if (FSI.fullHash.Length == 0)
            {
                return(false);
            }

            var seller = FSI.seller;

            //不允许自己买自己的NNS
            if (seller.AsBigInteger() == buyer.AsBigInteger())
            {
                return(false);
            }

            var price = FSI.price;

            StorageMap balanceMap     = Storage.CurrentContext.CreateMap("balanceMap");
            var        balanceOfBuyer = balanceMap.Get(buyer).AsBigInteger();

            //钱不够不能买
            if (balanceOfBuyer < price)
            {
                return(false);
            }

            //进行域名的转让操作(域名所有权:DEX合约=>买家)
            var result = (byte[])centerCall("owner_SetOwner", new object[3] {
                ExecutionEngine.ExecutingScriptHash, FSI.fullHash, buyer
            });

            if (result.AsBigInteger() != 1) //如果域名所有权转移失败,返回失败
            {
                return(false);
            }

            /*
             * 域名转让成功 开始算钱
             */

            var balanceOfSeller = balanceMap.Get(seller).AsBigInteger();

            //给卖方增加钱
            balanceMap.Put(seller, balanceOfSeller + price);
            //给买方减少钱
            if (balanceOfBuyer == price)//如果交易金额是全部余额,则清除账户
            {
                balanceMap.Delete(buyer);
            }
            else
            {
                balanceMap.Put(buyer, balanceOfBuyer - price);
            }

            //完成 把售卖信息删除
            StorageMap fixedSellingInfoMap = Storage.CurrentContext.CreateMap("fixedSellingInfoMap");

            fixedSellingInfoMap.Delete(fullHash);

            //通知
            onBuy(buyer, FSI);

            return(true);
        }