μ—°κ²° 쀑…
μ—°κ²° 쀑…
전체 보기
BQ
Telegram Β· @BQTelegram

πŸ“Œ ZK κ°œλ°œμžκ°€ μ•Œμ•„μ•Ό ν•  핡심 κ°œλ… 1편: μœ ν•œμ²΄ - μ˜€λ²„ν”Œλ‘œμš°κ°€ μ‚¬λΌμ§€λŠ” 세계

κ²Œμ‹œ
2025.08.27 00:44
쑰회
1,494
ν¬μ›Œλ“œ
7
이미지
1μž₯
BQ@BQTelegram


μ•ˆλ…•ν•˜μ„Έμš”, BQκ°œλ°œμžμž…λ‹ˆλ‹€.

ZK κ°œλ°œμ„ μ‹œμž‘ν•˜λ €λŠ” 뢄듀을 μœ„ν•œ μ‹œλ¦¬μ¦ˆλ₯Ό μ‹œμž‘ν•©λ‹ˆλ‹€.

첫 μ£Όμ œλŠ” μœ ν•œμ²΄μž…λ‹ˆλ‹€.

Circom이든 Noir이든, λͺ¨λ“  ZK μ–Έμ–΄λŠ” μœ ν•œμ²΄ μœ„μ—μ„œλ§Œ λ™μž‘ν•©λ‹ˆλ‹€.
일반 μ •μˆ˜κ°€ μ•„λ‹ˆλΌμš”. 이걸 λͺ¨λ₯΄λ©΄ λ‚΄ μ½”λ“œκ°€ μ™œ μ΄μƒν•˜κ²Œ λ™μž‘ν•˜λŠ”μ§€ 이해할 수 μ—†μŠ΅λ‹ˆλ‹€.

❓ μœ ν•œμ²΄λž€?

μ»΄ν“¨ν„°λŠ” 숫자λ₯Ό μ €μž₯ν•  λ•Œ μ •ν•΄μ§„ 칸을 μ‚¬μš©ν•©λ‹ˆλ‹€. uint256은 256개의 0κ³Ό 1둜 숫자λ₯Ό ν‘œν˜„ν•˜λŠ”λ°,
κ°€μž₯ 큰 μˆ˜λŠ” 115792089237316195423570985008687907853269984665640564039457584007913129639935μž…λ‹ˆλ‹€. 78자리 숫자죠.

이 μˆ«μžμ— 1을 λ”ν•˜λ©΄ μ–΄λ–»κ²Œ λ κΉŒμš”? 257번째 μžλ¦¬κ°€ ν•„μš”ν•œλ°, 그런 곡간이 μ—†μŠ΅λ‹ˆλ‹€.
κ·Έλž˜μ„œ λͺ¨λ“  μžλ¦¬κ°€ 0으둜 λ¦¬μ…‹λ©λ‹ˆλ‹€. μ‹€μ œλ‘œ 100μ–΅ 원이 있던 토큰 μž”μ•‘μ΄ 1원을 더 λ°›λŠ” μˆœκ°„ 0원이 λ˜μ–΄λ²„λ¦° ν•΄ν‚Ή 사고가 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

μœ ν•œμ²΄λŠ” 이 "μ΅œλŒ“κ°’ λ‹€μŒμ΄ 0"μ΄λΌλŠ” ν˜„μƒμ„ μ•„μ˜ˆ 정상 λ™μž‘μœΌλ‘œ λ§Œλ“€μ–΄λ²„λ¦° μ‹œμŠ€ν…œμž…λ‹ˆλ‹€. 버그가 μ•„λ‹ˆλΌ μ›λž˜ κ·Έλ ‡κ²Œ μ„€κ³„ν•œ κ±°μ£ .

πŸ€” uint256의 λμ—μ„œ μΌμ–΄λ‚˜λŠ” 일

솔리디티 개발자라면 늘 μ‘°μ‹¬ν•˜λŠ” 상황이 μžˆμŠ΅λ‹ˆλ‹€.

uint256 μ΅œλŒ“κ°’μ— 1을 λ”ν•˜λ©΄ 0이 되기 λ•Œλ¬Έμ΄μ£ .
λ‹€μ‹œ 말해 256λΉ„νŠΈλ‘œ ν‘œν˜„ν•  수 μžˆλŠ” ν•œκ³„λ₯Ό λ„˜μ–΄μ„œλ©΄, λ‹€μ‹œ 0으둜 λŒμ•„κ°€λŠ” 상황을 κ²ͺ게되고,

