본문 바로가기

기술/BlockChain

[solidity] 솔리디티 잡지식

SOLIDITY 에서 Message 스트럭쳐의 기본 변수들 내용

msg.data (bytes): complete calldata
msg.gas (uint): remaining gas - deprecated in version 0.4.21 and to be replaced by gasleft()
msg.sender (address): sender of the message (current call)
msg.sig (bytes4): first four bytes of the calldata (i.e. function identifier)
msg.value (uint): number of wei sent with the message



외부에서 이더리움을 받아올 수 있는 컨트랙트 만드는 법

contract C {
    function C() {}
    function () payable {}
}
여기서 2번째 함수는 default function이라는 문법이다.




solidity modifier, _;


Solidity 개발을 공부하다보면 오픈소스들에 Modifier라는 생소한 문법이 보인다.

그리고 Modifier 구역을 보면 _; 라는 문장이 보이는데, 나는 이것이 뭘 뜻할지 상상이 안갔다.


열심히 공부해본 결과 Modifier는 말 그대로 모듈처럼 동기화 시키는 듯한 문법이다.

예를들어 어떤 컨트랙트에서 함수를 선언하고 그 함수가 현재 컨트랙트를 실행시킨 user만 사용가능하게 하고 싶다면,


1
2
3
4
5
6
7
8
modifier onlyOwner{
    if(msg.sender != owner) throw;
    _; <=== 여기에 original code가 들어간다.
}
 
function setContractInformation(string info) onlyOwner{
    contractInformation = info;
}
cs


이렇게 사용할 수 있다. 

modifier를 사용하지 않는다면 함수 첫머리에 if 조건문으로 걸어놓긴 하면 되지만,

이렇게 modifier를 사용하면 코드도 간결하고 유지보수도 쉽고 

function에 onlyOwner가 있느냐 없느냐에 따라서

쉽게 제한사항을 파악할 수 있기 때문에 가독성도 향상된다.


위 코드는 아래처럼 해석될 수 있겠다.

1
2
3
4
function setContractInformation(string info) onlyOwner{
    if(msg.sender != owner) throw;
    contractInformation = info;
}
cs


_; 는 본문코드의 시작을 알리는 문장으로 해석하면 되겠다.




decimal


decimal이 1이면 1은 10으로 표현.  즉 뒤에오는 0의 개수라고 보면된다.

정수와 실수는 메모리에 저장되는 방식이 다르다. 

정수가 실수보다 더 적은 메모리 공간을 사용하기 때문에 복잡하지만,

Decimal이 존재한다.

이더리움의 Decimal은 18이다. 

즉 1이더리움을 표현하려면 1000000000000000000로 해야한다.

이것을 쉽게 표현한 단위가 1 wei 이다.

이더리움에는 여러 단위가 있다.

그중 가장 작은 단위가 wei이다. 

이더리움 관련 코드를 쓸 때도 wei가 기본 단위이다.

마치 달러의 penny와 같은 개념? 으로 보면 될 것 같다.