智能合約的代碼寫完后,要編譯成bytecode。創(chuàng)建合約時(shí),外部帳戶發(fā)起一個(gè)轉(zhuǎn)賬交易到0x0的地址,轉(zhuǎn)賬金額(“VALUE”域)是0,但是要支付汽油費(fèi),合約的代碼放在data域里。
合約部署后會(huì)創(chuàng)建一個(gè)合約賬戶,合約賬戶里保存著智能合約的可執(zhí)行字節(jié)碼(編譯之后的,在EVM里執(zhí)行),并且有存儲(chǔ)空間,合約能對(duì)合約賬戶的空間寫入信息.而abi是一個(gè)接口結(jié)構(gòu),利用abiDefinition可以創(chuàng)建調(diào)用該合約的結(jié)構(gòu).abi應(yīng)該由合約所有方自己保存和提供.
合約的數(shù)據(jù)正常情況下,需要全部放到鏈上的,例如以太坊的是statedb就是用來存放智能合約的狀態(tài)的,statedb的根就在block header里面,用以保證數(shù)據(jù)的不可篡改。那么監(jiān)督借點(diǎn)在接到曠工節(jié)點(diǎn)的塊同步請(qǐng)求的時(shí)候,需要replay交易,然后監(jiān)督節(jié)點(diǎn)也從新跑智能合約,完成statedb的狀態(tài)轉(zhuǎn)移,最后計(jì)算statedb的根,用來跟曠工節(jié)點(diǎn)同步的根對(duì)比,一致則將塊放到鏈上,此時(shí),你應(yīng)該知道存儲(chǔ)合約的狀態(tài)其實(shí)很簡(jiǎn)單,只需要一個(gè)本地kv存儲(chǔ),例如leveldb或者couchdb等,提供給合約調(diào)用即可。