Blockchain

Solidity Tutorial

하늘을난모기 2018. 4. 21. 17:57

1. Payable 키워드

  • 계약 계정 외부에서 이더를 송금 받을 수 있게 함.
  • 즉, 계약이 A에게 송금을 받으려면 A가 호출하는 함수에 payable 키워드가 있어야함. function send() payable public { ~~ }

2. 메세지 프로퍼티 (Message Properties)

  • msg 프로퍼티를 활용해 계약을 호출한 사람이 보낸 메시지 확인
  • msg 정보
정보 타입 설명
data byte 호출데이터
sender address 계약을 호출한 이더리움 주소
value uint 계약 주소로 보낸 Ether량
gas uint gas limit에서 함수를 호출하고 남은 가스

3. Transfer 함수

  • 계약이 다른사람에게 이더를 전송.
  • <받는 사람의 주소>.transfer(<송금할 금액>); function buy() public { seller.transfer(10); }

4. 수수료(gas)

  • 함수를 실행할 때 수수료가 듬.
  • 수수료를 아끼끼 위해 view나 pure같은 키워드 사용. string message = "hello solidity"; function setMessage() public { uint count = 10; // 128614 gas 소모 // uint count = 100; // 1093133 gas 소모 for(uint i=0; i<count; i++) { message = "hello transaction"; } }

5. 트랜잭션

  • Smart Contract로 생성되는 장부 및 기록
  • 트랜잭션에 담긴 정보
정보 설명
transactionHash 트랜잭션 해시값
transactionIndex 트랜잭션 인덱스 값
blockHash 트랜잭션이 추가된 블록 해시값
blockNumber 트랜잭션이 추가된 블록의 번호
gasUsed 트랜잭션 호출에 사용된 가스량
cumulativeGasUsed 누적으로 사용된 가스량
contractAddress 계약 주소
logs event로 로깅된 정보

6. pragma solidity ^0.4.18;

  • 솔리디티 버전을 나타내는 코드

7. 접근 제어자

접근 제어자 설명 특징
public 외부에서 호출 가능. 접근 제어자를 명시하지 않은 함수는 public으로 선언됨
public으로 상태 변수 선언 시 자동으로 getter 함수 생성
internal 상속 받은 계약에서만 호출 가능 접근 제어자를 명시하지 않은 상태 변수는 internal로 선언됨
private 해당 계약에서만 호출 가능 상속 받은 계약도 호출 불가
external 인터페이스의 함수 external로 선언한 상태 변수/함수의 경우 내부이세 호출 불가.

8. View 함수

  • 수수료(gas)가 들지 않음.
  • 상태를 변경하지 않음. (데이터를 읽을 순 있되 수정 불가 == readOnly) uint year = 2018; function test() public view returns (uint) { return year/100; }

9. Pure 함수

  • 수수료(gas)가 들지 않음.
  • 블록체인 네트워크에 기록된 데이터에 일절 접근하지 않음.
  • 파라미터로 주어지지 않은 상태 변수는 읽거나 쓸 수 없음. function test(uint year) public pure returns (uint) { return year/100; }

10. Structs (구조체)

  • 다양한 자료형을 묶어서 관리 (C언어의 구조체와 동일) ``` struct Person { string name; uint age; address wallet; }

Person p = Person("mos",25,0xfe3...); p.age += 1; ```

11. 맵핑 (mapping)

  • 형태의 자료구조 ``` mapping (address => uint) public balances; // key : address , value : uint

function open(uint _balance) public { balances[msg.sender] = _balance; } ```

12. 이벤트 (event)

  • 계약이 수행된 정보는 트랜잭션으로 남음. 이 트랜잭션에 기록하고 싶은 사항이 있다면 이벤트를 사용. ``` // indexed 키워드가 붙은 데이터는 log 검색 시 사용할 수 있음. event BuySomethings( address indexed _buyer, uint256 _value );

function buy() payable public { seller.transfer(msg.value); BuySomethings(msg.sender, msg.value); } ```

13. 오류처리 (Error Handling)

require(bool 조건) : 조건을 만족하지 않으면 오류 발생 function half(uint x) { require(x%2==0); // 짝수일 때만 허용 }

14. 함수 제어자 (Function Modifires)

  • 커스텀 할 수 있는 제어자
  • modifier키워드로부터 안전 ``` modifier onlyOwner(address owner) { require(msg.sender == owner); _; // 모든 실행 조건을 만족할 경우 }

function admin(address person) public onlyOwner(person) { ~~ } ```

'Blockchain' 카테고리의 다른 글

비트코인 정리  (1) 2018.10.04