testnet
GitHub EN

프리컴파일 사용자 정의 오류

mechanism developer

프리컴파일이 구조화되고 Solidity와 호환되는 오류 데이터를 반환하는 메커니즘입니다.

프리컴파일 사용자 정의 오류는 Cosmos SDK 모듈의 네이티브 Go 오류를 표준 Solidity 사용자 정의 오류로 변환하는 기능입니다. 이는 불투명하고 일반적인 revert에 비해 우수한 개발자 경험을 제공합니다. 프리컴파일 호출이 실패하면, dApp은 revert 데이터를 디코딩하여 실패 원인을 정확히 파악하고, 어떤 주소가 승인되지 않았는지와 같은 관련 컨텍스트에 접근할 수 있습니다.

작동 방식

이 프로세스는 precompiles/okrw/errors.go에 구현되어 있습니다. 프리컴파일의 Go 로직이 기본 Cosmos 모듈에서 오류(예: sdkerrors.ErrUnauthorized)를 잡으면, mintErrorToRevert와 같은 매핑 함수가 호출됩니다. 이 함수는 특정 오류 유형을 식별하고 헬퍼(예: packUnauthorizedMinterError)를 사용하여 revert 데이터를 구성합니다. 이 데이터는 Solidity 오류의 4바이트 함수 선택자(예: bytes4(keccak256("UnauthorizedMinter(address,address)")))와 ABI 인코딩된 오류 인자로 구성됩니다. 이 바이트 배열은 EVM으로 반환되어, Ethers.js와 같은 클라이언트나 try/catch를 사용하는 다른 스마트 컨트랙트가 파싱할 수 있는 데이터와 함께 트랜잭션이 되돌려지게 합니다.

장점

1. 명확성: 실패에 대한 구체적이고 기계가 읽을 수 있는 이유를 제공합니다.
2. 가스 효율성: 사용자 정의 오류로 되돌리는 것이 설명 문자열로 되돌리는 것보다 가스 효율적입니다.
3. 구성 가능성: 다른 스마트 컨트랙트는 이러한 특정 오류를 잡고 실패 유형에 따라 조건부 로직을 구현할 수 있습니다.
4. 향상된 UX: 프론트엔드는 오류를 파싱하여 "귀하는 승인된 발행자가 아닙니다. 발행자는 0x...입니다."와 같은 사용자 친화적인 메시지를 표시할 수 있습니다.

예시: `UnauthorizedMinter`

OKRW 프리컴파일에서 발행자가 아닌 주소가 mint를 호출하면, x/okrw 모듈은 sdkerrors.ErrUnauthorized를 반환합니다. mintErrorToRevert 함수는 이를 잡고, 모듈 파라미터에서 현재 승인된 발행자의 주소를 찾아 호출자의 주소와 승인된 발행자의 주소를 모두 UnauthorizedMinter(address,address) 오류 형식으로 패킹합니다. 그러면 EVM은 이 구조화된 데이터와 함께 되돌립니다.
소스: maroo
ESC
검색어를 입력하세요