이전글
[솔리디티] 15. 인터페이스
이전글 [솔리디티] 14. 상속, 오버라이딩, 다중 상속 이전글 [솔리디티] 13. receive, fallback, delegatecall 이전글 [솔리디티] 12. Payable, Transfer, Send, Call 이전글 [솔리디티] 11. 에러 처리 이전글 [솔리디티]
kwjdnjs.tistory.com
import, 라이브러리
이번 글에서는 솔리디티의 import와 라이브러리에 대해 알아보겠습니다.
1. import
솔리디티에서는 다른 프로그래밍 언어들과 유사하게 외부 파일에 정의된 컨트랙트를 import로 불러올 수 있습니다. 실제로 워크스페이스에 두 개의 sol 파일을 생성해 하나의 sol 파일에서 다른 sol 파일의 컨트랙트를 불러와보겠습니다.
먼저 Math.sol에는 다음 코드를 입력하겠습니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
contract Math {
function add(uint a, uint b) external pure returns (uint) {
return a + b;
}
}
그다음 Import.sol에 다음 코드를 입력하겠습니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
import "./Math.sol";
contract Import {
Math public math = new Math();
uint a = 2;
uint b = 3;
function func() public view returns (uint) {
return math.add(a, b);
}
}
위 코드는 import로 Math.sol 파일을 불러온 뒤 Math 컨트랙트를 Import 컨트랙트 내부에서 생성하여 사용하는 방식으로 동작합니다. 위 코드처럼 new 키워드를 사용하면 컨트랙트 내부에서 컨트랙트를 선언할 수 있습니다.
컨트랙트가 아닌 함수도 import를 이용해 불러올 수 있습니다.
먼저 Math.sol 코드를 다음과 같이 수정합니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
function add(uint a, uint b) pure returns (uint) {
return a + b;
}
그다음 Import.sol을 수정합니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
import { add } from "./Math.sol";
contract Import {
uint a = 2;
uint b = 3;
function func() public view returns (uint) {
return add(a, b);
}
}
수정 결과 이전 코드와 유사하게 동작함을 확인할 수 있습니다.
2. 라이브러리
라이브러리는 컨트랙트와 유사한 개념으로, 컨트랙트와는 다르게 상태 변수를 선언하거나 이더를 전송할 수 없습니다. 라이브러리로 유용한 함수들을 미리 정의해 놓으면 필요할 때마다 쉽게 불러와 사용할 수 있습니다.
다음과 같이 library를 이용해 라이브러리를 생성합니다. 그리고 라이브러리 이름과 함수 이름을 이용해 라이브러리에 있는 함수에 접근합니다. 참고로 라이브러리의 모든 함수를 internal로 선언할 경우, 컨트랙트 배포 과정에서 라이브러리가 컨트랙트에 포함되어 배포됩니다. 만약 external이나 public으로 함수를 선언할 경우, 라이브러리를 별도로 배포하여 컨트랙트에서 라이브러리 주소로 함수를 요청해야 합니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
library Math {
function add(uint a, uint b) internal pure returns (uint) {
return a + b;
}
}
contract Test {
uint a = 2;
uint b = 3;
function func() public view returns (uint) {
return Math.add(a, b);
}
}
추가적으로 라이브러리는 using을 사용할 수 있습니다. 다음과 같이 'using Math for uint'라고 입력하게 되면 uint 자료형에 Math의 기능을 더한다는 의미가 됩니다. 따라서 해당 컨트랙트에서는 다음과 같이 uint로 선언된 자료형에 add 함수를 사용할 수 있게 됩니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
library Math {
function add(uint a, uint b) internal pure returns (uint) {
return a + b;
}
}
contract Test {
using Math for uint;
uint a = 2;
uint b = 3;
function func() public view returns (uint) {
return a.add(b);
}
}
3. 외부 라이브러리 임포트
import를 이용하면 다른 사람이 미리 제작해 둔 외부 라이브러리를 사용할 수 있습니다. 예를 들어 OpenZeppelin에서 제공하는 라이브러리 중 Math 라이브러리를 임포트 할 경우, 다음과 같이 github 링크를 입력하는 것으로 해당 라이브러리를 사용할 수 있습니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/math/Math.sol";
contract Test {
uint a = 2;
uint b = 3;
function func() public view returns (uint) {
return Math.max(a, b);
}
}
지금까지 import와 라이브러리에 대해 알아봤습니다. 감사합니다.
다음글
[솔리디티] 17. ERC-20 토큰
이전글 [솔리디티] 16. import, 라이브러리 이전글 [솔리디티] 15. 인터페이스 이전글 [솔리디티] 14. 상속, 오버라이딩, 다중 상속 이전글 [솔리디티] 13. receive, fallback, delegatecall 이전글 [솔리디티] 12.
kwjdnjs.tistory.com
'이더리움 > 솔리디티' 카테고리의 다른 글
[솔리디티] 18. ERC-721 NFT (0) | 2023.08.18 |
---|---|
[솔리디티] 17. ERC-20 토큰 (0) | 2023.08.12 |
[솔리디티] 15. 인터페이스 (0) | 2023.08.09 |
[솔리디티] 14. 상속, 오버라이딩, 다중 상속 (0) | 2023.08.07 |
[솔리디티] 13. receive, fallback, delegatecall (0) | 2023.08.04 |