【solidity】eventとemitでブロックチェーン上にトランザクションを記録する

目次

eventemitについて学んだ記録


1_0 eventについて


solidity_logo

solidityをコーディングしているとよく出てくるeventについて。

まず、前提として、contract構文の中で記述する内容です。

eventとは簡単にいうと、「ブロックチェーン上のトランザクションに記録すること」

以下の例では、「TokenURIChanged」というeventを記述しています。

  • ①address indexed toは、「送り先のアドレス」
  • ②uint256 indexed tokenIdは、「数値型のトークンのID(何番目に発行されたトークンか)」
  • ③string uriは、「文字列のURI(NFTを識別するコード)」

これらを記録する。と言う認識で大丈夫だと思います。

例えば、「誰にどのtokenId,URIでNFTをmint(作成)したか」を記録する際などに使います。

    event TokenURIChanged(
        address indexed to,
        uint256 indexed tokenId,
        string uri
    );

なお、indexedは、eventパラメータの修飾子で、このindexedを付与することで、etherscan(トランザクションなどが確認できるツール)などで検索しやすくなるという利点があります。

etherscanのリンク


2_0 emitについて


emitとは、eventを発火させる際に使用します。

つまり、emitが実行されたタイミングでeventの内容が記録されるという理解で良いです。

以下のコードは、NFTをmint(作成)するコードです。

NFTを作成した後に、emitで「TokenURIChanged」と言うeventを呼び出し、上記①〜③までの情報をブロックチェーン上に記録すると言う意味合いです。


    function nftMint(address to, string calldata uri) external onlyOwner {
        _tokenIds.increment(); //0を1増やして「1」にする
        uint256 newTokenId = _tokenIds.current(); //さらにここで1増やす
        _mint(to, newTokenId); //NFT作成
        _setTokenURI(newTokenId, uri); //newTokenIdにuriを紐づける

        emit TokenURIChanged(to, newTokenId, uri);
        ^^^^//ここのemitのタイミングで「TokenURIChanged」のeventが発火
    }