반응형
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 => uintpublic 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문부터 보면 보내는자 혹은 받는자가 블랙리스트면 이벤트 발생시키고


그게 아니라면 송금을 처리해준다.



이때 각 함수마다 이벤트가 있음을 확인하자. 


해싱된 주소로만 파악하기 힘들기에 저렇게 이벤트를 통해 간결하게 로그를 남길 수 있다.








반응형