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庫元件收到應...