在上一篇文章中,我们研究了在业务中使用智能帐户的几种情况-包括拍卖和会员计划。
今天,我们将讨论智能帐户和智能资产如何提高期权,期货和票据等金融工具的透明度和可靠性。
选件期权是一种交换合同,授予买方以一定价格或在特定日期之前购买资产的权利,但并不强迫他这样做。
该选择权的执行可能如下:
我们将期权本身的智能资产用作工具,并为参与交易所和发行期权的参与者使用智能账户。 交易所参与者承诺将以expirationStart和expirationEnd块的高度之间的价格sellPrice出售一定数量的某些资产。
在智能资产的代码中,我们只需验证它仅在指定的高度之间进行交易,我们就不会进行其他检查,我们将遵守规则的全部责任留给交易所参与者的代码。
智能资产代码:let expirationStart = 100000 let expirationEnd = 101440 match tx { case some : ExchangeTransaction | TransferTransaction => height > expirationStart && height <= expirationEnd case _ => false }
我们假设这些操作如下:交换成员出售用于购买某些资产的期权,其余参与者可以转让这些期权或进行交易。 为了行使其购买权,潜在的买方必须将所需数量的期权转移到卖方的帐户,即交易所参与者。 然后,他写下有关已完成的转移到交换成员帐户状态的信息,然后ExchangeTransaction才能够通过指定的买卖条件。
在智能帐户的代码中,我们必须确保为最终的购买和销售行为通过它的任何ExchangeTransaction都符合指定的条件,并且参与者正确购买了他发送给交易所参与者帐户的单位数量。 潜在的购买者必须发送有关发生的转移的正确的DataTransaction,以便交换成员可以避免重复支出。 在此DataTransaction中,购买者将等于其地址的键放在一个值上,该值等于转移到交换成员帐户中的期权数量,即他可以购买的资产单位数量。智能帐户代码: # # sellPrice expirationStart expirationEnd let expirationStart = 100000 let expirationEnd = 101440 let sellPrice = 10000 let amountAsset = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf' let priceAsset = base58'9jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf' #ID - let optionsAsset = base58'7jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf' # let this = extract(tx.sender) match tx { case dataTx : DataTransaction => # - (ID ) let units = extract(getInteger(dataTx.data, dataTx.data[0].key)) # - let e = transactionById(dataTx.proofs[2]) # match e { case transferTx : TransferTransaction => #, (transferTx.recipient == this) && #, ID dataTx.data[0].key == toBase58String(transferTx.sender.bytes) && sigVerify(dataTx.bodyBytes, dataTx.proofs[0], transferTx.senderPublicKey) && #, (units == transferTx.amount) && #, - (transferTx.assetId == optionsAsset) case _ => false } && size(dataTx.data) == 1 && !isDefined(getInteger(this, dataTx.data[0].key)) && height > expirationStart && height <= expirationEnd case order : Order => #, let correctAssetPair = order.assetPair.amountAsset == amountAsset && order.assetPair.priceAsset == priceAsset let correctPrice = order.price == sellPrice # - let d = transactionById(order.proofs[2]) match d{ case dataTx : DataTransaction => let buyOrderSender = dataTx.data[0].key toBase58String(order.sender.bytes) == buyOrderSender && order.amount == extract(getInteger(dataTx.data, buyOrderSender)) case _ => false } && order.sender == this && correctAssetPair && correctPrice && height > expirationStart && height <= expirationEnd case _ => false }
智能账户期货与期权不同,期货(期货合约)不是权利,而是购买者的义务,即在将来的某个时候以固定价格购买资产。
一般而言,期货的执行类似于期权的执行。 在这里,智能资产充当期货。
您还必须确保买卖双方都签署了采购订单。 在任何情况下,期货都是必须履行的义务。 这意味着,如果卖方或参与者拒绝履行其义务,则任何网络参与者都可以发送交易,从而执行期货。
智能资产脚本控制所有TransferTransaction和ExchangeTransaction资产期货,仅在购买会员为将来从Exchange会员购买资产期货创建订单时才批准它们。
该订单必须有效并且满足发行期货的条件。 要检查订单,您可以将其所有字段以及已签名订单的字节表示形式输入购买者帐户的状态,然后从外部进行验证。
目前,RIDE不包含用于解析事务字节的本机函数,但包括其实现所需的所有工具。 因此,开发人员可以尝试自己实现此功能。
多签名帐户/托管具有多重签名的帐户允许多个用户共同管理资产(例如,只有四分之三的用户具有签名,才能进行资产交易)。 要使用RIDE语言创建具有多重签名的帐户,我们可以使用交易证明。
具有多重签名的帐户也可以用于托管帐户,在托管帐户中存储金钱,直到协议各方履行其义务为止。
let alicePubKey = base58'5AzfA9UfpWVYiwFwvdr77k6LWupSTGLb14b24oVdEpMM' let bobPubKey = base58'2KwU4vzdgPmKyf7q354H9kSyX9NZjNiq4qbnH2wi2VDF' let cooperPubKey = base58'GbrUeGaBfmyFJjSQb9Z8uTCej5GzjXfRDVGJGrmgt5cD' #, let aliceSigned = if(sigVerify(tx.bodyBytes, tx.proofs[0], alicePubKey)) then 1 else 0 let bobSigned = if(sigVerify(tx.bodyBytes, tx.proofs[1], bobPubKey)) then 1 else 0 let cooperSigned = if(sigVerify(tx.bodyBytes, tx.proofs[2], cooperPubKey)) then 1 else 0 # aliceSigned + bobSigned + cooperSigned >= 2
令牌管理的注册表(TCR)在许多区块链平台上,存在有毒资产问题。 例如,任何支付佣金的地址都可以在Waves上创建资产。
令牌持有者生成的令牌管理注册表(TCR)帮助解决保护用户和区块链免受有毒资产侵害的问题。
为了投票赞成将特定令牌添加到列表中,持有者下注等于其在已发行总数中所占令牌的份额。 如果令牌的大多数持有者投票赞成,则将其包括在注册表中。
在我们的示例中,仅当当前值为count = 0时,我们才允许用户通过key = asset_name状态的键将令牌添加到列表中以供考虑(在“挑战”期间)。
此外,钱包中的用户必须拥有该令牌的非零余额。 然后是投票期,在此期间,用户可以对其钱包中的每种资产进行投票,但只能进行一次投票,评分从1到10。用户的声音由user_address + assetID形式的键表示。
let asset = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf' let addingStartHeight = 1000 let votingStartHeight = 2000 let votingEndHeight = 3000 let this = extract(tx.sender) # let address = addressFromPublicKey(tx.proofs[1]) match tx { case t: DataTransaction => if(height > addingStartHeight) then( if(height < votingStartHeight) then( #adding #, let hasTokens = assetBalance(address, asset) > 0 size(t.data) == 1 #, && !isDefined(getInteger(this, toBase58String(asset))) #, - 0 && extract(getInteger(t.data, toBase58String(asset))) == 0 && hasTokens ) else( if(height < votingEndHeight) then ( #voting # let currentAmount = extract(getInteger(this, toBase58String(asset))) let newAmount = extract(getInteger(t.data, toBase58String(asset))) let betString = toBase58String(address.bytes) + toBase58String(asset) #, let noBetBefore = !isDefined(getInteger(this, betString)) let isBetCorrect = extract(getInteger(t.data, betString)) > 0 && extract(getInteger(t.data, betString)) <= 10 #, let hasTokens = assetBalance(address, asset) > 0 # size(t.data) == 2 && isDefined(getInteger(this, toBase58String(asset))) && newAmount == currentAmount + 1 && noBetBefore && isBetCorrect && hasTokens ) else false ) && sigVerify(tx.bodyBytes, tx.proofs[0], tx.proofs[1]) ) else false case _ => false }
认购费在此示例中,我们将考虑使用智能帐户以预定的时间间隔定期为产品或服务付款-“月费”。
如果用户通过交易证明为智能帐户(通过交易证明)提供了所需的转账金额,则他可以将{key:address,value:
true }写入帐户状态。
这将意味着用户确认对产品或服务的订阅。 订阅到期后,任何网络用户都可以将状态中的相应密钥设置为
false 。
let subscriptionPeriod = 44000 let signature = tx.proofs[0] let pk = tx.proofs[1] let requiredAmount = 100000 let this = extract(tx.sender) match tx { case d: DataTransaction => # let lastPaymentHeight = extract(getInteger(this, d.data[0].key + "_lastPayment")) size(d.data) == 1 && d.data[0].value == "false" && lastPaymentHeight + subscriptionPeriod < height || ( let address = d.data[0].key # - ID, let ttx = transactionById(d.proofs[0]) size(d.data) == 2 && d.data[0].value == "true" && d.data[1].key == address + "_lastPayment" && match ttx { case purchase : TransferTransaction => d.data[1].value == transactionHeightById(purchase.id) && toBase58String(purchase.sender.bytes) == address && purchase.amount == requiredAmount && purchase.recipient == this #, waves && !isDefined(purchase.assetId) case _ => false } ) case _ => false }
投票智能账户可用于在区块链上实施投票。 例如,在大使计划的框架内投票选出最佳大使报告。 帐户状态用作记录一个或另一个选项的投票的平台。
在此示例中,只允许购买特殊“投票”令牌的人进行投票。 参与者预先发送带有一对(key,value)=(purchaseTransactionId,buyTransactionId)的DataTransaction。 禁止为此键设置其他值。 使用地址和投票选项,您只能安装DataEntry一次。 只有在规定的期间内才可以投票。
let asset = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf' let address = addressFromPublicKey(tx.proofs[1]) let votingStartHeight = 2000 let votingEndHeight = 3000 let this = extract(tx.sender) match tx { case t: DataTransaction => (height > votingStartHeight && height < votingEndHeight) && #, sigVerify(tx.bodyBytes, tx.proofs[0], tx.proofs[1]) && #, if (t.data[0].key == toBase58String(address.bytes)) then ( # let purchaseTx = transactionById(t.proofs[7]) match purchaseTx { case purchase : TransferTransaction => let correctSender = purchase.sender == t.sender let correctAsset = purchase.assetId == asset let correctPrice = purchase.amount == 1 let correctProof = extract(getBinary(this, toBase58String(purchase.id))) == t.id correctSender && correctAsset && correctPrice && correctProof case _ => false } ) else size(t.data) == 1 && !isDefined(getBinary(this, t.data[0].key)) case _ => false }
汇票汇票是一项书面义务,根据该义务,一方必须在提出请求时或在预定日期向另一方支付固定金额。
在我们的示例中,使用了一个智能帐户,该帐户的到期日期与账单的付款日期相对应。
let expiration = 100000 let amount = 10 let asset = base58'9jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf' let Bob = Address(base58'3NBVqYXrapgJP9atQccdBPAgJPwHDKkh6A8') let Alice = Address(base58'3PNX6XwMeEXaaP1rf5MCk8weYeF7z2vJZBg') match tx { case t: TransferTransaction => (t.assetId == asset)&& (t.amount == amount)&& (t.sender == Bob)&& (t.recipient == Alice)&& (sigVerify(t.bodyBytes, t.proofs[0], t.senderPublicKey))&& (height >= expiration) case _ => false }
入金存款-在某些条件下(期限,百分比)将资金存入银行。
在我们的示例中,智能帐户执行银行的功能。 在一定数量的区块(对应于存款的期限)之后,用户可以按一定百分比返还他的钱。 该脚本设置块的高度(finalHeight),之后用户可以从帐户中提取资金。
heightUnit-一个时间单位(例如,月,年等)中的块数。 首先,我们检查是否有一对(键,值)=(initialTransferTransaction,futureDataTransaction)的条目。 然后,用户必须向TransferTransaction发送有关存款金额和存款期间应计利息的正确信息。 将根据当前TransferTransaction证明中包含的原始TransferTransaction检查此信息。 depositDivisor是与存款份额成反比的数字(如果接受存款的比例为10%,则存款份额为0.1,而depositDevisor = 1 / 0.1 = 10)。
let depositDivisor = 10 let heightUnit = 1000 let finalHeight = 100000 let this = extract(tx.sender) match tx { case e : TransferTransaction => # ID let depositHeight = extract(transactionHeightById(e.proofs[7])) # let purchaseTx = transactionById(e.proofs[7]) match purchaseTx { case deposit : TransferTransaction => let correctSender = deposit.sender == e.sender #, + let correctAmount = deposit.amount + deposit.amount / depositDivisor * (height - depositHeight) / heightUnit == e.amount let correctProof = extract(getBinary(this, toBase58String(deposit.id))) == e.id correctSender && correctProof && correctAmount case _ => false } && finalHeight <= height case _ => sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) }
在本系列的第三篇也是最后一篇文章中,我们将介绍使用智能资产的更多选项,包括冻结和限制特定地址的交易。