比如我們要記錄下用戶最新簽到的時(shí)間, 我們可以這么來寫.
contract Hello {
mapping (address => uint256) signedMap;
//返回當(dāng)前時(shí)間
function nowInSeconds() internal view returns (uint256) {
return now;
}
//簽到
function signed() public {
signedMap[msg.sender] = nowInSeconds();
}
//獲取上次簽到時(shí)間
function getLastSignedTime() public view returns (uint256) {
return signedMap[msg.sender];
}
}
如果增加需求, 允許用戶刪除簽到數(shù)據(jù), 我們?cè)黾尤缦麓a.
function unsigned() public {
delete signedMap[msg.sender];
}
上面的代碼, 是完全公正的, 只能用戶自己添加, 刪除, 查看
如果改一下需求, 允許管理員讀取, 刪除數(shù)據(jù). 這個(gè)時(shí)候我們需要對(duì)執(zhí)行者進(jìn)行判斷(msg.sender
), 以及增加管理員相關(guān)的代碼.
contract Hello {
address admin;
mapping (address => uint256) signedMap;
modifier onlyAdmin() {
require(msg.sender == admin);
_;
}
constructor() public {
admin = msg.sender;
}
function getVal() public view returns (uint256) {
return msg.value;
}
//返回當(dāng)前時(shí)間
function nowInSeconds() internal view returns (uint256) {
return now;
}
//簽到
function signed() public {
signedMap[msg.sender] = nowInSeconds();
}
//獲取上次簽到時(shí)間
function getLastSignedTime() public view returns (uint256) {
return signedMap[msg.sender];
}
//取消簽到
function unsigned() public {
delete signedMap[msg.sender];
}
//管理員刪除用戶簽到
function adminUnsigned(address addr) onlyAdmin public {
delete signedMap[addr];
}
//管理員獲取用戶簽到時(shí)間
function adminGetLastSignedTime(address addr) onlyAdmin public {
return signedMap[addr];
}
}
執(zhí)行
這里使用truffle開發(fā)工具. 部署
truffle.cmd develop
migrate --reset
在Hello的構(gòu)造函數(shù)指定了合約發(fā)布者(即用戶0)為管理員.
//導(dǎo)出實(shí)例
Hello.deployed().then(inst => {Hello = inst});
//用戶1自己簽到
Hello.signed({from:web3.eth.accounts[1]})
//用戶1獲取簽到時(shí)間
Hello.getLastSignedTime({from:web3.eth.accounts[1]})
//管理員獲取用戶1簽到時(shí)間
Hello.adminGetLastSignedTime(web3.eth.accounts[1], {from:web3.eth.accounts[0]})
//用戶2(非管理員)獲取, 執(zhí)行失敗
Hello.adminGetLastSignedTime(web3.eth.accounts[1], {from:web3.eth.accounts[2]})
//刪除簽到
Hello.unsigned({from:web3.eth.accounts[1]})
以上只是一個(gè)簡單的例子, 介紹了下智能合約的運(yùn)用. 前2個(gè)需求就是無中心, 最后一個(gè)需求則引入了中心(管理員),
就意味著合約上的數(shù)據(jù)可能被管理員修改. 但是用戶還是能通過區(qū)塊鏈瀏覽器來追宗數(shù)據(jù)的修改. 這點(diǎn)還是好過傳統(tǒng)的服務(wù)器, 改了你都沒法證明.
當(dāng)然智能合約能起來寫的東西非常多, 就看怎么運(yùn)用了.