สินทรัพย์อัจฉริยะของ Waves: รายการขาวดำ การซื้อขายตามช่วงเวลา

สินทรัพย์อัจฉริยะของ Waves: รายการขาวดำ การซื้อขายตามช่วงเวลา

ในสองบทความก่อนหน้านี้ เราได้พูดคุยเกี่ยวกับบัญชีอัจฉริยะและวิธีการใช้งาน สำหรับจัดการประมูลและสร้างโปรแกรมสะสมคะแนนและยังช่วยอีกด้วย รับรองความโปร่งใสของเครื่องมือทางการเงิน.

ตอนนี้เราจะดูสินทรัพย์อัจฉริยะและการใช้งานหลายกรณี รวมถึงการระงับสินทรัพย์และการสร้างข้อจำกัดในการทำธุรกรรมตามที่อยู่ที่ระบุ

Waves Smart Assets ช่วยให้ผู้ใช้สามารถซ้อนทับสคริปต์บนสินทรัพย์ได้ ตามกลไกเดียวกันกับบัญชีอัจฉริยะ ธุรกรรมใหม่แต่ละรายการที่สร้างขึ้นโดยใช้สินทรัพย์อัจฉริยะจะได้รับการยืนยันโดยสคริปต์ก่อน จากนั้นจึงโดยบล็อกเชนเท่านั้น

เป็นที่น่าสังเกตถึงความแตกต่างระหว่างสินทรัพย์อัจฉริยะและบัญชีอัจฉริยะดังต่อไปนี้:

  1. ในรหัสของสินทรัพย์อัจฉริยะ ไม่สามารถตรวจสอบหลักฐานได้ (เราได้พูดคุยเกี่ยวกับพวกเขาแล้ว ในบทความแรก).
  2. ในรหัสบัญชีอัจฉริยะ คุณสามารถตรวจสอบ ExchangeTransaction ได้เฉพาะในกรณีที่บัญชีของคุณเป็นบัญชีที่ตรงกัน มิฉะนั้นจะมีการตรวจสอบเฉพาะคำสั่งซื้อเท่านั้น ในรหัสสินทรัพย์อัจฉริยะ คุณไม่สามารถตรวจสอบคำสั่งซื้อได้โดยตรง คุณสามารถตรวจสอบ ExchangeTransaction และดึงคำสั่งซื้อออกมาได้ หากจำเป็น
  3. สินทรัพย์อัจฉริยะนั้นไม่มีสถานะซึ่งต่างจากบัญชีอัจฉริยะ แต่เรายังคงสามารถเข้าถึงสถานะบัญชีได้จากสคริปต์

สินทรัพย์อัจฉริยะทำให้การเขียนสัญญาง่ายขึ้นอย่างมาก ทำให้การดำเนินการในหลายกรณีมีความกระชับและสวยงาม

การอายัดทรัพย์สิน

เพื่อตรึงสินทรัพย์ไว้ที่ความสูงของบล็อกที่กำหนด เป้าหมายความสูงคุณสามารถตั้งค่านี้ในสคริปต์ของสินทรัพย์อัจฉริยะต่อไปนี้:

let targetHeight = 1500000
height >= targetHeight
 
height - функция языка, возращающая текущую высоту.

เงื่อนไขเฉพาะของ Matcher

หากต้องการตั้งค่าตัวจับคู่เฉพาะให้เป็นค่าที่ต้องการ คุณสามารถตั้งค่าที่อยู่เป็นผู้ส่งในสคริปต์สินทรัพย์อัจฉริยะที่มีลักษณะดังนี้:

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
}

เพื่อเหตุผลด้านความปลอดภัยและความสมบูรณ์ของภาษาที่พิสูจน์ได้ รายการจึงไม่มีการใช้งานตัววนซ้ำ ดังนั้นจึงถูกกำหนดให้เป็นชุดขององค์ประกอบที่เป็นรูปธรรม

"บัญชีดำ" ของผู้รับ

ในทำนองเดียวกัน หากต้องการห้ามไม่ให้ส่งโทเค็นไปยังบางบัญชี คุณสามารถสร้าง "บัญชีดำ" ได้ ในกรณีนี้ มีการใช้ Smart Asset เดียวกันทุกประการ แต่มีการตรวจสอบที่อยู่เพื่อให้แน่ใจว่าไม่อยู่ในบัญชีดำ:

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
}

แลกเปลี่ยนเป็นเหรียญบางชนิดเท่านั้น

สินทรัพย์อัจฉริยะอนุญาตให้แลกเปลี่ยนเป็นเหรียญบางชนิดเท่านั้น ตัวอย่างเช่น หากต้องการอนุญาตการแลกเปลี่ยนเป็น Bitcoins เท่านั้น คุณสามารถใช้รหัสต่อไปนี้:

let BTCId = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS'
match tx {
  case t : ExchangeTransaction =>
    t.sellOrder.assetPair.priceAsset == BTCId ||
     t.sellOrder.assetPair.amountAsset == BTCId
  case _ => true
}

ซื้อขายตามราคาจากออราเคิล

ในสคริปต์สินทรัพย์อัจฉริยะ คุณสามารถตั้งค่าการอนุญาตให้ซื้อขายในราคาคงที่ในสถานะของ Oracle ที่เชื่อถือได้เท่านั้น นี่คือตัวอย่างของสคริปต์ดังกล่าว:

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 ของสินทรัพย์ที่ทำการซื้อขาย ประเด็นก็คือหากไม่ได้กำหนดรหัสสินทรัพย์ เรากำลังพูดถึง 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
}

ในสคริปต์เราตรวจสอบให้แน่ใจตั้งแต่เริ่มต้นการซื้อขาย เริ่มต้นความสูง ไม่เกิน จำกัด ช่วงเวลา ความยาวของช่วงเวลาเท่ากับจำนวนบล็อกที่ระบุในฟิลด์ ระยะห่าง.

ที่มา: will.com

เพิ่มความคิดเห็น