繼上次我們推出 sCrypt Deploy 功能后,這次我們新增了呼叫有狀態合約的功能,
本文以 boilerplate 專案中的 advancedCounter 合約為例,介紹如何使用這個功能部署和呼叫合約,
部署合約
AdvancedCounter 合約是一個有狀態的計數器合約,它會在每次成功呼叫 increment 方法時,將內部狀態值 counter 增加 1,這里我們將其初始狀態設定為 00(即從0開始計數),并且合約鎖定的 bsv 余額使用默認設定 10000 聰,
使用這個方法 部署合約成功之后,會看到左下角的 DEPLOYED CONTRACTS 增加了一個 AdvancedCounter 合約實體,展開該實體的 transactions 子項,可以看到對應的部署交易,

注意:如果點擊了 Deploy 按鈕后,在運行輸出中看到這個錯誤:Error: Contract description version deprecated, Please update your sCrypt extension to the latest version and recompile,請嘗試執行以下步驟:1.打開合約的 sCrypt 原始碼,右鍵運行 Compile to Bitcoin Script 進行再次編譯;2.點擊 COMPILED CONTRACTS 視圖里的 REFRESH 重繪按鈕;3.關閉并再次打開該合約的部署面板后再次嘗試部署,
呼叫合約
在上述成功部署的 AdvancedCounter 合約實體中,點擊 increment 方法的 Call 按鈕, 右側出現合約方法呼叫面板,在該面板上可以看到合約的當前資訊,如合約鎖定余額、當前執行階段、內部狀態等,要呼叫當前合約方法,還需要根據情況完成以下幾個步驟:
Step 1(必選):填寫呼叫方法所需的實參,
本合約包括以下幾個引數:
txPreimage: 交易原像引數,這里可以點擊右側的 Preimage 按鈕手動生成;amount:新的合約 UTXO 中鎖定的 bsv 余額,這里設定為 8000 聰;changePKH:找零用的 P2PKH 地址哈希,這里使用默認設定;changeSats:找零的 bsv 數量,這里設定為 1000 聰;
Step 2(可選):定制交易的所有 Output,
如果是無狀態合約,只需要填寫引數值一般就可以了,但是對于有狀態合約,一般會限制合約的輸出腳本,所以需要手動管理所有 Output,目前支持的輸出型別有三種:
Stateful Output:有狀態合約的輸出State: 合約狀態的序列化值;Amount: 合約中鎖定的余額;
P2PKH Output:P2PKH類腳本輸出Address: 收款人地址;Amount: 該輸出中包含的 bsv 數量;
OpReturn Output:op_return類腳本輸出OpReturn: op_return 腳本中的資料部分,asm 格式;Amount: 該輸出中包含的 bsv 數量,一般為0;
通過 AdvancedCounter 合約的原始碼,我們知道呼叫 AdvancedCounter 合約的交易會產生兩個 Output, 第一個 Output 是一個帶有新狀態的 AdvancedCounter 合約 UTXO;第二個 Output 是一個找零的 P2PKH Output,
首先在 Add Output 按鈕左邊的 Output 型別串列中選擇 Stateful Output, 然后點擊 Add Output,之后給這個 Stateful Output 填寫新的狀態: 由于初始狀態是 0,那計數加1后的新狀態是1,故在 State 中輸入 01;余額 Amount 設定為 8000 聰,需要與第一步函式引數中的 amount 保持一致;
接下來添加一個找零的 P2PKH Output:在串列中選擇 P2PKH Output,然后點擊 Add Output,其中 Address 可以使用默認值;Amount 設定為 1000,需要與第一步函式引數中的 changeStas 保持一致,
到此呼叫引數和 Outputs 就添加完成了,在添加和修改 Output 的程序中,細心的朋友會發上面 txPreimage 引數的值會自動變化,原因是構建交易的 Output 改變時,我們會自動幫你更新原象引數值,當然你也可以手動點擊上面的 Preimage 按鈕進行更新,
Step 3(可選):設定交易相關引數,
Transaction Settings 中包括構建整個交易的若干引數:
-
Fee:交易費用,設定時必須滿足的限制條件是:合約當前的鎖定余額Contract Amount= 所有 Output 中的Amount之和 + 交易費用Fee,比如這里我們使用
默認值 1000, 加上上面兩個 Output 的輸出余額 8000 + 1000,剛好等于合約初始化時的余額 10000, -
SighashType:交易簽名型別,默認用于計算原象 Preimage 的簽名型別是ALL,但是AdvancedCounter合約代碼中用于計算原象的的簽名型別是ANYONECANPAY | ALL,這里的選擇需要與合約內部一致,注意:修改SighashType同樣會自動重新生成原象txPreimage,
Step 4(必選):點擊 Call 按鈕發送交易,
所有設定均完成后點擊 Call 按鈕,會觸發 API 發送這個合約呼叫交易到測驗網,交易發送成功后,我們可以看到頂部顯示合約余額發生變化,變成剛剛設定的 8000,同樣,可以看到左下角的 AdvancedCounter 合約實體的 transactions 子項中增加了一個交易,并且可通過右側的 View Tx 按鈕在區塊鏈瀏覽器上進行查看,另外,選中該交易子項時,increment 方法下的引數串列中會顯示出此次呼叫時傳遞的各個實參,

重復呼叫
針對有狀態合約 AdvancedCounter,可以重復上面的步驟繼續呼叫其方法并觀察其狀態變更,直到合約中的余額不足(因為目前暫不支持添加 Input 來支付費用,否則即可無限呼叫下去),同樣,大家也可以使用文中介紹的方法,自行嘗試呼叫其他已支持的合約示例,Have fun 😃
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/252735.html
標籤:區塊鏈
