Skip to main content

Ledger v8.1.2 release notes

For the complete documentation index, see llms.txt
  • Version: v8.1.2
  • Date: August 24, 2026

High-level summary​

Ledger 8.1.2는 보안 패치입니다. 추후 보안 문제로 이어질 수 있던 여러 인코딩 엄격성 이슈를 수정하고, 저수준 역직렬화를 강화하여 비정규(non-canonical) 인코딩과 타입 불변식을 위반하는 값을 디코딩하지 않고 거부하도록 했습니다. 이 릴리스는 공개 배포에 앞서 메인넷 노드에 먼저 적용되었습니다.

모든 버전 범프는 patch 수준으로 통일해 개별 변경이 더 넓은 semver 함의를 갖더라도 릴리스가 하나로 읽히도록 했으며, 내부 의존성 요구 사항은 새 정확 버전으로 고정해 소비자가 수정 이전 버전으로 해석되지 않도록 했습니다.

Audience​

이번 릴리스 노트는 다음 개발자에게 가장 관련이 깊습니다.

  • 노드 개발자

Summary of updates​

  • 보안: serialize, base-crypto, storage, onchain-state, onchain-vm, transient-crypto 전반의 저수준 역직렬화를 강화했습니다. 정규 형식이 아닌 인코딩과 타입 불변식을 위반하는 값은 이제 디코딩 대신 거부됩니다. 이는 역직렬화 가능한 범위를 좁힙니다. 8.1.2 노드는 8.1.1 노드가 받아들이던 데이터를 거부합니다. 개별 규칙은 crate별 changelog를 참고하세요.
  • 수정: DustParameters::time_to_cap이 0으로 나누는 대신 generation_decay_rate가 0인 경우를 방어합니다.
  • 수정: Dust seq 증가 연산이 포화(saturate) 처리됩니다.
  • 수정: Zswap binding randomness 추출이 추출할 witness가 없는 proof preimage에서 더 이상 panic하지 않습니다.
  • 수정: normalize_deltas의 delta 누적이 포화 처리됩니다.
  • 수정: contract call 비용 회계가 입력을 실제로 구성해 길이를 구하는 대신, 포화 산술과 함께 ContractCall::public_inputs_len으로 public input 개수를 셉니다.

New features​

이번 릴리스에는 새로운 기능이 없습니다.

New features requiring configuration updates​

이번 릴리스에는 해당 사항이 없습니다.

Deprecations​

이번 릴리스에는 deprecation이 없습니다.


Breaking changes or required actions​

이번 보안 변경은 악의적으로 구성된 트랜잭션이 존재하는 환경에서만 breaking입니다. 비정규 인코딩이면서도 이전에는 디코딩되던 값이 이제는 디코딩되지 않습니다.


Bug fixes and quality improvements​

ComponentDescription
serializeHashMap과 HashSet 역직렬화는 정규화된 인코딩(정렬됨, 중복 키 없음)을 요구합니다. 같은 값으로 디코딩되던 비정규 인코딩은 거부됩니다.
serialize더 작은 형식에 들어가는 값을 4바이트 형식으로 인코딩한 비정규 ScaleBigInt 인코딩은 거부됩니다.
serializeBox<T> 역직렬화가 재귀 깊이 예산에 산입됩니다.
serializeVec::with_bounded_capacity가 zero-sized 타입에 대해 더 이상 0으로 나누지 않습니다.
serializeHashMap과 HashSet에 대한 serialized_size가 길이 prefix의 실제 폭을 반영합니다.
base-crypto비정규 Value 및 ValueAtom 인코딩이 거부됩니다. 단일(singleton) 값을 다중 엔트리 형식으로 인코딩한 경우와, 1바이트 형식에 들어가는 atom을 여러 바이트로 인코딩한 경우입니다.
base-cryptoAlignedValue 역직렬화가 선언된 alignment에 들어가지 않는 값을 거부합니다.
base-cryptoDuration::from_hours가 overflow 대신 포화 처리됩니다.
storageMerklePatriciaTrie 역직렬화가 annotation 일관성만이 아니라 완전한 구조적 정규성을 강제합니다. 구조가 내용으로 유일하게 결정되지 않는 trie는 더 이상 디코딩되지 않습니다.
storage선언된 nibble 길이가 인코딩된 path 길이와 일치하지 않는 Extension 노드는 거부됩니다.
storageMultiSet이 count가 0인 엔트리를 거부합니다.
storageset 표현과 time-map 표현이 일치하지 않는 TimeFilterMap 인코딩을 거부합니다.
storagenibble로 인코딩된 키가 디코딩 후 남은 후행(trailing) 바이트를 거부합니다.
onchain-runtimeOp 역직렬화가 적법한 인코딩 범위를 벗어난 피연산자를 거부합니다. n >= 16인 dup·swap·ins, 그리고 path 길이가 1..=16을 벗어난 idx가 해당합니다.
onchain-runtimeserde StateValue 역직렬화가 타입 불변식을 강제합니다.
onchain-runtime엔트리가 16개를 초과하는 배열의 type을 취하는 것은 범위를 벗어난 태그 바이트를 만드는 대신 타입 오류가 됩니다.
onchain-runtimeidx와 ins의 Merkle tree 경계 검사가 큰 tree 높이에서도 더 이상 overflow하지 않습니다.
transient-cryptoVerifierKey 직렬화가 키 초기화 여부와 무관해집니다. in-place 초기화가 키의 직렬화 결과를 더 이상 바꾸지 않습니다.
transient-crypto인코딩된 키 뒤에 후행 바이트가 있는 verifier key는 거부되어, 두 인코딩이 같은 키로 매핑될 수 없습니다.
ledgerDustParameters::time_to_cap이 0으로 나누는 대신 generation_decay_rate가 0인 경우를 방어합니다.
ledgerDust seq 증가 연산이 포화 처리됩니다.
ledgercontract call 비용 회계가 입력을 실제로 구성해 길이를 구하는 대신, 포화 산술과 함께 ContractCall::public_inputs_len으로 public input 개수를 셉니다.
zswapbinding randomness 추출이 추출할 witness가 없는 proof preimage에서 더 이상 panic하지 않습니다.
zswapnormalize_deltas의 delta 누적이 포화 처리됩니다.
coin-structure, storage-core, zkir강화된 serialize, base-crypto, storage-core, transient-crypto 역직렬화를 반영합니다.

Known issues​

이번 릴리스에는 새로운 알려진 이슈가 없습니다.