ืืืคืชื ืืจืืกืืืฃ ืืจืื ืืืืจ ืขื ืืงืืจืก ืืืงืืื '
ืชืกืคืจ ืื ื ืงืฆืช ืขื ืขืฆืื. ืื ืขื ืืื ืืืชื ืืงืืจืก ืืื?
ืื ื ืขืืกืง ืืคืืชืื ืืชืจืื ื-15 ืฉื ื, ืืขืืงืจ ืืคืจืืื ืกืจ.
ืชืื ืืื ืคืืชืื ืืคืืืงืฆืืืช ืืื ืืจื ื ืืจืืฉืื ืืจืื ืืืื ืืืืื ืืช ืืชืคืชืืืช ืขืืืจ ืงืืืฆื ืื ืงืืืช, ืขืืื ืืคื ืื ืืืฉืืื ืืฉืื ืืชืืื ืืืฉืืจื ืืืืงืฆ'ืืื. ืืืืชื ืืื, ืื ืืืขืชื ืืจืื ืขื ืืกืืืช ืืืืงืฆ'ืืื, ืืืจืืช ืฉืืืจ ืืชืขื ืืื ืชื ืืืื ืืืืืืืช ืงืจืืคืื, ืืขืืงืจ ืืืฉืงืืข.
ืืชืืฆืื ืืื, ืคืื ืงืฆืื ืื ืื ืืืฉืื, ืื ืืชืื ืืืฉืื ืฉืืจืืื ืื ืืื ืงืื ืืขืื ืืื ืื ืืคืชืจืื ืืื ืขืืืจ ืืืคืืืงืฆืืืช ืฉืืื, ืืชืืืชื ืืืืื ืืช ืื ืืฉื ืืขื ืืืจื ืคืชืืชื ืืช ืืคืจืืืงื
ืคืืชืืชื ืืจืกืช ืืื ืฉืื, ืฉืืืจ ืืืื ื ืืจืฉืช. ืืืืชื ืชืงืืคื, ืื ืืื Ride [ืฉืคืช ืืชืื ืืช ืฉื Waves] ืื ืขืฉืืชื ืืื ืืฆืืจื ืืคืฉืืื ืืืืชืจ, ืชืื ืฉืืืืฉ ืืืจื ืืงืฆืืืช ืชืจืืื ืขื JSON ืืงืื ื ืืช. ืืื ืืืืจื ืืขืืงืจืืช ืืืืชื ืืืืกืืฃ ืคืื ืงืฆืืื ืืืืช ืืชืงืืืช ืืืชืจ ืืืืจ ืืฉืงืช Ride. ืืื ืืกืืื ืืขืืงืจืืช ืฉืืืืื ืืฆืืจืคืชื ืืงืืจืก: ืืฉืื ืืื ืืคืืชืื ืืคืจืืืงื ืืื ืืฆืืจืช ืืคืืืงืฆืื ืืืืืจืช (dApp).
ืืืื ืืืืืื ืืงืืจืก ืืฆืืชื ืืื ืงืืื ืืืืื ืืื ืืื ืืืชืืจืื?
ืืืืจ ืืคืฉืื ืืืืชืจ ืืื ืฉืืื ืื ื ืืกืคืืง ืืื ืืื ืืืฉืืืืช. ืืืจืช ืืงืืจืก ืืื ืืืืื ืืฉืื, ืืื ืืืชืืจืืช ืืื ืืฉื ื. ืืืกืืจืื ืืื ืืืื ื ืืืฉืื ืืืืืืจืื ืืื ืคืฉืืืื ืื ืืงืืคืื. ืื ืขืืจ ืืืืืืฉ ืืืืืื ื ืืฉืืื ืฉืื ืื.
ืืขืช ืืฉืืืช ืืืืืช, ืขืืืื ืืืชื ื ืืืฉืื ืืืืคื ืขืฆืืื ืืืคืขืืื ืืืืื ืืฉืื ืืขืฆืื ื. ืื ืืืจื ืืืืื ืืืืชืจ ืืืืื ืืืืืื ืืช ืืจืขืืื ืืช ืฉื ืืืื ืืืืชื.
ืืื ืคืขืืื ืื ืืื ืชื ืขื ืืกืืฃ ืืช ืืืืง ืืชืืืืจืื ืขื ืฉืืชืืืชื ืืืชืื ืงืื ืชืื ืืื ืืฉืืื. ืื ื ืชื ื ืื ื ืืขืฉืืช 'ืืขืชืง/ืืืืง', ืืืื ื ืฆืจืืืื ืืืชืื ืืช ืื ืืงืื ืืขืฆืื ื, ืืื ืื ืขืืจ ืื ื ืืืืื ืืื ืืื ืืืชืจ.
ืืืืจ ืืงืฉื ืืืืชืจ ืืื ืฉืืฉืืืืช ืืืฉืืื ืืจืืืช ืืืจืืจื ืื ืชืืื ืืื ืืจืืจืืช. ืืื ืืืืช ืฉืื ืื ืืืฉืืืช, ืืืฉืืืืช ื ืืชืื ืขื ืืื ืืืืจ ืฉืืื ื ืฉืคืช ืื, ืื ืืคืขืืื ืืื ืื ืืื ืืช.
ืืืื ืืืืง ืฉื ืืงืืจืก ืืืืงืืฉ ืืืืจืงืืื ื-NFTs ืืืื ืืืืืช ืืคืืจื ืืืชืจ. ืืื, ืืื ืืงืจื, ืืืืจื ืืขืืงืจืืช ืฉื ืืงืืจืก ืืื ืืขื ืืื ืืคืชืืื. ืืืืจ ืืื, ืขื ืื ืช ืืืืื ืืืื ืืช ืื ืืืืืืื ืฉืื, ืชืฆืืจื, ืืืืื, ืืืงืืืฉ ืืื ืื ืืกืืืื ืืชืจืืื.
ืกืคืจ ืื ื ืขืื ืขื ืืคืชืจืื ืขืืื ืขืืืช ืืืืจื ืืงืืจืก - 'ืืืืจ ืงืืคืื ืื'? ืืื ืื ื ืืืื ืืจืืืช ืื ืืื ืืืืืืืช ืงืื?
ืื, ืขืืื ื ืขื 'ืฉืืง ืืงืืคืื ืื', ืื ืฉืืง ืฉืื ืื ืฉืื ืืืืจืื ืืงืื ืื ืงืืคืื ืื ืฉื ืืชื ืื ืืื ืืช ืืืืืช ืืงื ืืช ืกืืืจืืช ืืฉืืจืืชืื ืืืืืจ ื ืืื ืืืชืจ. ืื ืงืืคืื ืืืืฆื ืขื ืืื ื ืืก ืืืืืืื ืืืฆืืข ืื ืื ืืืืืืช ืืืกืคืง.
ื ืืจืฉื ืืคืชื ืืกืคืจ ืจืืืื ืืืฉืื. ืจืืฉืืช, ืืื ืฆืืจื ืืืฆืืจ ืืขืจืืช ืืจืืฉืื ืกืคืงืื ืื ืืืื ืงืืคืื ืื. ืื ืืืื ื ืฆืจืืืื ืคืื ืงืฆืืืช ืืืืืช ืืืืืืช ืืืฉืชืืฉืื ืืืคืฉ ืงืืคืื ืื.
ืืืืื ืืงืืจืก ืืืกืคื ื ืื ืืื ืคืืฆ'ืจืื ืืืฉืื, ืืืื ืืขืจืืช ืืฆืืขื ืืคืืฆ'ืจ ืืืืคืฉืจ ืื ืืืืช ืกืคืงืื ืืืจืฉืื ืฉืืืจืื.
ืจืืฉืืช, ืืืื ื ืืช ืืืืื ืืื ื ืืกืื ืืืืื, ืืฉืืื ืืช ืืืืื ืืืฉืืื ืืช dApp ืืืช ืืืกืืืืช ืฉื ืขืืืื ืขื ืคืื ืงืฆืืืช ืืืืช. ืคืื ืงืฆืืืช ืืืืืช ืืืคืฉืจืืช ืื ืืฉื ืืช ืืช ืืชื ืืืืช ืืจืืจืช ืืืืื ืฉื ืืฉืืื ื. ืืืจืืจืช ืืืื ืื ืืืืชืื ืืชืืืืช ืขืกืงืืืช, ืืื ืชืืื ืช ืืืืืช ืืืคืฉืจืช ืื ืืืืืืจ "ืืืืื" ืืืจืื.
{-# STDLIB_VERSION 3 #-}
{-# CONTENT_TYPE DAPP #-}
{-# SCRIPT_TYPE ACCOUNT #-}
letownerPublicKey = base58'H8ndsHjBha6oJBQQx33zqbP5wi8sQP7hwgjzWUv3q95M'
@Verifier(tx)
funcverify() = {
matchtx {
cases: SetScriptTransaction=>sigVerify(tx.bodyBytes, tx.proofs[0], ownerPublicKey)
cased: DataTransaction=>true
case_ =>false
}
}
ืืื ืืชืืื ื ืืืืกืืฃ ืงืืคืื ืื. ืืฉืชืืฉื ื ืืืืช ืืคืื ืงืฆืืืช ืืืฉืืืืช ืืืืชืจ ืฉื ื-dApp, ืืืืคืฉืจืช ืืืงืืื ื ืชืื ืื ืืื ืกืื ืืืืืงืฆ'ืืื ืืฆืืจื ืฉื ืฆืืื ืืคืชื-ืขืจื - ืขืกืงืช ื ืชืื ืื. ืฉืืืื ื ืืช ืื ืขื ืืจื ืืงืฆืื ืืืฉื, invokeScript, ืืืฉืืฉืช ืืงืจืืื ืืคืื ืงืฆืื ืื ืืชื ืช ืืืชืงืฉืจืืช ื-dApp ืืืืฅ ืืืืืงืฆ'ืืื.
ืกืื ืขืกืงืช ืื ืชืื ืื ืฉืื ืืฉืชืืฉื ื ืืืืื ืืงืืจืก ืืื ืืืกืคืช ืงืืคืื ืื ืืฉืืง:
letdatajson = {
"title": "t-shirt with , vote 1",
"coupon_price": 10000000,
"old_price": 1000000000,
"new_price": 100000000,
"address": "Universe",
"description": "I want you to make love, not war, i know you've heard it before",
"image": "https://bit.ly/2EXTghg"
}
it('add item', asyncfunction(){
letts = invokeScript({
dApp: dappAddress,
call:{
function:"addItem",
args:[
{ type:"string", value: datajson.title },
{ type:"integer", value: datajson.coupon_price },
{ type:"string", value: JSON.stringify(datajson) }
]},
payment: []
}, accountSupplierSeed)
lettx = awaitbroadcast(ts)
awaitwaitForTx(tx.id)
})
ืืื ืืขืื ืืช ืื ืชืื ืื ืืืื ืขื ืืคืื ืงืฆืื addItem ืืืคืชื ืืช ืคืื ืงืฆืืืช ืืจืืืฉื ืืืคืฉืจืืืืช ื ืืกืคืืช, ืืฉืชืืฉื ื ืืคืื ืงืฆืื ืื ืืชื ืช ืืืชืงืฉืจืืช ืฉืืืฉืชืืฉ ืืืื ืืืชืงืฉืจ ืืืื ืืืืฅ ืืืืืงืฆ'ืืื. ืืชืืฆืื ืืื, ืืื ืืืื ืืืฆืข ืืฉืืืืช ืฉืื ืืช, ืืืื ืืืืื ืืขืืจืช ืืกืคืื, ืืชืืื ืื ืขืืืื ื ืชืื ืื ืืืืืจ ืื ืชืื ืื ืฉื dApp ืืื'.
ืื ื ืืืืื ืืคืื ืงืฆืื ืฉื ืงืจืืช ืืฉืืืืฉ ืืคืื ืงืฆืื addItem:
@Callable(i)
funcaddItem(title: String, price: Int, data: String) = {
letsupplierAddress = toBase58String(i.caller.bytes)
letitem = getKeyItem(supplierAddress, title)
if( price <= 0) thenthrow("purchase amount cannot be less than item price")
elseif( getValueItemSupplier(item) !=NONE ) thenthrow("an item is already exist")
else{
WriteSet([
DataEntry(getKeyItemSupplier(item), supplierAddress),
DataEntry(getKeyItemPrice(item), price),
DataEntry(getKeyItemData(item), data)
])
}
}
ืืืืืจ ืืืชืจ ืคืืชืื ื ืืขืจืืช ืืฆืืขื ืืืืคืฉืจืช ืื ืืืฆืืืข ืืงืืืื ืื ืืกืจื ืฉื ืืืฆืจืื ืืกืืืืื. ืืื ืืื ืืข ืืฉืคืขื ืืืฆืื ืืช ืขื ืชืืืื ืืืฆืืขื, ืืื ืืฉืชืืฉืช ืืชืืื ืืช 'ืืชืืืืืืช-ืืฉืืคื'.
ืฉืื "ืืชืืืืืืช" ืืฉืืฉ ืืืืกืืฃ ืืืฆืืขืืช ืืืืฆืคื ืืช ืืืืฆืขืืช ืคืื ืงืฆืืืช hash ื"ืืื".
ืฉืื ื"ืืฉืืคื" ืืฉืืฉ ืืืืกืืฃ ืืฆืืขืืช ืืืฆืคื ืืช ืืืืฉืืืืช ืืืืืืืื ืฉืืื.
ืื ื ืืืืื ืืคืื ืงืฆืื ืฉื ืงืจืืช ืืืฉืืฉืช ืืื:
@Callable(i)
funcvoteCommit(item: String, hash: String) = {
letuser = toBase58String(i.caller.bytes)
letcommits = getValueCommitsCount(item)
letstatus = getValueItemStatus(item)
if( commits >=VOTERS) thenthrow("reached max num of voters")
elseif(getValueCommit(item, user) !=NONE) thenthrow("user has already participated")
elseif(getKeyItemSupplier(item) ==NONE) thenthrow("item does not exist")
elseif(status !=NONE && status !=VOTING) thenthrow("voting is not possible")
else{
WriteSet([
DataEntry(getKeyCommit(item, user), hash),
DataEntry(getKeyCommitsCount(item), commits +1),
DataEntry(getKeyItemStatus(item),if(commits ==VOTERS) thenREVEAL elseVOTING)
])
}
}
>
ืื ืขืื ืืืืช ืืืงืืจืก?
ืืงืืจืก ืืื ืื ืืืงื ืืืฆืื ื-Non-fungible tokens (NFTs) - ืืกืืืื ืื ืืืืืฆืืื ืืฉืื ืืืืืื ืืืื ืืื ื ื ืืชื ืื ืืฉืื ืื.
ืืฉืืขืืจ ืืืืจืื ืืืงืืฉ ืืืืจืงืืื. ืืืืืื ืฉื-blockchain ืืื ื ืืืื ืืงืื ื ืชืื ืื ืืืขืืื ืืืืฆืื, ืื ื ืืงืืงืื ืืืืจืงืืื ืืื ืืฉืืื ืืืื ืืช ืื ืชืื ืื ืืืื.
ืขืืืจ ืืฉืืง ืฉืื ื, ืืื ืฆืืจื ืืืืจืงื ืืื ืืืืช, ืืืืงืจื ืืฆืืจื, ืืจืฉืื ืืช ืืกืคืง ืืฉืืืจ, ืืืฉื, ืฉืื ืงืืื ืงืืคืื ืฉื ืืืจ.
ืื ื ืืืืื:
funcgetExtValueItemWhiteListStatus(item:String) = {
item +"_verifier_status"
}
letverifier = "3Mx9qgMyMhHt7WUZr6PsaXNfmydxMG7YMxv"
letVERIFIED = "verified"
letBLACKLISTED = "blacklist"
@Callable(i)
funcsetstatus(supplier: String, status: String) = {
letaccount = toBase58String(i.caller.bytes)
if( account !=verifier ) thenthrow("only oracle verifier are able to manage whitelist")
elseif( status !=VERIFIED && status !=BLACKLISTED) thenthrow("wrong status")
else{
WriteSet([
DataEntry(getExtValueItemWhiteListStatus(supplier), status)
])
}
}
ืื ืืื ืืืืจ ืืื ืฉืืืืฉื ืขืืืจื?
ืืืืง ืืื ืฉืืืืฉื ืืื ืืืฉืืืืช. ืืืืืชื ืืชืืืจ ืืืืจ ืืืจืฆืื, ืืืืืข ืืืืฉ ืฉื ืจืืฉ ืืชืืืฉ ืืืืฆืขืืช ื ืืกืื ืืืขืืื. ืขืืืื ืืขืฉืืช ืขื
ืืื ืืชื ืืชืื ื ืืืืฉื ืืช ืื ืฉืืืืช ืืืื ืืืขืฉื?
ืืืจ ืืืืชืืื ืฆืืคืืชื ืฉืืงืืจืก ืืขืืืจ ืืงืืช ืืช ืืคืจืืืงื ืฉืื ืืฉืื ืืื. ืืจืขืืื ืืื ืืืชืื ืขืืฉืื ืืช ืืงืื
ืืงืืจืก ืื ืืื ืืขืืจืจ ืืืฉืื ืื ืชื ืื ืืจืื ืจืขืืื ืืช ืืืฉืื. ืื ื ืืืื ืฉืืชืืฆืืืช ืืืฉืืื ืืืืคืืข ืืขืชืื.
ืืงืืจ: www.habr.com