Skip to main content

Hex에서 Bech32m으로 — Midnight가 선택한 더 안전하고 똑똑한 주소 체계

· 4 min read
DevRel
Midnight DevRel team

Midnight 생태계의 새로운 기본 주소 형식인 Bech32m을 소개합니다. 오류 감지 기능이 내장된 읽기 쉬운 주소 형식입니다.

Midnight은 이제 지갑 주소와 공개 키의 기본 형식으로 Bech32m을 사용합니다. 이번 변경으로 가독성, 안전성, 메타데이터 명확성이 향상됩니다. Hex은 지원 중단되었지만, 하위 호환성을 위해 당분간 계속 지원합니다. dApp 마이그레이션 방법은 아래를 참고하세요.

이 글에서는 이번 변경의 의미, 중요한 이유, 그리고 애플리케이션에 적용하는 방법을 다룹니다.

Why Move Away From Hex?

16진수(base-16) 인코딩은 단순하고, 도구 지원이 폭넓으며, 형식이 간결하여 블록체인 주소 표현에 오랫동안 기본으로 사용되어 왔습니다. 바이너리 데이터를 직접 저수준으로 표현하므로, 머신 파싱과 개발자 통합에 용이합니다. 하지만 hex에는 현대 블록체인 애플리케이션에 필요한 핵심 기능이 빠져 있습니다. 오류 감지 기능이 없어 복사-붙여넣기 실수가 생기기 쉽고, 네트워크나 주소 유형 같은 컨텍스트 정보도 제공하지 않아 사용자 대면 시스템에서 모호함과 위험이 커집니다.

Introducing Bech32m

이러한 hex 인코딩의 한계를 해결하기 위해, 블록체인 생태계에서는 Bitcoin SegWit용으로 처음 개발된 읽기 쉬운 주소 형식인 Bech32을 도입했습니다. Bech32m은 이 형식의 개선 버전으로, Taproot 같은 새로운 암호학적 구성을 지원하도록 설계되었습니다. 현재 Midnight 생태계에서 사용하고 있습니다. Bech32m은 hex과 달리 시각적으로 혼동하기 쉬운 문자(예: 0 vs O)를 제외한 base-32 문자 세트로 데이터를 인코딩합니다. 또한 오타나 잘못된 복사로 인한 오류를 감지하는 강력한 체크섬이 포함되어 있습니다.

Bech32m 문자열은 세 부분으로 구성됩니다. 첫째, 네트워크와 주소 유형을 식별하는 읽기 쉬운 접두사(HRP)입니다. 예를 들어 Midnight 테스트넷의 경우 mn_shield-addr_test입니다. 둘째, 구분자(1)입니다. 셋째, 실제 데이터(코인 공개 키, 암호화 공개 키 등)가 담긴 인코딩된 페이로드입니다. 결과적으로 사용자가 다루기 더 안전하고 쉬울 뿐 아니라, 메타데이터가 풍부하여 명확성과 보안이 중요한 탈중앙화 애플리케이션에 훨씬 적합합니다.

Where Bech32m Is Used in Midnight

Bech32m 채택은 단일 라이브러리에 국한되지 않습니다. Midnight 지갑 생태계 전반에 걸친 조율된 전환입니다. Wallet SDK 4.0, Wallet API 4.0, DApp Connector API v2.0, 그리고 최신 Midnight Lace Wallet 출시와 함께, Bech32m이 지갑 주소와 공개 키의 기본 인코딩이 되었습니다. 모든 핵심 컴포넌트가 기본적으로 Bech32m 인코딩 필드를 노출하도록 업데이트되었으며, 레거시 hex 필드는 지원 중단으로 표시되었습니다. 아직 16진수 형식에 의존하는 dApp과 인프라도 원활하게 마이그레이션할 수 있도록 하면서, 안전성과 미래 대비성을 유지합니다.

DAppConnectorWalletState 인터페이스에서 실제로 어떻게 적용되는지 확인하세요:

interface DAppConnectorWalletState {
address: string; // ✅ Bech32m-encoded address

/** @deprecated please use the `address` field instead. */
addressLegacy: string;

coinPublicKey: string; // ✅ Bech32m-encoded coin public key

/** @deprecated please use the `coinPublicKey` field instead. */
coinPublicKeyLegacy: string;

encryptionPublicKey: string; // ✅ Bech32m-encoded encryption public key

/** @deprecated please use the `encryptionPublicKey` field instead. */
encryptionPublicKeyLegacy: string;
}

Backward Compatibility and Migration

Bech32m이 이제 기본 형식이지만, 레거시 hex 필드는 Legacy 접미사를 통해 여전히 접근할 수 있습니다. 다만 이 필드들은 공식 지원이 중단되었으며 향후 버전에서 제거될 예정입니다. dApp이나 도구가 아직 hex 값을 사용한다면, SDK에서 변환 유틸리티 패키지를 제공합니다:

import { decodeBech32mAddress } from '@midnight-ntwrk/wallet-sdk-address-format';

const hexAddress = decodeBech32mAddress(address);

이 유틸리티를 활용하면 레거시 시스템과 호환성을 유지하면서 Bech32m 형식으로 점진적으로 전환할 수 있습니다.

What You Should Change

DApp Connector API나 Wallet SDK를 통해 지갑 상태를 사용하고 있다면, 다음을 확인하세요:

addressLegacy → address로 전환

coinPublicKeyLegacy → coinPublicKey로 전환

encryptionPublicKeyLegacy → encryptionPublicKey로 전환

✅ 필요한 경우 @midnight-ntwrk/wallet-sdk-address-format으로 변환

예시:

import { decodeBech32mAddress } from '@midnight-ntwrk/wallet-sdk-address-format';

const hex = decodeBech32mAddress("mtst1q0yz7f64vu...");

TL;DR: Bech32m Is Now the Default

✅ Bech32m이 모든 지갑 관련 패키지에서 주소/공개 키의 기본 형식입니다

❌ Hex 형식 필드(addressLegacy, coinPublicKeyLegacy 등)는 지원 중단되었습니다

🛠️ 마이그레이션은 간단합니다. 이미 제공된 새 필드와 타입을 사용하면 됩니다

🔁 레거시 hex 값은 하위 호환성을 위해 당분간 사용할 수 있습니다

📦 dApp을 개발 중이라면, Wallet SDK 4.0.0과 이전 버전을 모두 지원하는 midnight-js@1.0.0을 사용하세요. Bech32m 주소와의 호환성도 지원합니다.

💬 마이그레이션에 대한 질문이나 dApp 업데이트에 도움이 필요하신가요? Discord의 #dev-corner에서 문의하세요.

✅ Migration Checklist

  • addressLegacy 대신 address 사용
  • coinPublicKeyLegacy 대신 coinPublicKey 사용
  • encryptionPublicKeyLegacy 대신 encryptionPublicKey 사용
  • 필요한 변환에 @midnight-ntwrk/wallet-sdk-address-format 사용