Getting started with solidity

Restricting Access

하나의 컨트랙트 내의 속성들은 다른 컨트랙트에서 접근 될 수 없는 것이 기본이며, public 키워드를 명식적으로 사용함에 따라 다른 컨트랙트에서도 접근이 가능하게 된다.

또다른 접근 제한자로는 modifier 가 있는데, 이는 특정 함수에 지정하여 해당 함수를 호출하기 전에 자격에 맞지 않으면 접근을 제한 할 수 있는 기능을 제공한다.

contract AccessRestriction {
	modifier onlyBy(address _account)
    {
        require(
            msg.sender == _account,
            "Sender not authorized."
        );
        // Do not forget the "_;"! It will
        // be replaced by the actual function
        // body when the modifier is used.
        _;
    }
}

Data types

memory and storage

solidity 에서 memory 와 storage 를 이루는 데이터 chunk 의 크기는 32bytes 이다.

memory 란 모든 함수 call 마다 새롭게 할당되는 임시 데이터 저장소로 이 메모리에 읽기, 쓰기 등의 작업을 수행할 때마다 가스비가 올라간다.

variables

솔리디티에서 변수는 memory address 를 가르치는 포인터이다.

array

solidity 에서 array 의 첫번째 인자는 그 array 의 길이값을 저장한다.

Bytes

solidity 에서 bytes 는 동적으로 할당되는 byte array 이며, 그 크기는 32byte 이다. 또한, solidity 에서 변수는 memory address 를 가르치는 포인터이므로 해당 포인터로 부터 32 바이트를 더해주면 실제로 해당 bytes 의 값이 저장된 주소값을 얻을 수 있다.

b = new bytes(32);
add(b, 32); // b의 값이 저장된 주소값

mstore(add(b, 32), x); // b=x

Events

Event 는 솔리디티에서 일종의 로깅의 역할을 수행한다. 이더리움 상에서 일어나는 다양한 활동들에 대한 내역을 추적하고, 사용자 데이터를 자정하기 위해 이더리움은 로그 시스템을 적용하였으며, Event 의 발생은 일종의 로그 형태로 저장된다.

DAPP 개발자는 이더리움의 RPC 인터페이스를 통해 이러한 이벤트들을 구독할 수 있다. Topic 은 이러한 이벤트들을 찾을 수 있도록 해주며, 가령 특정 컨트랙트에서 발생한 로그들을 듣는 등의 일들을 할 수 있다.

여기서 각 이벤트를 정의할 때 다음과 같이 indexed 옵션을 주면, 이렇게 구독을 하는 중에 해당 속성을 읽을 수 있다. 만약 indexed 옵션을 주지 않으며, ABI 인코딩된 데이터가 내려오게 된다.

contract ExampleContract {
    event ExampleEvent(
        address indexed _from,
        bytes32 indexed _id,
        uint _value
    );
}