Waves智能资产:黑白名单、区间交易

Waves智能资产:黑白名单、区间交易

在前两篇文章中,我们讨论了智能账户及其使用方法 用于举行拍卖和创建忠诚度计划也有帮助 确保金融工具的透明度.

现在我们将研究智能资产及其使用的几种案例,包括冻结资产和对指定地址的交易设置限制。

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

值得注意的是,智能资产和智能账户之间存在以下区别:

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

智能资产极大简化了合约的编写,使得很多案例的实现变得简洁优雅。

资产冻结

将资产冻结到一定的区块高度 目标高度,您可以简单地在以下智能资产的脚本中设置该值:

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
}

根据预言机的价格进行交易

在智能资产脚本中,您可以设置只允许以可靠预言机状态下固定的价格进行交易。 以下是此类脚本的示例:

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 同步进行,正是以这种方式。

固定价格上涨

您可以为智能资产设置固定价格,该价格将按照给定比例逐步上涨。 下面是一个资产脚本的示例,其价格每 5 个区块就会上涨 1000%:

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
}

在脚本中,我们确保从交易一开始 起始高度 不多于 限制 间隔。 间隔的长度等于字段中指定的块数 间隔.

来源: habr.com

添加评论