開啟sCrypt的盒子(2)Demo合約

2021-10-24 07:07:54 字數 1927 閱讀 7176

scrypt是位元幣合約走出來的第一步。我們看看scrypt最簡單的demo合約,看看它的有趣之處。

合約原文**

demo 合約

原文比較簡單,貼在此處

contract demo 

function

sum(int a, int b)

returns

(int)

public

function

add(int z)

public

function

sub(int z)

}

這個合約提供兩個public屬性的函式,乙個add和乙個sub。

將上述指令碼的編譯結果打出來

const demo =

buildcontractclass

(compilecontract

('demo.scrypt'))

; console.

log(

'demo'

,demo)

demo =

newdemo(7

,4);

可以看到abi介面,注意public函式有index索引,這個索引將在後面使用

abi:[,

,

合約的編譯結果比較長,暫時不去分析它,只把它當成乙個黑盒,從外部測試。需要知道demo = new demo(7, 4);這句已經將7和4兩個數字寫入了指令碼,沒法再更改。

合約的編譯結果就是鎖定指令碼。而解鎖指令碼就是public函式的引數。

從外部呼叫的時候, 看下面的**注釋

//公開函式可以進行呼叫, addfn是乙個函式呼叫,7+4的結果11是引數,進行函式呼叫

const addfn = demo.

add(11)

console.

log(addfn, addfn.unlockingscript.chunks)

//解鎖指令碼是兩個數字,11和1,第乙個是引數11。第2引數1是add的索引+1

result = addfn.

verify()

console.

log(result)

//result包含兩個字段 success, true是成功,否則為false, error欄位是出錯原因,沒出錯則為空字串

console.

log(addfn.

toscript()

)//script , ] }

我不知道add的索引為什麼+1,需要看實現細節。這個索引並不需要自己管理,在addfn中內部實現。

addfn包含兩個關鍵的方法,乙個是verify(), 乙個是toscript()

verify()會使用將引數和函式索引押入棧中,然後同鎖定指令碼組合,跑一遍程式,最後檢查棧頂是否為true

toscript()只是輸出引數和函式索引組合起來的解鎖指令碼,並不去校驗。

verify()非常適合在將解鎖交易傳送到位元幣節點之前,在本地做校驗。如果不做這個校驗直接廣播,在位元幣節點中也會自動跑指令碼,如果解鎖失敗,將會返回"16: mandatory-script-verify-flag-failed (script evaluated without error but finished with a false/empty top stack element)"的錯誤。如果解鎖成功,則鎖定指令碼所在的utxo將被花費,裡面的位元幣satoshi被取出。

位元幣帶來的安全自由, 關注使用notesv

開啟潘多拉的盒子

既然都說plotly是最好的資料視覺化庫,沒有之一,那這匹烈馬為什麼在redash的馴服下像乙隻小貓呢?資料展現力甚至不如某chart和某寶的antv。經過達之資料工程師和redash原版團隊的深入溝通,答案在這裡。原來redash定位為普及型資料視覺化生產力工具,力求降低門檻,人人都可大資料的目標...

開啟 不明確行為 的潘多拉盒子 解釋

由於編譯器會為使用者自定義型別 user defined types 之成員變數自動呼叫 default 建構函式一一如果那些成員變數在 成員初值列 中沒有被指定初值的話,因而引發某些程式設計師過度誇張地採用以上寫法。那是可理解的,但請立下乙個規則,規定總是在初值列中列出所有成員變數,以免還得記住哪...

伺服器開啟 開啟伺服器間通訊的黑盒子

一 總圖 順序右 左 二 名詞解釋 三 流程簡述 1.以瀏覽器傳送http請求為例子,瀏覽器先解析url獲取網域名稱,然後委託作業系統向dns伺服器查詢web伺服器的ip位址並生成http請求訊息。由於瀏覽器不具有傳送請求功能,所以瀏覽器通過呼叫socket庫元件來實現。2.socket庫元件收到應...