솔리디티 문법 (연동 상속)

taeheeyoon·2022년 12월 29일
0

Blockchain 이론

목록 보기
14/14
post-thumbnail

외부 컨트랙트 함수 호출

솔리디티의 한 컨트랙트에서 다른 컨트랙트의 함수를 호출하는 방법은 크게 2가지가 있습니다.
첫번째 방법은 컨트랙트의 이름을 사용해서 멤버함수를 호출하는 방법입니다.
두번째 방법은 컨트랙트의 주소를 이용하여 주소의 멤버함수인 call, delegate call 또는 static call 등의 함수를 통해 컨트랙트 함수를 호출하는 방법이 되겠습니다.

일반적으로 call 함수가 가장 많이 사용이 됩니다.
delegate call 같은 경우에는 호출하는 컨트랙트의 컨텍스트를 유지할 때 사용하고, static call의 경우에는 call과 유사하긴하지만 상태변수를 변경하지 않을 때 주로 사용이 됩니다.

address 자료형의 멤버함수인 call 함수는 bytes 자료형의 데이터를 입력 인자로 사용하고, bool형과 bytes 자료형을 리턴합니다. call의 함수인자에는 호출하려는 함수의 시그니처와 함수에 전달될 파라미터들을 인코딩하여 bytes 자료형으로 변환한 다음에 사용합니다.
call 함수는 2개의 리턴값을 가지는데, 첫번째 리턴값은 함수호출의 성공여부를 나타내는 bool 값, 두번째 리턴값은 호출된 함수의 리턴값을 bytes 자료형으로 변환한 값이 되겠습니다.

address의 또 다른 멤버함수인 delegatecall 함수의 문법적 형식은 call 함수와 동일합니다.다만 call 함수를 포함한 일반적인 함수 호출은 호출되는 컨트랙트의 컨텍스트에서 실행되는 반면, delegatecall을 사용할 경우에는 호출하는 컨트랙트의 컨텍스트에서 실행된다는 점이 차이가 되겠습니다. 예를 들자면, delegatecall 함수로 호출된 함수에서 참조하는 트랜잭션의 발신자라든가, 상태변수, 저장공간,그리고 msg, 메시지 객체, 이더리움 잔고 등은 호출하는 컨트랙트에서 참조하는 값과 동일하게됩니다.

라이브러리 사용 방법

솔리디티에서 라이브러리는 컨트랙트와 유사한 형태와 기능을 가지고 있지만, 독립적인 컨트랙트 계정, 즉 CA로 동작하지 않고 코드의 재사용을 돕기위해서 존재하는 개념입니다. 라이브러리 함수들은 호출하는 컨트랙트의 컨텍스트에서 실행되는데, 내부적으로는 delagatecall 함수의 작동과 매우 유사하다고 볼 수가 있습니다.
using 이라는 키워드를 사용하면 라이브러리를 자료형처럼 사용하는 것도 가능합니다 . 예를 들자면 L이라는 라이브러리와 T라는 자료형이 있을 때 using L for T라고 선언하면 라이브러리 L을 자료형 T로 사용하겠다는 의미가 됩니다. 다르게 해석하면 자료형 T를 라이브러리 L의 객체처럼 사용하겠다는 의미가 되겠습니다. 이 경우 자료형 T는 라이브러리 L의 모든 함수를 사용할 수 있으며, 특히 T 자료형의 객체 스몰x가, A의 함수를 실행할 경우, x는 첫 번째 인자값으로 사용이 되기도 합니다.
라이브러리가 별도의 파일로 존재할 경우 import 라는 키워드를 사용해서 현재 컨트랙트 소스 코드에 추가 할 수가 있습니다. 또한 import 키워드는 다른 용도로 사용할 수 있는데요. Import의 대상에 포함된 상태변수의 심볼들을 접근하기 위해서 사용하는 경우도 있습니다.

컨트랙트 상속과 함수 오버라이딩

컨트랙트 상속

솔리디티는 일반적인 객체지향 언어와 유사한 방법으로 상속, Inheritance의 개념을 지원하기도 합니다. A라는 컨트랙트가 B라는 컨트랙트를 상속받을 때는 contract A is B라는 형식으로 선언하며, 이 때 자식 컨트랙트 A가 부모 컨트랙트 B의 변수와 함수를 모두 상속받아 사용할 수 있다는 의미가 되겠습니다. 상속을 사용할 경우에는, 최종적인 자식 컨트랙트를 배포하면, 모든 부모 컨트랙트가 포함되어 하나의 컨트랙트 계정에 배포가 됩니다. 이 때 생성자는 보통 부모, 자식의 이 순서로 자동으로 실행이 됩니다. 예를 들자면 Derived is Base1, Base2 라고 선언할 경우, Base1, Base2, Derived의 순서로 생성자가 자동으로 실행이 됩니다.

함수 오버라이딩

보통 상속에서 많이 사용되는 기능은 함수 오버라이딩인데요. 오버라이딩이란 부모 컨트랙트에서 정의된 함수의 기능을 자식 컨트랙트에서 변경해서 사용하는 것을 의미합니다. 함수 오버라이딩을 사용하려면 부모 컨트랙트의 함수를 virtual 키워드로 선언해야 하고요, 그리고 자식 함수에서는 override라는 키워드를 붙여서 그 함수를 표시 해줘야 합니다. 만약에 다수의 컨트랙트를 상속받아 함수 오버라이딩을 사용 하는 경우가 있다면 그때는 모든 부모 컨트랙트의 이름을 모두 override 파라미터에 명시해야 합니다. 참고로 함수 변경자 즉, function modifier도 동일한 방법으로 오버라이딩이라는 개념을 제공하고 있습니다.

추상 컨트랙트와 인터페이스

추상 컨트랙트

일반적인 객체지향 언어처럼, 솔리더티에도 상속 용도로만 만들어지는 추상 컨트랙트, Abstract Contract 라는개념이 제공이 되고 있습니다. 추상 컨트랙트는 하나 이상의 함수가 구현되지 않은 컨트랙트를 말하며, 이는 독립적으로 배포되기 보다는 다른 자식 컨트랙트에서 상속 용도로만 사용하겠다는 의미가 되겠습니다. 심지어 모든 함수가 구현되어도, abstract 키워드를 컨트랙트 앞에 붙이면 이 컨트랙트는 추상 컨트랙트가 되겠습니다.

인터페이스

인터페이스라는 개념도 있는데요. 이는 추상 컨트랙트와 매우 유사하지만, 다만 모든 함수가 구현되지 않아야 합니다. 모든 함수는 external 유형을 갖고, 다른 컨트랙트를 상속하는 것은 불가능하고, 인터페이스가 인터페이스를 상속하는 것은 가능합니다. 그리고 인터페이스 안에서는 생성자함수 및 상태 변수를 선언 및 정의하는 것은 불가능합니다.

profile
생각하는 대로 살지 않으면, 사는 대로 생각하게 된다.

0개의 댓글