国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

徹底理解solidity中的事件

這篇具有很好參考價(jià)值的文章主要介紹了徹底理解solidity中的事件。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

在我之前的幾篇關(guān)于智能合約的文章中,都有提到事件的用法,比如:

event HighestBidIncreased(address bidder, uint amount);
event AuctionEnded(address winner, uint amount);

這里定義了兩個(gè)事件,分別表示最高競(jìng)價(jià)更新了和拍賣結(jié)束了。

然后在需要的位置,調(diào)用事件,比如:

function bid() external payable {

        //省略其它邏輯
        ...
        highestBidder = msg.sender;
        highestBid = msg.value;
        emit HighestBidIncreased(msg.sender, msg.value);
    }

我們可以通過emit調(diào)用事件方法,然后這個(gè)事件就作為日志記錄到了以太坊區(qū)塊鏈中。日志是以太坊區(qū)塊鏈中一種特殊的數(shù)據(jù)結(jié)構(gòu),你可以把它當(dāng)作區(qū)塊鏈的一部分,只要區(qū)塊鏈在,日志就在。日志和產(chǎn)生它的智能合約的地址事綁定的。

寫了日志有啥用呢?它的作用就是可以被訂閱。很多智能合約項(xiàng)目都是傳統(tǒng)的web項(xiàng)目+智能合約的這種架構(gòu),業(yè)務(wù)系統(tǒng)有些在鏈外,那么鏈上發(fā)生的事情就可以基于這種發(fā)布訂閱機(jī)制進(jìn)行通知,從而打通鏈上和鏈下。

舉個(gè)例子,

contract ClientReceipt {
    event Deposit(
        address indexed from,
        bytes32 indexed id,
        uint value
    );

    function deposit(bytes32 id) public payable {
        emit Deposit(msg.sender, id, msg.value);
    }
}

上面定義了一個(gè)存錢的合約,存完錢發(fā)布一個(gè)事件。

然后我們可以通過javascript(web3.js)訂閱這個(gè)事件,

var abi = /* abi as generated by the compiler */;
var ClientReceipt = web3.eth.contract(abi);
var clientReceipt = ClientReceipt.at("0x1234...ab67" /* address */);

var depositEvent = clientReceipt.Deposit();

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

我們?cè)偕晕⑸钊胍稽c(diǎn)到虛擬機(jī)層面。我們知道以太坊的虛擬機(jī)是EVM,EVM的指令有幾種和日志相關(guān)的操作碼,分別是:LOG0,LOG1 , LOG2 , LOG3 和 LOG4。

日志的數(shù)據(jù)結(jié)構(gòu)包含主題和數(shù)據(jù)兩個(gè)部分,這里的1234代表的事日志包含的主題(topic)數(shù)量。如果你用過類似kafka,rocketmq等消息中間價(jià)一定對(duì)主題這個(gè)概念不陌生。主題是用來(lái)簡(jiǎn)單描述事件(日志)的,也可以用來(lái)過濾或者搜索日志。

比如我們有這樣一個(gè)事件定義:

event Transfer(address indexed _from, address indexed _to, uint256 _value);

用indexed修飾的參數(shù)會(huì)被作為主題,而沒有修飾的參數(shù)會(huì)作為日志的數(shù)據(jù)部分。在這個(gè)例子里面,意味著轉(zhuǎn)賬的發(fā)送方和接收方可以被搜索,而轉(zhuǎn)賬金額不能被搜索。

微信公眾號(hào):犀牛的技術(shù)筆記文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-787773.html


  • https://learnblockchain.cn/2018/05/09/solidity-event/
  • https://docs.soliditylang.org/en/develop/contracts.html?highlight=event#events

