NEO智能合約開發(二)再續不可能的任務

NEO智能合約開發中,應用合約比較簡單,是的你沒看錯,應用合約比較簡單。html

應用合約三部曲,發佈、調用、看結果。除了看結果工具比較缺少,發佈調用neogui最起碼能夠支撐你測試。框架

鑑權合約比較麻煩,由於neogui不能支持你很好的測試鑑權合約。函數

這是一個難點,上一次咱們讓你試着用鑑權合約往外取錢了,一個密碼,有了密碼誰都能取錢。就那,用neogui去取並不容易,對吧。工具

這一次咱們繼續探討這個話題,一個更有價值的應用場景。學習

如何限制一個用戶能從智能合約裏取出多少錢?測試

不用擔憂,若是到這裏你啥都看不懂,很正常。我估計中國真的理解了NEO的鑑權機制的人一雙手就數的過來。一個正常的NEO學習機制,應該是:ui

  1. 先開發一個錢包客戶端
  2. 而後瞭解應用合約的調用,用本身的錢包客戶端,本身寫的的scriptbuilder,去完成應用合約的調用。
  3. 瞭解鑑權合約,寫一些鑑權合約,用本身的錢包客戶端拼交易,測試他們。

NEO官網上提供的信息太少,不看NEO源代碼,沒有正常人類能經過NEO官網的資料學會這些內容。cdn

若是你尚未到這個階段,這篇文字還不適合你,去作一些應該作的事情吧。htm

限制取錢機制有什麼意義

好比說,Nep5的ico機制,用戶投入NEO,獲得Nep5代幣。這就是一個自動販賣機機制。你給我gas或者neo,我給你遊戲幣。用UTXO資產,購買NEP5資產,或者其它什麼東西。blog

那麼NEO如今提供的ico模板,是沒有退貨機制的。由於比較難實現,很差限制用戶從ico合約裏面能取出多少錢。

這就是意義,能作到限制取多少錢,就能實現ICO自動化退貨機制。

換個比方,售貨機機制還有不少做用,好比我幫個人朋友存一筆錢,他生日到了能夠取走。

好比兩我的打du,猜一下五個區塊之後的一個隨機數的單雙,聰明的你立刻懂了,實現了用戶能從智能合約裏面取出多少UTXO資產的限制,就能夠直接用UTXO資產進行各類不可描述的du博業務。

再往遠了想想,一個全自動化的交易所,用GAS買入某種NEO代幣,等他漲了再賣掉,把GAS取出來。我尚未看過藍鯨濤公佈源碼,neox的源碼我也沒有研究。那這就是他們實現用戶本身提取UTXO資產的一個核心機制。

這有什麼困難的?

很難,第一反應就是storage直接存個值,取得時候存一下,根據這個值,就能夠實現任意限制邏輯。

想的美。

100個GAS在這放着,有本事去取呀。

放心你取不出來。

這個合約表面上看誰都能取,可是Storage.Put 引起異常,實際上誰也取不出來。

你看,你想的最美的經過Storage去限制取多少,作不到。在鑑權合約觸發時,Storage.Put 整個不能用。

回想一下ICO模板,是否是沒有實現全自動的退款,準確點說就是沒有實現任意用戶從智能合約提取NEO。就是這個緣由。

那就沒有辦法了嘛?

有一個金句,辦法總比困難多。

若是你只是簡單的縱覽一下,可能會以爲存儲這條路被堵住了,一切都不可行了。

讓咱們仔細來看一下這個邏輯

  1. 須要有個限制取錢的機制,取完就不能再取
  2. 須要用Stroage來控制這個機制
  3. 鑑權合約執行時不能Storage.Put

看起來好像邏輯鏈斷了,可是當咱們想起來UTXO資產自己的一個特質,這個鏈條就會再次接上。一個UTXO只能被使用一次,沒錯就是他。這個不正好能夠用來控制用戶能取多少錢了麼?

1、須要有個限制取錢的機制(給每一個取錢的用戶一個專屬的UTXO只能他取)

