本次範例將會以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; }
修改mapping
也和javascript object修改一樣,新的值覆蓋舊的值,taskLists[address][index] = 新的value
function delete(uint _index) public returns(bool){ delete taskLists[msg.sender][_index]; }
delete
在solidity 會將指定的變數回歸資料屬性的初始值,例如string
會變空值、int or uint
會變0、[]
array的部分可以將全部index清空或是只刪除指定的index