到了這里,關(guān)于徹底理解solidity中的事件的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【web3j】java通過web3j監(jiān)聽并解析合約中的事件(event/emit)

    ① 查詢鏈上數(shù)據(jù)用的rpc(本示例是binance的,測(cè)試網(wǎng)可以使用:https://data-seed-prebsc-2-s2.binance.org:8545) ② 自己還要有一個(gè)測(cè)試鏈上部署好的合約,合約中要有一個(gè)方法emit了事件。 ③ java依賴 一、 通過自己合約的abi和bin生成一個(gè)java文件,abi和bin可以在remix的compiler模塊中獲取,

    2024年02月09日
    瀏覽(19)
  • Solidity智能合約開發(fā) — 3.4-抽象智能合約和接口

    假如一個(gè)智能合約中至少一個(gè)函數(shù)缺省實(shí)現(xiàn)時(shí),即某個(gè)函數(shù)缺少{}中的內(nèi)容,這個(gè)智能合約就當(dāng)做抽象智能合約。 當(dāng)我們有一個(gè)函數(shù)沒想好怎么寫時(shí),必須將該合約標(biāo)為 abstract ,不然編譯會(huì)報(bào)錯(cuò);另外,未實(shí)現(xiàn)的函數(shù)需要加 virtual ,以便子合約重寫。抽象智能合約是將智能合

    2024年02月12日
    瀏覽(26)
  • 以太坊智能合約開發(fā)(五):Solidity成績(jī)錄入智能合約實(shí)驗(yàn)

    每個(gè)學(xué)生分別部署合約Student.sol ,保證只有自己可以修改姓名。老師部署合約StudentScore.sol,用于錄入學(xué)生成績(jī),查詢學(xué)生信息。查詢學(xué)生信息時(shí),需要調(diào)用學(xué)生部署的合約Student.sol。 student.sol合約,用于學(xué)生對(duì)自己信息進(jìn)行管理。 學(xué)生的基本信息作為狀態(tài)變量: 聲明構(gòu)造函

    2024年02月07日
    瀏覽(42)
  • solidity開發(fā)智能合約

    solidity開發(fā)智能合約

    起源于以太坊(Ethereum),設(shè)計(jì)的目的是能在以太坊虛擬機(jī)(EVM)上運(yùn)行。Solidity 是一門面向合約的、為實(shí)現(xiàn)智能合約而創(chuàng)建的高級(jí)編程語(yǔ)言。所以先從智能合約開始。 參考文檔 Solidity文檔:區(qū)塊鏈技術(shù)-智能合約Solidity編程語(yǔ)言 solidity官方文檔: https://solidity-cn.readthedocs.io/

    2023年04月08日
    瀏覽(25)
  • 區(qū)塊鏈2——Solidity智能合約開發(fā)

    區(qū)塊鏈 索引目錄 智能合約是一種以代碼形式編寫的自動(dòng)執(zhí)行合約,它們運(yùn)行在區(qū)塊鏈上。這些合約定義了在特定條件下發(fā)生的事件以及相應(yīng)的行為。 1.1 智能合約結(jié)構(gòu) 版本聲明(Version Declaration): 智能合約通常以聲明版本開始,指定合約應(yīng)該使用的Solidity編譯器版本。例如

    2024年02月05日
    瀏覽(29)
  • 區(qū)塊鏈智能合約solidity的中的一些關(guān)鍵字

    區(qū)塊鏈智能合約solidity的中的一些關(guān)鍵字

    目? 錄 pragma mapping msg對(duì)象 block對(duì)象 contract constructor struct 數(shù)據(jù)地址 地址類型 address payable revert 以下場(chǎng)景使用 revert() : require 以下場(chǎng)景使用 require() : assert 以下場(chǎng)景使用 assert(): 訪問權(quán)限 internal public private external function returns return view pure constant event emit modifier pragma ??

    2024年01月16日
    瀏覽(27)
  • Solidity智能合約開發(fā) — 3.2-合約的fallback和函數(shù)重載

    每個(gè)智能合約有且僅有一個(gè)未命名的函數(shù),稱為fallback函數(shù),沒有參數(shù)且沒有返回值,可見性必須是 external,且可以是 virtual的(即可以被重載),也可以有修改器 modifier。 fallback執(zhí)行條件: 如果在一個(gè)合約的調(diào)用中,沒有其他函數(shù)與給定的函數(shù)標(biāo)識(shí)符匹配時(shí)(或沒有提供調(diào)用

    2024年02月09日
    瀏覽(18)
  • 以太坊智能合約開發(fā):Solidity 語(yǔ)言快速入門

    以太坊智能合約開發(fā):Solidity 語(yǔ)言快速入門

    在本文中,我們從一個(gè)簡(jiǎn)單的智能合約樣例出發(fā),通過對(duì)智能合約源文件結(jié)構(gòu)的剖析與介紹,使大家對(duì)Solidity語(yǔ)言有一個(gè)初步的認(rèn)識(shí)。最后,我們將該智能合約樣例在 Remix 合約編譯器中編譯、部署,觀察其執(zhí)行結(jié)果。 在開始之前,我們先對(duì)Solidity有個(gè)初步的了解,即Solidity是

    2023年04月09日
    瀏覽(32)
  • solidity智能合約實(shí)例開發(fā)(2)(解釋+注釋)——食品溯源

    solidity智能合約實(shí)例開發(fā)(2)(解釋+注釋)——食品溯源

    項(xiàng)目總要求 創(chuàng)建三個(gè)角色生產(chǎn)者,分銷商,零售商,并分別通過三個(gè)角色對(duì)產(chǎn)品的生產(chǎn),分銷,零售上鏈,并且能夠分別查出上鏈的全信息。包括每次交易的時(shí)間戳,每次交易的交易名稱,每次交易的交易地址,每次交易的食品質(zhì)量,食品的名稱,當(dāng)前交易的名稱,當(dāng)前交易

    2024年02月06日
    瀏覽(37)
  • 基于以太坊的智能合約開發(fā)Solidity(基礎(chǔ)篇)

    基于以太坊的智能合約開發(fā)Solidity(基礎(chǔ)篇)

    參考教程:基于以太坊的智能合約開發(fā)教程【Solidity】_嗶哩嗶哩_bilibili (1)程序編譯完成后,需要在虛擬機(jī)上運(yùn)行,將合約部署好后便可執(zhí)行剛剛編寫的函數(shù)。(注意, 合約一旦部署,就會(huì)永久存在于區(qū)塊鏈上,且不可篡改 ,不過可以銷毀) (2)執(zhí)行完成后,可以得到以

    2024年02月04日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包