
以前の2つの記事では、スマートアカウントと、それらを使用してオークションを実施し、ロイヤルティプログラムを作成し 、金融商品の透明性を確保する方法について説明しました。
ここで、スマートアセットと、アプリケーションのいくつかのケースを検討します。これには、アセットの凍結や指定アドレスでのトランザクションの制限の作成が含まれます。
Waves Smart Assetsを使用すると、ユーザーはスマートアカウントの場合と同じ仕組みに従って、スクリプトをアセットにオーバーレイできます。 スマートアセットを使用して作成された各新しいトランザクションは、最初にスクリプトによって確認され、次にブロックチェーンによって確認されます。
スマートアセットとスマートアカウントの以下の違いに注目する価値があります。
- スマートアセットコードで証明を検証することはできません(それらについては最初の記事で説明しました )。
- スマートアカウントコードでは、アカウントが一致アカウントの場合にのみExchangeTransactionを確認できます。 それ以外の場合、順序のみがチェックされます。 スマートアセットコードで注文を直接確認することはできません。ExchangeTransactionを確認し、必要に応じて注文を抽出できます。
- スマートアカウントとは異なり、スマートアセットには状態はありませんが、スクリプトからアカウントの状態にアクセスできます。
スマートアセットは契約書の作成を大幅に簡素化し、多くのケースの実装を簡潔かつエレガントにします。
資産凍結
特定の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 }
オラクル価格で取引
スマートアセットスクリプトでは、信頼できるオラクルのストーリーで定められた価格でのみ取引する許可を設定できます。 そのようなスクリプトの例を次に示します。
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取引の開始以降、 制限間隔を超えていないことを確認します。 間隔の長さは、 間隔フィールドで指定されたブロックの数に等しくなります。