Waves智能资产:黑白名单,间隔交易

图片

在前两篇文章中,我们讨论了智能帐户以及如何将其用于进行拍卖和创建会员计划 ,还有助于确保金融工具的透明度

现在,我们将考虑智能资产及其应用的几种情况,包括冻结资产和对指定地址的交易进行限制。

Waves智能资产允许用户按照与智能帐户相同的机制在资产上覆盖脚本。 使用智能资产创建的每个新交易都将首先由脚本确认,然后才由区块链确认。

值得注意的是,智能资产和智能帐户之间存在以下差异:

  1. 不可能在智能资产代码中验证证明(我们在第一篇文章中已经讨论过 )。
  2. 在智能帐户的代码中,仅当您的帐户是匹配帐户时,才能检查ExchangeTransaction。 否则,仅检查订单。 您不能直接在智能资产代码中检查订单,可以检查ExchangeTransaction,并在必要时从中提取订单。
  3. 与智能帐户不同,智能资产没有状态,但是我们仍然可以从脚本访问帐户状态。

智能资产极大地简化了合同的编写,使许多案件的执行简洁明了。

资产冻结

要将资产冻结到特定的targetHeight高度 ,只需在以下智能资产的脚本中设置此值即可:

let targetHeight = 1500000 height >= targetHeight height -  ,   . 

特定匹配条件

要根据需要设置特定的匹配器,可以在以下形式的智能资产脚本中将其地址设置为发件人:

 match tx { case t : ExchangeTransaction => t.sender == addressFromString("3PJaDyprvekvPXPuAtxrapacuDJopgJRaU3") case _ => true } 

收件人白名单

若要仅将令牌发送到某些帐户(以创建收件人的“白名单”),可以将智能资产与以下方案一起使用,该方案检查其是否在列表中:

 match tx { case t : TransferTransaction => let trustedRecipient1 = addressFromString("3P6ms9EotRX8JwSrebeTXYVnzpsGCrKWLv4") let trustedRecipient2 = addressFromString("3PLZcCJyYQnfWfzhKXRA4rteCQC9J1ewf5K") let trustedRecipient3 = addressFromString("3PHrS6VNPRtUD8MHkfkmELavL8JnGtSq5sx") t.recipient == trustedRecipient1 || t.recipient == trustedRecipient2 || t.recipient == trustedRecipient3 case _ => false } 

为了安全性和可证明的语言一致性,该列表不包含迭代器实现。 因此,它被定义为一组特定元素。

黑名单收件人

以相同的方式,要禁止向特定帐户发送令牌,可以创建“黑名单”。 在这种情况下,将使用完全相同的智能资产,但会在黑名单中检查地址是否存在:

 match tx { case t : TransferTransaction => let bannedRecipient1 = addressFromString("3P6ms9EotRX8JwSrebeTXYVnzpsGCrKWLv4") let bannedRecipient2 = addressFromString("3PLZcCJyYQnfWfzhKXRA4rteCQC9J1ewf5K") let bannedRecipient3 = addressFromString("3PHrS6VNPRtUD8MHkfkmELavL8JnGtSq5sx") t.recipient != bannedRecipient1 && t.recipient != bannedRecipient2 && t.recipient != bannedRecipient3 case _ => false } 

经发行人许可发送

使用智能资产,您还可以设置仅在发行人许可(承诺/债务标签 )的情况下发送智能资产的选项。 发行人通过以其帐户样式放置交易ID表示同意:

 match tx { case t : TransferTransaction => let issuer = extract(addressFromString("3P6ms9EotRX8JwSrebeTXYVnzpsGCrKWLv4")) #,      ID   isDefined(getInteger(issuer, toBase58String(t.id))) case _ => false } 

仅兑换某些硬币

智能资产仅允许将其交换为某些硬币。 例如,要仅允许交换比特币,可以使用以下代码:

 let BTCId = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS' match tx { case t : ExchangeTransaction => t.sellOrder.assetPair.priceAsset == BTCId || t.sellOrder.assetPair.amountAsset == BTCId case _ => true } 

以甲骨文价格交易

在智能资产脚本中,您可以设置权限以仅以可靠的Oracle故事中确定的价格进行交易。 这是此类脚本的示例:

 let oracle = Address(base58'3PLNmokt22NrSiNvCLvwMUP84LCMJqbXwAD') let assetId = toBase58String(base58'oWgJN6YGZFtZrV8BWQ1PGktZikgg7jzGmtm16Ktyvjd') match tx { #   case t: TransferTransaction | MassTransferTransaction => false case e: ExchangeTransaction => #,     ,        let correctPrice = e.price == extract(getInteger(oracle, assetId)) #,       WAVES let correctPriceAsset = !isDefined(e.sellOrder.assetPair.priceAsset) correctPrice && correctPriceAsset case _ => true } 

在这里,当检查进行交易的资产的ID时,我们面临着一个显而易见的时刻。 事实是,如果未定义资产ID,那么我们所说的是WAVES。 在脚本中,我们确保以这种方式将交易与WAVES配对。

固定价格上涨

您可以为智能资产设置固定价格,该价格将按给定比例递增。 这是一个资产脚本示例,其价格每1000块增加5%:

 let startPrice = 10 let startHeight = 1000 let interval = 1000 #        let raise = 5 match tx { case t: TransferTransaction | MassTransferTransaction => false case e: ExchangeTransaction => e.price == startPrice + ((height - startHeight) / interval) * (100 + raise) / 100 && !isDefined(e.sellOrder.assetPair.priceAsset) case _ => true } 

间隔交易

同样,由于有了脚本,可以将智能资产的交易限制在预定的时间间隔内。 这是此类脚本的示例:

 let startHeight = 10000 let interval = 44000 let limit = 1500 match tx { case t: TransferTransaction | MassTransferTransaction | ExchangeTransaction => (height - startHeight) % interval < limit case _ => true } 

在脚本中,我们确保自开始交易startHeight以来不超过限制间隔。 间隔长度等于间隔字段中指定的块数。

Source: https://habr.com/ru/post/zh-CN444686/


All Articles