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를 실패하게 된다.