2、須要用Stroage來控制這個機制(storage直接存一個map<utxo,targetaddr>,限制一個utxo只能向一個固定地址轉帳)

3、鑑權合約執行時不能Storage.put(可是能夠Storage.get 呀,bingo)

咱們把思路稍微調整了一下,就接上了。咱們不須要storage直接控制一個用戶能取多少錢。1.用storage 控制一個utxo能往哪一個地址轉帳,這能夠實現。

2.一個utxo只能轉帳一次,這是自然的。

這兩條加一塊兒,這個自助提取UTXO資產的邏輯就通了。

用兩筆交易實現自助提取UTXO資產。

第一筆,資產不離開智能合約,智能合約向自身轉帳,生成某用戶專用的UTXO,同時作invoke應用合約,記錄將此UTXO專用化。

第二筆,取錢,用此專用UTXO向用戶地址轉帳。

實踐一下

直接看代碼

這裏只是爲了探究這個機制,咱們將第一步設定爲由超級管理員給用戶撒錢。你仔細想一想,實現個用戶本身從本身的NEP5地址退錢,和這並沒太大區別。咱們不要讓那麼多代碼來干擾咱們實現核心機制。

第一步

用這個智能合約本身給本身轉帳

如圖,就是Gas1000,轉給本身100GAS,找零900Gas這筆,錢沒有離開智能合約地址。

而後超級管理員給超級管理員轉帳 30536.6 GAS這筆,超級管理員也沒出錢。

而後同時調用智能合約,將該筆交易第0個輸出的UTXO,設定爲只能向地址

AcfW….轉帳,如圖

因爲使用了智能合約,須要一個SC的witness,以下圖,隨便傳倆參數,不能用Array

讓咱們分析下上面作了什麼

1.智能合約給本身轉帳,第零個輸出是個utxo,100gas,那就意味着,咱們容許AcfW…這個地址從智能合約地址裏面轉走100GAS

2.超級管理員給本身轉帳,這個不產生直接價值

他只是爲了讓鑑權合約能走到這裏,附加上超級管理員的鑑證,就隨便怎麼轉都行。

也可使用交易的Attribute附加上超級管理員的鑑證腳本。

  1. APPcall givemoney(0,Acfw…)

就是這部分代碼了,將本交易的hash和本交易的第0個輸出編成一個Key。

你也許注意到我寫了一個ConvertN函數,由於整數的byte[] 形態是什麼不太穩定,我須要他是肯定的,要否則0000 00 和空byte[] 都表示0,那key就亂套了

而後你看到我直接stroage.put 將目標地址存了起來。這就是第一步。

製造一個100GAS的UTXO,而且在Storage裏記錄下來給誰。

第二步

第二步就簡單了,這交易不須要任何人簽名

,智能合約的鑑證腳本也是隨便填就行

而後你就能夠取到錢啦。

分析一下

我把這段鑑權合約分爲了三個部分

紅色部分是判斷,這筆交易,只容許有一個輸入一個輸出,不然你取不走錢。固然你用循環能夠處理更復雜的狀況,記住咱們只是在探究這個機制。

黃色部分是從存儲裏取到這個UTXO容許的目標

藍色部分是判斷這筆交易的輸出目標和Storage裏存的是否一致。

一致,錢你拿走,UTXO銷燬。

不一致,交易不成立,UTXO還在那裏。

咱們作了什麼

綜上所述,咱們提出了一種能夠在NEO框架上實現用戶在智能合約限制下提取UTXO資產的機制,並寫代碼進行了驗證。

此機制可用於:

  1. 使用NEO的UTXO資產如NEO、GAS 進行ICO的退貨機制。
  2. 擴展上一條,可自動販賣某種數字資產以及退貨。
  3. 使用NEO的UTXO資產進行的彩票、下注等活動。
  4. 去中心化交易所的實現。


技術羣交流:795681763

原文:https://www.cnblogs.com/crazylights/p/8457392.html

相關文章
相關標籤/搜索