Solidity Instance

kich555·2021년 11월 12일
0

Solidity

목록 보기
5/6

인스턴스 생성하기

Solidity 에서 하나의 contract에서 다른 contract에 접근하기 위해서는
Instance를 사용해야한다.

pragma solidity ^0.8.10;

contract A{
uint256 public a = 5;
  
  function change(uint256 _value) public {
    a = _value
  }
}

contract B{

  A instance = new A(); // instance의 이름은 임의로 지정할 수 있다.
  
  function get_A() public view returns(uint256) {
    return instance.a(); // ()를 붙혀야 a의 값인 5 가 반환됨
  }
  
  function change_A(uint256 _value) public {
    instance.change(_value);
  }
}

인스턴스 활용하기

pragma solidity >= 0.7.0 < 0.9.0;

contract A{
  
  string public name;
  uint256 public age;
  
  constructor(string memory _name, uint256 _age) {
    name = _name;
    age = _age;
  }
  
  function change(string memory _name, uint256 _age) public {
      name = _name;
      age = _age;
  }

}


contract B{
  
  A instance = new A('Alice', 52);
  
  function change(string memory _name, uint256 _age) public{
      instance.change(_name,_age);
  }
  
  function get() public view returns(string memory, uint256) {
    return (instance.name(), instance.age());
  }
  
}

위 코드에서 contract B에서 contract A를 인스턴스화 하였는데,

  constructor(string memory _name, uint256 _age) {
    name = _name;
    age = _age;
  }

contract A에 생성자 함수인 constructor()를 선언함으로써

contract B에서 A를 인스턴스화 할때 초기값을 넣어줄 수 있다.

이때 contract A 자체는 deploy할 수 없지만,
인스턴스 화 한 후 초기값을 넣어 줌으로써
contract A의 구조를 활용할 다른 많은 contract들을 생성하기 쉽게 만들 수 있다.

//contract B를 deploy 할 경우 아래의 값이 나온다.
// name = 'Alice'
// age = 52
// change(_name,_age)
// get() 

인스턴스화 단점

인스턴스화의 단점은 위 코드에서와 같이 contract B에서 A를 인스턴스화 하면
contract B는 contract A자체를 가져오는 것이기 때문에
가스비가 많이들기 때문이다.

또 하나의 문제는 이더리움에서는 블록 당 가스의 양이 정해져있다는 것이다.

만약 내 smart contract의 가스비가 블록의 가스제한량을 초과한다면, Error를 호출하며
deploy를 실패하게 된다.

profile
const isInChallenge = true; const hasStrongWill = true; (() => { while (isInChallenge) { if(hasStrongWill) {return 'Success' } })();

0개의 댓글