程式麻瓜打造區塊鏈網站8-資料儲存Mapping&Event


Mapping 是一種陣列,陣列是用來儲存資料的,像是班級成績單就是一個陣列,一個班級成績單會有欄和列,欄可能放姓名,列就放成績,如下圖

將上方的成績表化成Mapping:

step1.宣告陣列, 將名字當作索引對應到成績

mapping(索引型別=>對應值型別) public 陣列名稱; 宣告如下:

mapping(string => uint) public classtranscript;

step2.填入各個索引的對應值

classtranscript [小王] = 100;

classtranscript [曉明] = 50;

classtranscript [阿明] = 60; ……

// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
contract mapping1 {
mapping (string=>uint) public classtranscript;
constructor () public {
classtranscript ["xiaowan"] = 100;
classtranscript ["xiaomin"] = 50;
//以下省略
}
}
透過remix查詢曉明成績

填入對應值後若要對對應值以索引做運算直接打出mapping名稱和索引即可對應值

uint public c;
constructor () public {
classtranscript [“xiaowan”] = 100;
classtranscript [“xiaomin”] = 50;
c= classtranscript [“xiaomin”]+1;
}
//c值為51

智能合約在運作的時候會產生很多資訊,像是目前的合約餘額、和合約互動者的地址、某些參數的數值或字串等,如果我們希望在進行某個函式的時候順便把這些資訊記錄下來的話就需要用到event,使用event需要先宣告

event 事件名稱 ( 資訊型別1 代稱1,資訊型別2 代稱2, 資訊型別3 代稱3); 如下我們做一個event讓同學留言並記錄留言者地址和當下時間的event:

event classbulletin ( string message, address student,  uint now);

觸發event用emit:

emit classtranscript(要輸入到代稱1的參數或值, 要輸入到代稱2的參數或值);

function updatebulletin(string saysomething)public{
emit classbulletin ( saysomething, msg.sender, now);
}