이게 μ •μˆ˜ μ˜€λ²„ν”Œλ‘œμš°μž…λ‹ˆλ‹€.

TimeLock 해킹이 λ°”λ‘œ 이걸 μ•…μš©ν–ˆλ˜ 사둀죠
미래 μ‹œμ μ˜ μž κΈˆμ— 큰 수λ₯Ό λ”ν•΄μ„œ 0으둜 λ§Œλ“€μ–΄λ²„λ¦° λ‹€μŒ
μ¦‰μ‹œ 좜금이 κ°€λŠ₯ν•˜λ„λ‘ ν•΄μ„œ 해킹이 κ°€λŠ₯ν–ˆμŠ΅λ‹ˆλ‹€..γ„·γ„·

1️⃣ μ˜€λ²„ν”Œλ‘œμš°λ₯Ό λ§‰μœΌλ €λŠ” λ…Έλ ₯

이 문제λ₯Ό ν•΄κ²°ν•˜λ €κ³  κ°œλ°œμžλ“€μ€ 계속 λ°©μ–΄ μ½”λ“œλ₯Ό μΆ”κ°€ν•΄μ™”μŠ΅λ‹ˆλ‹€.

SafeMath 라이브러리λ₯Ό μ“°κ±°λ‚˜, Solidity 0.8.0λΆ€ν„°λŠ” μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μœΌλ‘œ μ²΄ν¬ν•˜μ£ 
ν•˜μ§€λ§Œ 이건 λΉ„μš©μž…λ‹ˆλ‹€. λͺ¨λ“  μ—°μ‚°λ§ˆλ‹€ "μ˜€λ²„ν”Œλ‘œμš° 체크"κ°€ μΆ”κ°€λ‘œ μ‹€ν–‰λ˜λ‹ˆκΉŒμš”.

문제의 핡심은 이거죠.

일반 μ •μˆ˜ μ‹œμŠ€ν…œμ—μ„œ μ˜€λ²„ν”Œλ‘œμš°λŠ” μ˜ˆμ™Έμ  였λ₯˜λΌλŠ”μ 

κ·Έλž˜μ„œ 막아야 ν•˜κ³ , λ§‰λŠ” 데 λΉ„μš©μ΄ λ“­λ‹ˆλ‹€.

2️⃣ μœ ν•œμ²΄μ˜ μ™„μ „νžˆ λ‹€λ₯Έ 관점

ZKμ—μ„œ μ‚¬μš©ν•˜λŠ” μœ ν•œμ²΄ Fpλ₯Ό λ³΄κ² μŠ΅λ‹ˆλ‹€.

0λΆ€ν„° p-1κΉŒμ§€μ˜ μ •μˆ˜λ‘œ 이루어져 있고, λͺ¨λ“  연산이 mod p둜 μ •μ˜λ©λ‹ˆλ‹€.
p-1에 1을 λ”ν•˜λ©΄? 0이 λ©λ‹ˆλ‹€.

이건 였λ₯˜κ°€ μ•„λ‹ˆλΌ μ •μ˜μ£ .

μœ ν•œμ²΄λŠ” μ΄λ ‡κ²Œ μ²˜μŒλΆ€ν„° "μˆœν™˜ν•˜λŠ” μ‹œμŠ€ν…œ"으둜 μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
pλ₯Ό λ„˜μœΌλ©΄ λ‹€μ‹œ 0λΆ€ν„° μ‹œμž‘ν•˜λŠ” 게 정상 λ™μž‘μ΄μ£ .

3️⃣ μ™œ 이게 더 λ‚˜μ€κ°€

차이λ₯Ό μ •ν™•νžˆ μ§šμ–΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

일반 μ •μˆ˜μ—μ„œ μ˜€λ²„ν”Œλ‘œμš°λŠ” 보톡 μ˜ˆμ™Έμƒν™©μœΌλ‘œ λ΄…λ‹ˆλ‹€.
λŒ€λΆ€λΆ„μ˜ 연산은 정상 λ²”μœ„μ—μ„œ μΌμ–΄λ‚˜κ³ , 가끔 경계λ₯Ό λ„˜μ„ λ•Œλ§Œ λ¬Έμ œκ°€ 생기죠.
κ·Έλž˜μ„œ 맀번 체크해야 ν•©λ‹ˆλ‹€.

