Em dois artigos anteriores, falamos sobre contas inteligentes e como elas podem ser usadas para realizar leilões e criar programas de fidelidade , além de ajudar a garantir a transparência dos instrumentos financeiros .
Agora, consideraremos ativos inteligentes e vários casos de sua aplicação, incluindo o congelamento de ativos e a criação de restrições nas transações em endereços especificados.O Waves Smart Assets permite que os usuários sobreponham scripts nos ativos, seguindo a mesma mecânica das contas inteligentes. Cada nova transação criada usando o ativo inteligente será confirmada primeiro pelo script e somente depois pelo blockchain.
Vale a pena observar as seguintes diferenças entre ativos inteligentes e contas inteligentes:
- É impossível verificar as provas no código do ativo inteligente (falamos sobre elas no primeiro artigo ).
- No código da conta inteligente, você pode verificar ExchangeTransaction apenas se sua conta for uma conta correspondente. Caso contrário, apenas o pedido será verificado. Você não pode verificar o pedido diretamente no código do ativo inteligente, pode verificar o ExchangeTransaction e, se necessário, extrair o pedido dele.
- Um ativo inteligente, diferentemente de uma conta inteligente, não possui um estado, mas ainda temos acesso aos estados da conta a partir do script.
Os ativos inteligentes simplificam bastante a redação de contratos, tornando a implementação de muitos casos concisa e elegante.
Congelamento de ativosPara congelar ativos para uma determinada
altura do bloco
targetHeight , você pode simplesmente definir esse valor no script do seguinte ativo inteligente:
let targetHeight = 1500000 height >= targetHeight height - , .
Condição específica do MatcherPara definir uma correspondência específica conforme desejado, você pode definir seu endereço como remetente no script de ativo inteligente do seguinte formulário:
match tx { case t : ExchangeTransaction => t.sender == addressFromString("3PJaDyprvekvPXPuAtxrapacuDJopgJRaU3") case _ => true }
Lista branca de destinatáriosPara permitir que os tokens sejam enviados apenas para determinadas contas - para criar uma "lista branca" de destinatários - você pode usar um ativo inteligente com o seguinte esquema, que verifica a entrada na lista:
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 }
Para segurança e consistência de idioma comprovável, a lista não contém uma implementação de iterador. Portanto, é definido como um conjunto de elementos específicos.
Destinatários da lista negraDa mesma forma, para proibir o envio de tokens para determinadas contas, você pode criar uma "lista negra". Nesse caso, o exato mesmo ativo inteligente é usado, mas com o endereço marcado para ausência na lista negra:
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 }
Envio com permissão do emissorUsando um ativo inteligente, você também pode definir a opção de enviar um ativo inteligente apenas com a permissão do emissor
(etiqueta de compromisso / dívida ). O emissor expressa seu consentimento colocando o ID da transação no estilo de sua conta:
match tx { case t : TransferTransaction => let issuer = extract(addressFromString("3P6ms9EotRX8JwSrebeTXYVnzpsGCrKWLv4")) #, ID isDefined(getInteger(issuer, toBase58String(t.id))) case _ => false }
Troque apenas por determinadas moedasUm ativo inteligente permite permissão para trocá-lo apenas por determinadas moedas. Por exemplo, para permitir a troca apenas de bitcoins, você pode usar o seguinte código:
let BTCId = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS' match tx { case t : ExchangeTransaction => t.sellOrder.assetPair.priceAsset == BTCId || t.sellOrder.assetPair.amountAsset == BTCId case _ => true }
Negocie a preço de oracleNo script de ativo inteligente, você pode definir permissão para negociar apenas pelo preço fixado na história do oracle confiável. Aqui está um exemplo desse script:
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 }
Aqui estamos diante de um momento não óbvio ao verificar o ID do ativo com o qual a negociação é realizada. O fato é que, se o ID do ativo não estiver definido, estaremos falando sobre WAVES. No script, garantimos que a negociação seja emparelhada com WAVES, dessa maneira.
Aumento de preço fixoVocê pode definir um preço fixo para um ativo inteligente, que aumentará gradualmente em uma determinada proporção. Aqui está um exemplo de script de ativo, cujo preço aumentará em 5% a cada 1.000 blocos:
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 }
Intervalo de negociaçãoAlém disso, graças ao script, a negociação de ativos inteligentes pode ser limitada a intervalos predeterminados. Aqui está um exemplo desse script:
let startHeight = 10000 let interval = 44000 let limit = 1500 match tx { case t: TransferTransaction | MassTransferTransaction | ExchangeTransaction => (height - startHeight) % interval < limit case _ => true }
No script,
garantimos que não passem mais de intervalos
limite desde o início da negociação
startHeight . O comprimento do intervalo é igual ao número de blocos especificado no campo de
intervalo .