반응형
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | pragma solidity ^0.4.19; contract CrocusCoin{ string public name; string public symbol; uint8 public decimals; uint public totalSupply; mapping (address => uint) public balanceOf; mapping (address => int8) public blackList; address public owner; modifier onlyOwner() { require(msg.sender == owner); _; } event Transfer(address indexed from, address indexed to, uint value); event Blacklisted(address indexed target); event DeleteFromBlacklist(address indexed target); event RejectedPaymentToBlacklistedAddr(address indexed from, address indexed to, uint value); event RejectedPaymentFromBlacklistedAddr(address indexed from, address indexed to, uint value); function CrocusCoin(uint _supply, string _name, string _symbol, uint8 _decimals){ balanceOf[msg.sender] = _supply; name = _name; symbol = _symbol; decimals = _decimals; totalSupply = _supply; owner = msg.sender; } function blacklisting(address _addr) onlyOwner{ blackList[_addr] = 1; Blacklisted(_addr); } function deleteFromBlacklist(address _addr) onlyOwner{ blackList[_addr] = 0; DeleteFromBlacklist(_addr); } function transfer(address _to, uint _value){ require(balanceOf[msg.sender] >= _value); require(balanceOf[_to] + _value >= balanceOf[_to]); if(blackList[msg.sender] == 1) RejectedPaymentFromBlacklistedAddr(msg.sender, _to, _value); else if(blackList[_to] == 1) RejectedPaymentToBlacklistedAddr(msg.sender, _to, _value); else{ balanceOf[msg.sender] -= _value; balanceOf[_to] += _value; Transfer(msg.sender, _to, _value); } } } | cs |
mapping (address => int8) public blackList;
mapping을 통해 블랙리스트 주소를 맵에 담아준다.
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
각 함수마다 require로 처리 가능하지만, 제어자로도 해결 할 수 있다.(코드가 더 간결해진다.)
event Blacklisted(address indexed target);
event DeleteFromBlacklist(address indexed target);
event RejectedPaymentToBlacklistedAddr(address indexed from, address indexed to, uint value);
event RejectedPaymentFromBlacklistedAddr(address indexed from, address indexed to, uint value);
블랙리스트에 관한 이벤트를 생성한다.
이벤트는 결국 블록체인상에 남겨지는 증거 기록들을 의미한다.
function blacklisting(address _addr) onlyOwner{
blackList[_addr] = 1;
Blacklisted(_addr);
}
function deleteFromBlacklist(address _addr) onlyOwner{
blackList[_addr] = 0;
DeleteFromBlacklist(_addr);
}
블랙리스트로 추가되면 1이 되고 제거되면 0이 된다.
function transfer(address _to, uint _value){
require(balanceOf[msg.sender] >= _value);
require(balanceOf[_to] + _value >= balanceOf[_to]);
if(blackList[msg.sender] == 1)
RejectedPaymentFromBlacklistedAddr(msg.sender, _to, _value);
else if(blackList[_to] == 1)
RejectedPaymentToBlacklistedAddr(msg.sender, _to, _value);
else{
balanceOf[msg.sender] -= _value;
balanceOf[_to] += _value;
Transfer(msg.sender, _to, _value);
}
}
if문부터 보면 보내는자 혹은 받는자가 블랙리스트면 이벤트 발생시키고
그게 아니라면 송금을 처리해준다.
이때 각 함수마다 이벤트가 있음을 확인하자.
해싱된 주소로만 파악하기 힘들기에 저렇게 이벤트를 통해 간결하게 로그를 남길 수 있다.
반응형
'Applied > Blockchain' 카테고리의 다른 글
Solidity를 이용한 존재 증명 계약 (0) | 2018.05.15 |
---|---|
Solidity 회원관리 예제 (0) | 2018.05.14 |
Sollidity 토큰 Contract 예제문 (0) | 2018.05.04 |
Solidity 기초 예제코드 및 분석- 3 (0) | 2018.05.02 |
Solidity 프로그래밍 기초 - 2 (0) | 2018.05.02 |