반응형


1. 송금 예제 코드


1
2
3
4
5
6
7
8
9
10
11
12
pragma solidity ^0.4.8;
 
contract RecvEther{
    address public sender;
    uint public recvEther;
    
    function() payable{
        sender = msg.sender;
        recvEther += msg.value;
    }
}
 
cs




위의 그림은 http://remix.ethereum.org에서 솔리디티 코드 에디터를 이용하고 있다.


우선 위의 예제를 통해 무슨 말을 하고 있는지 확인해보자.


위와같이 코드를 작성한 후 compile부분에서 auto compile을 체크 한 후 Run 부분으로 온다.



이제 Create 부분을 누르고 로그창에서 detail을 누르면 다음과 같이 나타난다.


현재 하나의 컨트랙트가 생성되었고 그 컨트랙트에 대한 정보를 나타낸다.


gas는 gaslimit로 트랜잭션 수행에 소비될 총 가스량에 대한 추정치를 의미하고

input은 컨트랙트가 바이트코드로 변경된 것을 의미한다.





가장 위에 있던 코드는 송금을 하는 예시 코드이다.


Value에 30 ether을 입력하고 fallback을 눌러서 트랜잭션을 날려보자.


그러면 해당 트랜잭션에 대한 결과들이 나타난다.


마지막으로 sender까지누른 후 recvEther에 30이더가 왔음을 확인하자.





2. 솔리티디에서 Time 사용 방법


시간 단위 

초 

단위 

seconds 

minutes 

60 

60초 

hours 

3600 

60분 

days 

86400 

24시간 

weeks 

604800 

7일 

years 

31536000 

365일 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
pragma solidity ^0.4.19;
 
contract TimeUintSample{
    uint public startTime;
    
    function start(){
        startTime = now;
        startTime = block.timestamp;
    }
    
    function minutesAfter(uint min) constant returns (bool){
        if(startTime == 0)
            return false;
        return ((now - startTime) / 1 minutes >= min);
    }
    
    function getSeconds() constant returns (uint){
        require(startTime > 0);
        return (now - startTime);
    }
}
cs



startTime :: 이 컨트랙트에서 start 함수가 실행되는 순간 시간이 담기게 된다.


start() :: 현재 시간 기준으로 startTime에 담게된다. 참고로 now == block.timestamp이다.


minutesAfter(uint min) :: 'min'분이 지났는지 확인해준다. 예를들어 현재 startTime을 만든지 1분이지났는데 min에 2를 넣고 함수를 실행하면 false를 반환한다.(아직 2분이 안지났으므로)


getSeconds() :: 현재 몇초 지났는지 확인 할 수 있게 도와준다.





3. 솔리디티 전역 변수 몇가지 


전역 변수 

데이터형식 

설명 

block.blockhash(uint blockNumber) 

bytes32 

 지정된 블록 해시 값

block.coinbase 

address 

해당 블록 채굴자 주소 

block.number 

uint 

 해당 블록의 번호

block.timestamp 

uint 

해당 블록의 타임스탬프 

msg.sender 

address 

솔금자 주소(현재 이 함수를 call한 사람) 

msg.value 

uint 

송금액 

now 

uint 

alias block.timestamp 






4. 상속이 아닌 상태에서 다른 컨트랙트 값 참조


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
pragma solidity ^0.4.19;
 
contract A{
    uint public num = 10;
    function getNum() constant external returns (uint){
        return num;
    }
}
 
contract B{
    A a = new A();
    address public addr;
    function setA(A _a){
        addr = _a;
    }
    
    function aNum() constant returns (uint){
        return a.num();
    }
    
    function aGetNum() constant returns (uint){
        return a.getNum();
    }
 }
cs



A 컨트랙트에 num = 10으로 설정하고

getNum은 external로 설정해본다. (이때 public도 되지만 우리가 배운 내용을 기반으로한다면 external은 외부 컨트랙트에서 호출을 허용해 준다.)


B 컨트랙트에서 aNum을 호출하거나 aGetNum을 호출하는 방식의 차이는


aNum은 A 컨트랙트의 변수를 호출하는 것이고

aGetNum은 A 컨트랙트의 함수를 호출하는 차이이다.






5. 계약 파기 소스 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
pragma solidity ^0.4.19;
 
contract SelfDestructSample{
    address public owner = msg.sender;
    
    function() payable{
        
    }
    
    function close(){
        require(msg.sender == owner);
        
        selfdestruct(owner); // == suicide(owner);
    }
    
    function Balance() constant returns (uint) {
        return this.balance;
    }
}
cs

 

이 과정에서는 close를 호출하기 전에는 owner이나 Balance를 이용 할 수 있지만

close를 호출하여 selfdestruct를 하게되면 owner이나 Balance를 이용 할 수 없게 된다.








반응형

'Applied > Blockchain' 카테고리의 다른 글

Solidity 블랙리스트 구현  (0) 2018.05.05
Sollidity 토큰 Contract 예제문  (0) 2018.05.04
Solidity 프로그래밍 기초 - 2  (0) 2018.05.02
이더리움 가스(Ethereum Gas)  (2) 2018.05.01
Solidity 프로그래밍 기초 - 1  (2) 2018.04.30