NEO智能合約開發中,應用合約比較簡單,是的你沒看錯,應用合約比較簡單。html
應用合約三部曲,發佈、調用、看結果。除了看結果工具比較缺少,發佈調用neogui最起碼能夠支撐你測試。框架
鑑權合約比較麻煩,由於neogui不能支持你很好的測試鑑權合約。函數
這是一個難點,上一次咱們讓你試着用鑑權合約往外取錢了,一個密碼,有了密碼誰都能取錢。就那,用neogui去取並不容易,對吧。工具
這一次咱們繼續探討這個話題,一個更有價值的應用場景。學習
如何限制一個用戶能從智能合約裏取出多少錢?測試
不用擔憂,若是到這裏你啥都看不懂,很正常。我估計中國真的理解了NEO的鑑權機制的人一雙手就數的過來。一個正常的NEO學習機制,應該是:ui
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。就是這個緣由。
有一個金句,辦法總比困難多。
若是你只是簡單的縱覽一下,可能會以爲存儲這條路被堵住了,一切都不可行了。
讓咱們仔細來看一下這個邏輯
看起來好像邏輯鏈斷了,可是當咱們想起來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附加上超級管理員的鑑證腳本。
就是這部分代碼了,將本交易的hash和本交易的第0個輸出編成一個Key。
你也許注意到我寫了一個ConvertN函數,由於整數的byte[] 形態是什麼不太穩定,我須要他是肯定的,要否則0000 00 和空byte[] 都表示0,那key就亂套了
而後你看到我直接stroage.put 將目標地址存了起來。這就是第一步。
製造一個100GAS的UTXO,而且在Storage裏記錄下來給誰。
第二步就簡單了,這交易不須要任何人簽名
,智能合約的鑑證腳本也是隨便填就行
而後你就能夠取到錢啦。
我把這段鑑權合約分爲了三個部分
紅色部分是判斷,這筆交易,只容許有一個輸入一個輸出,不然你取不走錢。固然你用循環能夠處理更復雜的狀況,記住咱們只是在探究這個機制。
黃色部分是從存儲裏取到這個UTXO容許的目標
藍色部分是判斷這筆交易的輸出目標和Storage裏存的是否一致。
一致,錢你拿走,UTXO銷燬。
不一致,交易不成立,UTXO還在那裏。
綜上所述,咱們提出了一種能夠在NEO框架上實現用戶在智能合約限制下提取UTXO資產的機制,並寫代碼進行了驗證。
此機制可用於:
等
技術羣交流:795681763
原文:https://www.cnblogs.com/crazylights/p/8457392.html