ν•˜μ§€λ§Œ μœ ν•œμ²΄μ—μ„œλŠ” μˆœν™˜μ΄ μ •μƒμž…λ‹ˆλ‹€.
μ• μ΄ˆμ— λͺ¨λ“  연산이 mod p둜 μ •μ˜λ˜μ–΄ μžˆμœΌλ‹ˆ, 체크할 ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.
μ˜€λ²„ν”Œλ‘œμš°λΌλŠ” κ°œλ… μžμ²΄κ°€ μ—†λŠ” κ±°μ£ .

Circomμ—μ„œ κ·Έλƒ₯ sum <== a + b라고 μ“Έ 수 μžˆλŠ” μ΄μœ μž…λ‹ˆλ‹€.
κ²°κ³Όκ°€ pλ₯Ό λ„˜λ“  μ•ˆ λ„˜λ“ , 항상 μœ νš¨ν•œ 값이 λ‚˜μ˜€λ‹ˆκΉŒμš”.

✏️ 버그가 사라진 세계

μœ ν•œμ²΄λ₯Ό 처음 μ ‘ν–ˆμ„ λ•Œ 깨달은 점이 μžˆμŠ΅λ‹ˆλ‹€.

μš°λ¦¬κ°€ "μ˜€λ²„ν”Œλ‘œμš° 버그"라고 λΆ€λ₯΄λ˜ 것은, 사싀 λ¬΄ν•œμ„ μœ ν•œν•œ 곡간에 μ–΅μ§€λ‘œ λ‹΄μœΌλ €λ‹€ 생긴 λ¬Έμ œμ˜€λ‹€λŠ”μ !
λ‹Ήμ—°ν•˜κ²Œλ„ λ©”λͺ¨λ¦¬λŠ” μœ ν•œν•œλ° 거기에 λ¬΄ν•œν•˜κ²Œ 큰 수λ₯Ό 담을 수 μ—†μœΌλ‹ˆκΉŒμš”.

μœ ν•œμ²΄λŠ” μ²˜μŒλΆ€ν„° μœ ν•œν•˜λ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€.
κ·Έλž˜μ„œ λͺ¨λ“  μˆ«μžκ°€ 0λΆ€ν„° p-1 사이에 있고, λͺ¨λ“  μ—°μ‚° 결과도 κ·Έ μ•ˆμ— μžˆλ„λ‘ ν•˜λŠ”κ±°μ£ 
λ¬΄ν•œμ„ λ‹€λ£¨λ €λŠ” μ‹œλ„ μžμ²΄κ°€ μ—†μœΌλ‹ˆ, μ˜€λ²„ν”Œλ‘œμš°λ„ μ—†μŠ΅λ‹ˆλ‹€.

ZK 회둜λ₯Ό μž‘μ„±ν•  λ•Œ SafeMath 같은 게 ν•„μš” μ—†λŠ” μ΄μœ κ°€ μ—¬κΈ° μžˆμŠ΅λ‹ˆλ‹€.
μ˜€λ²„ν”Œλ‘œμš° κ±±μ • 자체λ₯Ό ν•  ν•„μš”κ°€ μ—†μœΌλ‹ˆκΉŒμš”.

λ‹€μŒ νŽΈμ—μ„œλŠ” "μŒμˆ˜κ°€ μ—†λŠ”λ° λΊ„μ…ˆμ€ μ–΄λ–»κ²Œ?"λ₯Ό λ‹€λ€„λ³΄κ² μŠ΅λ‹ˆλ‹€.
이것도 μœ ν•œμ²΄μ˜ λ…νŠΉν•œ μ ‘κ·Ό 방식이 μžˆλ”λΌκ΅¬μš”!!

---

μ—¬λŸ¬λΆ„μ˜ μ’‹μ•„μš”μ™€ κ³΅μœ λŠ” μ‚¬λž‘μž…λ‹ˆλ‹€ πŸ₯°

#BQ개발자
#ZK개발
#μœ ν•œμ²΄
#Circom
#μ˜μ§€μ‹μ¦λͺ…
쑰회1,494ν¬μ›Œλ“œ7ν…”λ ˆκ·Έλž¨μ—μ„œ 보기