Solidity 事件勤晚、繼承、全局變量

Event

http://www.reibang.com/p/a99375c4e003

  1. 基本概念
    事件是以太坊提供的基本功能泉褐,用來將數(shù)據(jù)記錄成日志赐写,保存在區(qū)塊鏈上,同時事件也可用于用于和外部交互膜赃,例如和前端的交互挺邀、異步調(diào)用等作用。solidity中,事件是指操作觸發(fā)的行為端铛,而日志則是觸發(fā)事件后泣矛,將數(shù)據(jù)記錄在區(qū)塊鏈上形成日志。

事件event是以太坊提供的基本功能禾蚕,用于將數(shù)據(jù)記錄成日志保存到區(qū)塊鏈上您朽,用戶可以自定義需要記錄的數(shù)據(jù),以及topic和索引换淆;
日志是指事件保存在區(qū)塊鏈上的數(shù)據(jù)哗总。事件強(qiáng)調(diào)操作行為,日志強(qiáng)調(diào)存儲內(nèi)容倍试,兩者是完全不同的概念讯屈。

  1. 特性
  • 區(qū)塊鏈?zhǔn)谴虬幌盗薪灰椎膮^(qū)塊組成的鏈條,每一個交易“收據(jù)”會包含0到多個日志記錄县习,日志代表著智能合約所觸發(fā)的事件涮母。
  • 通過emit來調(diào)用一個事件
  • 存儲合約數(shù)據(jù),相比storage要便宜很多(storage存儲的大概價(jià)格為:每32字節(jié)需要消耗20000Gas躁愿,而日志存儲價(jià)格大概為每字節(jié)8Gas)
pragma solidity >=0.4.21 <0.6.0;

contract SimpleAuction {
    event HighestBidIncreased(address bidder, uint amount); // Event
    function bid() public payable {
        // ...
        emit HighestBidIncreased(msg.sender, msg.value); // Triggering event
    }
}
  • 在DAPP的應(yīng)用中叛本,有2種反饋方式:監(jiān)聽回調(diào)、持續(xù)阻塞式監(jiān)聽的方式攘已。
var abi = /* abi as generated by the compiler */;
var ClientReceipt = web3.eth.contract(abi);
var clientReceipt = ClientReceipt.at("0x1234...ab67" /* address */);

var event = clientReceipt.Deposit();

// watch for changes
event.watch(function(error, result){
    // result contains non-indexed arguments and topics
    // given to the `Deposit` call.
    if (!error)
        console.log(result);
});


// Or pass a callback to start watching immediately
var event = clientReceipt.Deposit(function(error, result) {
    if (!error)
        console.log(result);
});

日志的查詢

通過web.js 來進(jìn)行監(jiān)聽查詢
由于日志不可被任何合約訪問炮赦,那么我們應(yīng)該如何查找日志了。盡管solidity沒有提供查詢?nèi)罩镜腶pi样勃,但是監(jiān)聽日志時,提供了filter功能性芬,通過filter我們就可以完成查詢?nèi)罩镜男枨蟆?/p>

var event = myContract.Transfer(object1, object2, callfunction);
  1. object1:json對象峡眶,添加indexed屬性的參數(shù)值,這里需要填具體的值植锉,例如上面的例子辫樱,我們可以過濾由指定地址發(fā)出的交易{'_from':'0x84d939AD8034c3ce2A7D4D100b939d4523b9E46E'}

  2. object2:json對象,額外的filter參數(shù),由solidit提供俊庇,可以指定的參數(shù)有:

  • fromBlock:數(shù)字或字符串狮暑,默認(rèn)為latest,指定過濾的起始位置辉饱,值為塊的編號
  • toBlock:數(shù)字或字符串搬男,默認(rèn)為latest,指定過濾的結(jié)束位置彭沼,值為塊的編號
  • address:字符串缔逛,接收指定賬戶地址發(fā)出的event
  • topics:字符串?dāng)?shù)組,接收指定topic的event。如果是非匿名事件褐奴,其中一個topic就是事件簽名:Transfer(address,address,uint)按脚,匿名事件是無法通過topic來過濾
  1. callfunction:回調(diào)函數(shù)function(error, result){...}
     // 只監(jiān)聽向0x84d939AD8034c3ce2A7D4D100b939d4523b9E46E地址轉(zhuǎn)賬的事件
    var obj1 = {
        '_to': '0x84d939AD8034c3ce2A7D4D100b939d4523b9E46E',
    }

    // block過濾范圍0-latest
    var obj2 = {
        'fromBlock': 0,
        'toBlock': 'latest'
    }

    var event = instance.Transfer(obj1, obj2)
    //監(jiān)聽和回調(diào)函數(shù)
    event.watch(function (error, result) {
        console.log('transfer log begin')
        console.log(JSON.stringify(result))
        console.log('transfer log end')
    })

