Skip to content

솔리디티 개발

MoSangIl edited this page Sep 10, 2021 · 11 revisions

1. 구조체 활용 방법 (방만들기)

 Room 구조체 선언

struct Room {
        uint256 roomNumber;
        string name;
        string menu;
    }

Rooms 배열

    // Array with all rooms
    Room[] public rooms;

Room 생성

function createRoom(uint256 _roomNumber, string memory _name, string memory _menu) public returns(bool) {
        Room memory newRoom;
        newRoom.roomNumber = _roomNumber;
        newRoom.name = _name;
        newRoom.menu = _menu;

        rooms.push(newRoom);
      
        return true;
    }

호출 예시

truffle console --network development

Demo.deployed().then(function(instance) {return instance.createRoom(1, 'BBQ', 'Chicken')})
Demo.deployed().then(function(instance) {return instance.createRoom(2, 'KFC', 'Hamberger')})
Demo.deployed().then(function(instance) {return instance.createRoom(3, 'BHC', 'Chicken2')})

ROOM 조회

 function getRoomsById(uint _roomId) public view returns(
        uint256 roomNumber,
        string memory name,
        string memory menu) {

        Room memory room = rooms[_roomId];
        return (
            room.roomNumber,
            room.name,
            room.menu);
    }

호출 예시

truffle console --network development

Demo.deployed().then(function(instance) {return instance.getRoomsById.call(0)})
Demo.deployed().then(function(instance) {return instance.getRoomsById.call(1)})
Demo.deployed().then(function(instance) {return instance.getRoomsById.call(2)})

* 룸갯수
Demo.deployed().then(function(instance) {return instance.getRoomCounts.call()})
ref) 1. 블록체인 원장에 가스비를 소모하여 데이터를 넣을 때 createRoom(1, 'BBQ', 'chicken') -> 함수명만 쓴다.
     2. 블록체인 원장에서 가스비를 소모하지 않고 단순히 데이터를 읽어올 때 getRoomsById.call(0) -> 함수명.call을 쓴다.

2. 이더 전송!

EOA to CA

const getBalance = await instance.getBalance({
      from: accounts[0],
      value: 100,
    });

CA to EOA & CA to CA

  • targetAddr => 이더를 전송 받는 계좌
  • 함수가 정의된 CA 에서 targetAddr로 해당 이더만큼 전송됨
function transferTo(address payable targetAddr) public {
    targetAddr.transfer(10);
  }

fallback 함수

  • fallback함수는 CA to CA에서 주의해야할 부분이다.
  • 이더를 전송받는 CA의 컨트랙트에는 아래와 같은 fallback 함수가 반드시 정의되어 있어야 한다.
function() external payable{}

3. 컨트랙트 인스턴스 사용방법

컨트랙트 A code

pragma solidity ^0.5.2;

contract A{
    uint public num = 10;
    function getNum() view  external returns (uint){
        return num;
    }
    function setNum(uint _num) public{
        num = _num;
    }
}

컨트랙트 B template code

pragma solidity ^0.5.2;
import "./A.sol";

contract B {
    // A 타입 배열 선언
    A[] a_s;

    // A 인스턴스 생성 및 배열 삽입
    // A 인스턴스의 getNum 함수 호출
    // A 인스턴스의 setNum 함수 호출
}

컨트랙트 B에서 컨트랙트 A 인스턴스 생성

  • new 키워드를 사용한다. (java와 같음)
contract B {
  // A 타입 배열 선언
  A[] a_s;

  // A 인스턴스 생성 및 배열 삽입
  function makeA() public {
    A a = new A();
    a_s.push(a);
  }
    // A 인스턴스의 getNum 함수 호출
    // A 인스턴스의 setNum 함수 호출
}

인스턴스 A의 함수 호출

  • <인스턴스>.[함수이름] (params...)
contract B {
  // A 타입 배열 선언
  A[] a_s;

  // A 인스턴스 생성 및 배열 삽입
  function makeA() public {
    A a = new A();
    a_s.push(a);
  }
  // A 인스턴스의 getNum 함수 호출
  function getANumber(uint256 id) public returns(uint) {
    A a = a_s[id];
    return a.getNum();
  }
  // A 인스턴스의 setNum 함수 호출
  function setANumber(uint id, uint _num) public {
      A a = a_s[id];
      a.setNum(_num);
  }
}

Test Code

> truffle console
> B.deployed().then(function(instance) {app = instance})
> app.makeA()
> app.getANumber.call(0)
=> 10
> app.setANumber(20)
> app.getANumber.call(0)
=> 20