์ด์ ๋ ๊ธฐ์ฌ์์๋ ์ค๋งํธ ๊ณ์ ๊ณผ ์ค๋งํธ ๊ณ์ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ํด ์ด์ผ๊ธฐํ์ต๋๋ค.
์ด์ ์ค๋งํธ ์์ฐ๊ณผ ์์ฐ ๋๊ฒฐ, ์ง์ ๋ ์ฃผ์์์์ ๊ฑฐ๋ ์ ํ ๋ฑ ์ค๋งํธ ์์ฐ์ ์ฌ๋ฌ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
Waves ์ค๋งํธ ์์ฐ์ ์ฌ์ฉํ๋ฉด ์ค๋งํธ ๊ณ์ ๊ณผ ๋์ผํ ๋ฉ์ปค๋์ฆ์ ๋ฐ๋ผ ์์ฐ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ค๋ฒ๋ ์ดํ ์ ์์ต๋๋ค. ์ค๋งํธ ์์ฐ์ ์ฌ์ฉํ์ฌ ์์ฑ๋ ๊ฐ๊ฐ์ ์๋ก์ด ๊ฑฐ๋๋ ๋จผ์ ์คํฌ๋ฆฝํธ์ ์ํด ํ์ธ๋๊ณ ๊ทธ ๋ค์์๋ ๋ธ๋ก์ฒด์ธ์ ์ํด ํ์ธ๋ฉ๋๋ค.
์ค๋งํธ ์์ฐ๊ณผ ์ค๋งํธ ๊ณ์ ์ ๋ค์ ์ฐจ์ด์ ์ ์ฃผ๋ชฉํ ํ์๊ฐ ์์ต๋๋ค.
- ์ค๋งํธ ์์ฐ์ ์ฝ๋์์๋ ์ฆ๋ช
์ ํ์ธํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
์ฒซ ๋ฒ์งธ ๊ธฐ์ฌ์์ ). - ์ค๋งํธ ๊ณ์ ์ฝ๋์์๋ ํด๋น ๊ณ์ ์ด ์ผ์น์ ๊ณ์ ์ธ ๊ฒฝ์ฐ์๋ง ExchangeTransaction์ ํ์ธํ ์ ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์์๋ง ํ์ธ๋ฉ๋๋ค. ์ค๋งํธ ์์ฐ ์ฝ๋์์๋ ์ฃผ๋ฌธ์ ์ง์ ํ์ธํ ์ ์์ผ๋ฉฐ ExchangeTransaction์ ํ์ธํ๊ณ ํ์ํ ๊ฒฝ์ฐ ํด๋น ์ฃผ๋ฌธ์ ๊ฒ์ํ ์ ์์ต๋๋ค.
- ์ค๋งํธ ๊ณ์ ๊ณผ ๋ฌ๋ฆฌ ์ค๋งํธ ์์ฐ์๋ ์ํ๊ฐ ์์ง๋ง ์คํฌ๋ฆฝํธ์์ ๊ณ์ ์ํ์ ๊ณ์ ์ก์ธ์คํ ์ ์์ต๋๋ค.
์ค๋งํธ ์์ฐ์ ๊ณ์ฝ์ ์์ฑ์ ํฌ๊ฒ ๋จ์ํํ์ฌ ๋ง์ ์ฌ๋ก์ ๊ตฌํ์ ๊ฐ๊ฒฐํ๊ณ ์ฐ์ํ๊ฒ ๋ง๋ญ๋๋ค.
์์ฐ ๋๊ฒฐ
์์ฐ์ ํน์ ๋ธ๋ก ๋์ด๋ก ๊ณ ์ ํ๋ ค๋ฉด ๋ชฉํ ๋์ด, ๋ค์ ์ค๋งํธ ์์ฐ์ ์คํฌ๋ฆฝํธ์์ ์ด ๊ฐ์ ๊ฐ๋จํ ์ค์ ํ ์ ์์ต๋๋ค.
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