Semantic Versioning 시의 ^, ~, = 의 의미

npm 혹은 Solidity 등은 Semantic Versioning을 사용해서 버전을 정합니다. Semantic Version은 MAJOR.MINOR.PATCH 형식의 버전 명을 말합니다. https://semver.org/ 를 참고해 봅시다.

MAJOR의 경우, 이전과 호환되지 않는 변경이 있는 경우 올립니다.
MINOR의 경우, 이전과 호환되지만 기능 추가 등 주요 변경이 있는 경우 올립니다.
PATCH의 경우, 이전과 호환되고, 버그 수정, 내부 리팩토링 등의 변경이 있는 경우 올립니다.

현재 프로젝트에서 사용하는 버전을 지정할 때 ^, ~, – 등의 기호로 지정하는데 다음과 같은 뜻을 갖습니다.

^ (캐럿): 마이너 버전이나 패치 버전으로 호환되는 업데이트를 할 수 있습니다. 예를 들어, “^1.2.3″을 지정한 경우, 1로 시작하고 2.3보다 크거나 같은 마이너 또는 패치 버전을 말합니다. 따라서 1.2.3, 1.2.4, 1.3.0 등은 해당되지만 2.0.0은 해당되지 않습니다.

~ (틸더): 패치 버전만 호환되는 업데이트를 할 수 있습니다. 예를 들어, “~1.2.3″을 지정한 경우, 1.2로 시작하는 패치 버전이 3보다 크거나 같은 모든 버전을 말합니다. 따라서 1.2.3, 1.2.4는 해당되지만 1.3.0은 해당되지 않습니다.

= (이퀄): 지정한 정확한 버전만 말합니다. 예를 들어 “1.2.3”을 지정한 경우, 정확히 1.2.3만 해당됩니다.

[Solidity] Panic exception code

  1. 0x00: Used for generic compiler inserted panics.
  2. 0x01: If you call assert with an argument that evaluates to false.
  3. 0x11: If an arithmetic operation results in underflow or overflow outside of an unchecked { ... } block.
  4. 0x12; If you divide or modulo by zero (e.g. 5 / 0 or 23 % 0).
  5. 0x21: If you convert a value that is too big or negative into an enum type.
  6. 0x22: If you access a storage byte array that is incorrectly encoded.
  7. 0x31: If you call .pop() on an empty array.
  8. 0x32: If you access an array, bytesN or an array slice at an out-of-bounds or negative index (i.e. x[i] where i >= x.length or i < 0).
  9. 0x41: If you allocate too much memory or create an array that is too large.
  10. 0x51: If you call a zero-initialized variable of internal function type.

from https://docs.soliditylang.org/en/latest/control-structures.html#panic-via-assert-and-error-via-require

[ethers.js] bytecode(=creationCode) 얻기

contract 컴파일 후 bytecode(creationCode)를 얻으려면:

(await ethers.getContractFactory("DasomOLIContract")).bytecode

이걸 keccak256()으로 돌리면(ethersV5 기준)

> ethers.utils.keccak256((await ethers.getContractFactory("DasomOLIContract")).bytecode)

위는 solidity에서 다음을 하는 것과 동일하다.

keccak256(abi.encodePacked(type(DasomOLIContract).creationCode));

[ethers.js] Contract 시그니처와 hash 확인

const ca = await ethers.getContractFactory("DasomToken");
const cabi = ca.interface;
cabi.format() // Fragments 확인
cabi.forEachFunction((func, index) => { console.log(func.format()); }); // 각 함수의 시그니처 확인
cabi.forEachFunction((func, index) => { console.log(func.format(), ethers.keccak256(ethers.toUtf8Bytes(func.format()))); }); // 시그니처와 해시 값 확인.

[Mythril] myth analyze 시 import 에러

Mythril은 ConsenSys의 smart contract의 보함 결함을 점검해주는 툴이다. analyze를 통해 분석을 하려고 할 때 openzeppelin 등을 사용한 컨트랙트의 경우 solc의 import 에러를 겪을 수 있다.

$ myth analyze contracts/dasomoli.sol 
mythril.interfaces.cli [ERROR]: Solc experienced a fatal error.

ParserError: Source "@openzeppelin/contracts/token/ERC20/IERC20.sol" not found: File not found. Searched the following locations: "".
 --> contracts/dasomoli.sol:6:1:
  |
6 | import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

solc를 command line에서 사용할 때는 아래와 같이 remap을 해주면 된다.

solc @openzeppelin/=$(pwd)/node_modules/@openzeppelin/ contracts/dasomoli.sol
Compiler run successful, no output requested.

myth 사용 시에는 이를 json 파일을 만들어 --solc-json 옵션을 통해 줄 수 있다.

  • solc.json
{
   "remappings": [ "@openzeppelin/=/Users/dasomoli/src/smartcontract/node_modules/@openzeppelin/" ]
}
$ myth analyze --solc-json solc.json contracts/dasomoli.sol 
The analysis was completed successfully. No issues were detected.

참고