iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 4
0

導言

本次範例將會以smart contract創建Todo list,把blockchain當成是資料庫,將資料記錄在鏈上,並且透過solidity設計4個操作功能,包刮建立任務、讀取任務、更新任務、刪除任務,最後將會解釋如何使用solidity語法寫出類似object形式的資料,以address當作個人身分,將這些資料映射到指定的address上。

程式碼

pragma solidity^0.4.25;
contract Todo{
    uint256 public taskLength;
    mapping(address=>string[]) public taskLists;
    //mapping (address=> mapping(int=> string)) public taskListss;
    function create(string _task) public returns(bool){
    	taskLists[msg.sender].push(_task);
    	return true;
    }
    function update(uint _index, string _task) public returns(bool){
        taskLists[msg.sender][_index] = _task;
        return true;
    }
    function deletes(uint _index) public returns(bool){
        delete taskLists[msg.sender][_index];
        return true;
    }
    function totalAmount() public{
        taskLength = taskLists[msg.sender].length;
    }
    
}

解說

mapping(address=>string[]) public taskLists

在solidity裡,array只能放同一種type的參數,所以在宣告的時候,會是string[]int[]uint[]bool[]...;mapping 為映射的意思,以key-value的形式紀錄資料,筆者習慣把它形容是在solidity的JSON object,以這個例子解釋,可以看做是這樣的形式
taskLists = {address : ["string","string","string"]}

function create(string _task) public returns(bool){ taskLists[msg.sender].push(_task); }
  • 執行create() funnction 建立新的任務,成功會回傳true。

如何將參數放進mapping type的變數呢?方法基本和javascript object使用一樣,以例子的宣告解釋,value的位置為array type,所以語法會是變數[key].push(value)在指定的address push 一筆string type的參數,最後回傳true

function update(uint _index, string _task) public returns(bool){ taskLists[msg.sender][_index] = _task; }
  • 執行 update() function更新任務資料,成功會回傳true。

修改mapping也和javascript object修改一樣,新的值覆蓋舊的值,taskLists[address][index] = 新的value

function delete(uint _index) public returns(bool){ delete taskLists[msg.sender][_index]; }
  • 執行 delete() function刪除指定的任務,成功會回傳true。

delete在solidity 會將指定的變數回歸資料屬性的初始值,例如string會變空值、int or uint會變0、[]array的部分可以將全部index清空或是只刪除指定的index


上一篇
Day2-Simple Token
下一篇
Day4-User
系列文
30天30個Smart contract 20
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言