간단히 예를 들어 A 와 B 컨트랙이 있다고 가정하였을때, B에서 A 의 함수나 변수들을 접근하여 사용하고 싶다면
A 인스턴스를 만들어 B 컨트랙 안에서 사용하면 됩니다.
// SPDX-License-Identifier:GPL-30
pragma solidity >= 0.7.0 < 0.9.0;
contract A{
uint256 public a = 5;
function change(uint256 _value) public {
a = _value;
}
}
contract B{
}
예를 들어 저희는 현재 B 컨트랙에서 A 컨트랙에 접근하여, 변수 a 와 change 함수를 사용해보려고 합니다
그러면, 일단 A를 B컨트랙에서 인스턴스화 해야 접근이 가능하겠죠?
contract B{
A instance = new A();
}
인스터스는 위오 같이 하시면 됩니다.
컨트랙이름 인스터스의 이름 = new 컨트랙이름();
이런식으로 간단하게 인스턴스를 정의가 가능해요.
인제 인스터스를 이용해 접근해야하는데 접근할때는 . 을 붙여서 이동한답니다.
예를들어서, instance.change(_value) 할 수 있습니다.
밑에를 보시면,
// SPDX-License-Identifier:GPL-30
pragma solidity >= 0.7.0 < 0.9.0;
contract A{
uint256 public a = 5;
function change(uint256 _value) public {
a = _value;
}
}
contract B{
A instance = new A();
function get_A() public view returns(uint256) {
return instance.a();
}
function change_A(uint256 _value) public {
instance.change(_value);
}
}
현재 스마트컨트랙 B 에서, A 의 instance 는 . 붙여 접근함을 볼 수가 있어요.
get_A 에서는 컨트랙 A의 변수를 접근해야하니 instance.a()를 써준걸 알 수가 있어요.
그리고 한가지더, 변수를 접근할때는 () 를 붙여 주셔야 리턴이 된답니다.
change_A에서는 instance.change(_value) 로 해줌으로써, 컨트랙 A의 함수 change를 접근할걸 알 수가 있습니다.
한가지 더 유의 하실 점은 instance 는 A 스마트 컨트랙의 분신과 같은 존재입니다.
즉 스마트컨트랙 A를 따로 배포하고, 인스턴스 A를 스마트컨트랙 B를 통해서 배포한다고 가정하였을때,
이 두개의 컨트랙은 완전히 다르답니다.
그렇기 때문에, instance를 만들어서 변수 a의 값을 변경한다해도, 스마트컨트랙 A 자체만 따로 배포한곳에는 값에 영향을 주지가 않아요.