多繼承

  • 當(dāng)一個合約從多個其它合約那里繼承,在區(qū)塊鏈上僅會創(chuàng)建一個合約敦冬,在父合約里的代碼會復(fù)制來形成繼承合約辅搬。
  • 派生合約可以訪問父類合約里所有非私有成員,包括內(nèi)部函數(shù)和狀態(tài)變量脖旱。 但是這些不能通過this從外部訪問堪遂。
contract named is owned, mortal {

}
  • 繼承的時候,可以直接給父類構(gòu)造函數(shù)賦值
pragma solidity ^0.4.0;
contract Base {
    uint x;
    function Base(uint _x) { x = _x; }
}

contract Derived is Base(7) {
    function Derived(uint _y) Base(_y * _y) {
    }
}

全局變量

區(qū)塊和交易屬性

  • block.blockhash(uint blockNumber) returns (bytes32):指定區(qū)塊的區(qū)塊哈虾蝗保——僅可用于最新的 256 個區(qū)塊且不包括當(dāng)前區(qū)塊蚤氏;而 blocks 從 0.4.22 版本開始已經(jīng)不推薦使用,由 blockhash(uint blockNumber) 代替
  • block.coinbase (address): 挖出當(dāng)前區(qū)塊的礦工地址
  • block.difficulty (uint): 當(dāng)前區(qū)塊難度
  • block.gaslimit (uint): 當(dāng)前區(qū)塊 gas 限額
  • block.number (uint): 當(dāng)前區(qū)塊號
  • block.timestamp (uint): 自 unix epoch 起始當(dāng)前區(qū)塊以秒計(jì)的時間戳
  • gasleft() returns (uint256):剩余的 gas
  • msg.data (bytes): 完整的 calldata
  • msg.gas (uint): 剩余 gas - 自 0.4.21 版本開始已經(jīng)不推薦使用踊兜,由 gesleft() 代替
  • msg.sender (address): 消息發(fā)送者(當(dāng)前調(diào)用)
  • msg.sig (bytes4): calldata 的前 4 字節(jié)(也就是函數(shù)標(biāo)識符)
  • msg.value (uint): 隨消息發(fā)送的 wei 的數(shù)量
  • now (uint): 目前區(qū)塊時間戳(block.timestamp)
  • tx.gasprice (uint): 交易的 gas 價(jià)格
  • tx.origin (address): 交易發(fā)起者(完全的調(diào)用鏈)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末竿滨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子捏境,更是在濱河造成了極大的恐慌于游,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件垫言,死亡現(xiàn)場離奇詭異贰剥,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)筷频,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門蚌成,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凛捏,你說我怎么就攤上這事担忧。” “怎么了坯癣?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵瓶盛,是天一觀的道長。 經(jīng)常有香客問我示罗,道長惩猫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任蚜点,我火速辦了婚禮轧房,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘禽额。我一直安慰自己锯厢,他們只是感情好皮官,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著实辑,像睡著了一般捺氢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上剪撬,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天摄乒,我揣著相機(jī)與錄音,去河邊找鬼残黑。 笑死馍佑,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的梨水。 我是一名探鬼主播拭荤,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼疫诽!你這毒婦竟也來了舅世?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤奇徒,失蹤者是張志新(化名)和其女友劉穎雏亚,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體摩钙,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡罢低,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了胖笛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片网持。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖长踊,靈堂內(nèi)的尸體忽然破棺而出翎碑,到底是詐尸還是另有隱情,我是刑警寧澤之斯,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站遣铝,受9級特大地震影響佑刷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜酿炸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一瘫絮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧填硕,春花似錦麦萤、人聲如沸鹿鳖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翅帜。三九已至,卻和暖如春命满,著一層夾襖步出監(jiān)牢的瞬間涝滴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工胶台, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留歼疮,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓诈唬,卻偏偏與公主長得像韩脏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子铸磅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容