본문 바로가기
블록체인

[Solidity] Solidity 문법정리 (2)

by 테크케찰 2022. 6. 12.

2022.06.11 - [블록체인] - [Solidity] Solidity 문법 정리 (1)

 

[Solidity] Solidity 문법 정리 (1)

https://docs.soliditylang.org/en/v0.8.14/ Solidity — Solidity 0.8.14 documentation 1. Understand the Smart Contract Basics If you are new to the concept of smart contracts we recommend you to get s..

eloquence-developers.tistory.com

 

이 게시물은 이전 게시물인 solidity 문법 정리 (2) 와 이어지는 게시물입니다.

매핑(mapping)

javascript의 Map이나 java의 haspmap과 비슷한 역할을 하는 친구입니다.
key-value 관계로 데이터를 저장하는 것이 특징입니다.

mapping (uint => string) userIdToName;
// 값 저장
userIdToName[1]="jason";
// 값 호출
userIsToName[1] // jason

msg.sender

msg.sender는 현재 함수를 호출한 사람(혹은 스마트 컨트랙트)의 주소를 가리킵니다.
여기 msg는 이더리움 플랫폼에 발행한 메시지 호출에 대한 내용을 담은 변수입니다.

require

function myFunction(uint a, uintb){
    require(a==b); // a, b가 같은지 확인하고 같지 않다면 함수를 종료하고 에러 발생
    return a+b;
}

require과 비슷하게 assert도 조건식이 거짓인 경우 예외를 발생시키는데요, assert는 함수의 에러를 테스트하기 위한 용도라는 점에서 차이를 보입니다.

위의 require는 ifrevert를 사용해서도 구현할 수 있는데요, 아래와 같이 구현할 수 있습니다.

function myFunction(uint a, uintb){
    if(a!=b) revert();
    return a+b;
}

revert가 호출되면 전체 트랜잭션이 실패하고 트랜잭션에서 발생한 벽여 내용이 트랜잭션 실행 이전 상태로 돌아가게 됩니다.

상속

상속은 아래와 같이 구현할 수 있습니다.
이 경우에는 A가 B의 함수들을 모두 접근할 수 있게 됩니다.

contract A{}
// A가 B를 상속  
contract A is B{} 

Storage와 Memory

storage와 memory는 변수명 앞에 붙여주게 되며 저장할 수 있는 공간을 의미합니다.

  • storage: 영구적으로 저장
  • memory: 임시적으로 저장

인터페이스(interface)

solidity에서 인터페이스는 java에서의 인터페이스의 의미가 비슷해 보입니다.
자식 컨트랙트를 위한 틀이며, 추상함수로만 구성되어야 한다고 합니다.

  • 추상함수: 함수의 이름, 입력 매개변수, 출력만 선언하고 내용을 없는 함수 (틀만 있는 함수)

인터페이스는 몇가지 특징을 가집니다.

  • 다른 contract는 상속할 수 없으나 interface는 상속할 수 있습니다.
  • contract가 public이더라도 interface 내에서 선언된 함수는 모두 external이어야 합니다.
  • constructor, 상태 변수, modifier를 선언할 수 없습니다.

interface에 대한 추가적인 정보는 공식 문서에서 더 얻을 수 있습니다.

cryptoZombie의 lecture에서는 contract 선언자를 이용해서 인터페이스를 정의해주는데요, 최신 버전에서는 interface 선언자를 이용해서 인터페이스를 정의해줍니다.

interface NumberInterface {
  function getNum(address _myAddress) public view returns (uint);
}

다수의 반환값

javascript의 구조분해할당과 비슷한 문법으로 보입니다.

function multipleReturns() internal returns(uint a, uint b, uint c) {
  return (1, 2, 3);
}

function processMultipleReturns() external {
  uint a;
  uint b;
  uint c;
  (a, b, c) = multipleReturns();
  (,,c) = multipleReturns(); // 하나의 값만 받는 경우
}

if

if의 사용 방법은 다른 언어의 if문 사용과 똑같습니다.

출처

https://velog.io/@yooni/Solidity-Interface