๋ฐ•์ผํ™˜
๋ชฉ์ฐจ
๏‚— ๋ธ”๋ก์ฒด์ธ์˜ ๊ฐœ๋…
๏‚— ๋น„ํŠธ์ฝ”์ธ์˜ ๊ตฌ์„ฑ์š”์†Œ
๏‚— ๋น„ํŠธ์ฝ”์ธ ๋ธ”๋ก์˜ ๊ตฌ์กฐ
๏‚— ๊ฐœ์ธํ‚ค(Private key), ๊ณต๊ฐœํ‚ค(Public key), ๋น„ํŠธ์ฝ”์ธ ์ฃผ์†Œ(Address)
๏‚— ํ‚ค์™€ ์ฃผ์†Œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ง€๊ฐ‘(Wallet)
๏‚— ๋น„ํŠธ์ฝ”์ธ ํŠธ๋žœ์žญ์…˜
๏‚— scriptSig์™€ scriptPubKey์˜ ์ƒ์„ฑ๋ฐฉ๋ฒ•๊ณผ ์œ ํšจ์„ฑ ๊ฒ€์ฆ๋ฐฉ๋ฒ•
๏‚— ๋น„ํŠธ์ฝ”์ธ์˜ ํ•ฉ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ : PoW(Proof of Work)
๏‚— ๋ธ”๋ก์ฒด์ธ์˜ ๋ถ„๊ธฐ
๋ธ”๋ก์ฒด์ธ โ€“ ๊ฐ€์น˜๊ณต์œ ์˜ ์ธํ„ฐ๋„ท
๏‚— ๊ธฐ์กด์˜ ์ธํ„ฐ๋„ท์€ "์ •๋ณด"๋ฅผ ์ „๋‹ฌ, ๋ธ”๋ก์ฒด์ธ์€ "๊ฐ€์น˜"๋ฅผ ์ „๋‹ฌ
๏‚— Alice๊ฐ€ Bob์—๊ฒŒ 1๋‹ฌ๋Ÿฌ์˜ ๊ฐ€์น˜๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ
๏‚— ์ธํ„ฐ๋„ท ๋ฑ…ํ‚น์„ ํ†ตํ•œ 1๋‹ฌ๋Ÿฌ ์ด์ฒด
๏‚— 1๋‹ฌ๋Ÿฌ์˜ ๋””์ง€ํ„ธ ์ƒํ’ˆ๊ถŒ์„ ๊ตฌ์ž…ํ•˜์—ฌ ์ „๋‹ฌ
๏‚— ์ธํ„ฐ๋„ท์ƒ์—์„œ์˜ ๊ฐ€์น˜์ „๋‹ฌ์˜ ๋ฌธ์ œ์ 
๏‚— ์ค‘์•™์ง‘์ค‘์„œ๋ฒ„๊ฐ€ ๋ณต๊ตฌ๋ถˆ๊ฐ€๋Šฅ์ƒํƒœ๋กœ ํŒŒ๊ดด๋˜๊ฑฐ๋‚˜ ํ•ดํ‚น๋œ ๊ฒฝ์šฐ ๊ฐ€์น˜์†Œ๋ฉธ
๏‚— ์ƒํ’ˆ๊ถŒ์„ ๋ณต์ œํ•˜์—ฌ ์ด์ค‘์ง€๋ถˆ ๋ฌธ์ œ ๋ฐœ์ƒ
๏‚— ๋ธ”๋ก์ฒด์ธ์„ ํ†ตํ•œ ๊ฐ€์น˜์ „๋‹ฌ๋ฌธ์ œ์˜ ํ•ด๊ฒฐ
๏‚— ๋ชจ๋“  ๊ฑฐ๋ž˜์ •๋ณด๊ฐ€ ๋ธ”๋ก์˜ ํ˜•ํƒœ๋กœ ์ €์žฅ๋˜์–ด ๋ชจ๋“  ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐฐํฌ๋˜๊ณ  ์ €์žฅ
๏‚— ๋ธ”๋ก์ฒด์ธ ๊ณ ์œ ์˜ ํ•ฉ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด ์ด์ค‘์ง€๋ถˆ ๋ฌธ์ œ ํ•ด๊ฒฐ
๋น„ํŠธ์ฝ”์ธ์˜ ๊ฐ€์น˜์ด๋™
๋น„ํŠธ์ฝ”์ธ์˜ ๊ตฌ์„ฑ์š”์†Œ - 1
๋น„ํŠธ์ฝ”์ธ์˜ ๊ตฌ์„ฑ์š”์†Œ - 2
๏‚— Wallet
๏‚— ๊ฐ ์‚ฌ์šฉ์ž์˜ Private/Public ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ณด๊ด€
๏‚— Publicํ‚ค๋Š” Privateํ‚ค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑ๋˜๊ณ  Public ํ‚ค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Bitcoin ์ฃผ์†Œ๊ฐ€ ์ƒ์„ฑ
๏‚— Transaction
๏‚— ์‹ค์ œ ๋น„ํŠธ์ฝ”์ธ์˜ ์ด๋™์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฑฐ๋ž˜๋ฅผ ๋งํ•˜๋ฉฐ, ๊ฑฐ๋ž˜์˜ ๋‹จ์œ„๋Š” UTXO์ด๊ณ , ๊ฐ ๊ฑฐ๋ž˜๋Š” ๊ฐ ์‚ฌ์šฉ์ž
์˜ ํ‚ค๋กœ ์„œ๋ช…์ด ๋˜์–ด ์ง€์ •๋œ ์‚ฌ์šฉ์ž๋ผ๋ฆฌ๋งŒ ๊ฑฐ๋ž˜๊ฐ€ ๊ฐ€๋Šฅ
๏‚— Block
๏‚— ๊ฐ๊ฐ์˜ ๋ธ”๋ก์€ ํ—ค๋”์™€ 10๋ถ„๊ฐ„ ๋ฐœ์ƒํ•œ ๊ฑฐ๋ž˜์ •๋ณด๊ฐ€ ํฌํ•จ
๏‚— Network
๏‚— ๊ฑฐ๋ž˜์™€ ๋ธ”๋ก์„ ๋„คํŠธ์›Œํฌ์ƒ์˜ ๋ชจ๋“  ๋…ธ๋“œ์—๊ฒŒ ์ „ํŒŒํ•˜๋Š” P2P ๊ธฐ๋ฐ˜ ๋„คํŠธ์›Œํฌ
๏‚— Miner
๏‚— ๊ฑฐ๋ž˜๊ฐ€ ํฌํ•จ๋œ Block์„ ๊ฐ€์ง€๊ณ , ์ด์ค‘์ง€๋ถˆ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก PoW(Proof of Work : ์ž‘์—…์ฆ๋ช…)
์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋ธ”๋ก์„ ์—ฐ๊ฒฐํ•˜๋Š” ์ฃผ์ฒด
๋น„ํŠธ์ฝ”์ธ์˜ ํ•ด์‰ฌ(Hash) ํ•จ์ˆ˜ : SHA256
๏‚— ์–ด๋–ค ๊ธธ์ด์˜ ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•ด์„œ๋„ ๋™์ผํ•œ ๊ธธ์ด์˜ ์ถœ๋ ฅ๊ฐ’์„ ์ƒ์„ฑ
๏‚— Hash(A) = 123โ€ฆasd(32๋ฐ”์ดํŠธ ๊ธธ์ด), Hash(ABC) = afdโ€ฆ35f(32๋ฐ”์ดํŠธ ๊ธธ์ด)
๏‚— ์–ด๋–ค ์ž…๋ ฅ X์— ๋Œ€ํ•ด์„œ Hash(X) = Y ๊ฐ’์„ ์‰ฝ๊ฒŒ ๊ณ„์‚ฐ๊ฐ€๋Šฅ
๏‚— ๋น„ํŠธ์ฝ”์ธ ์ž‘์—…์ฆ๋ช…์˜ ๊ฒฐ๊ณผ๋ฌผ์ธ ๋ธ”๋ก์˜ ์œ ํšจ์„ฑ ๊ฒ€์ฆ์ด ์‰ฝ๊ฒŒ ๋จ
๏‚— Hash(X) = Y ์ธ ๊ฒฝ์šฐ, X๊ฐ’์„ ์œ ์ถ”ํ•˜๋Š”๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์ผ๋ฐฉํ•จ์ˆ˜
๏‚— ๋น„ํŠธ์ฝ”์ธ PoW์—์„œ nonce๋ฅผ ์ฐพ๋Š” ๊ณผ์ •
๏‚— ๋™์ผํ•œ ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•ด์„œ๋Š” ๋™์ผํ•œ ์ถœ๋ ฅ๊ฐ’์„ ์ƒ์„ฑํ•˜์ง€๋งŒ, ์ž…๋ ฅ๋ฐ์ดํƒ€๊ฐ€ ๋ณ€ํ•˜๋ฉด ์™„์ „ํžˆ ์ƒˆ๋กœ์šด
์ถœ๋ ฅ๊ฐ’์„ ์ƒ์„ฑ
๏‚— https://anders.com/blockchain/hash.html
ํ•ด์‹ฑ ๋ฐ์ดํ„ฐ์˜ 5๊ฐ€์ง€ ํŒจํ„ด
๏‚— ๋…๋ฆฝํ•ด์‹ฑ
๏‚— ์ˆœ์ฐจ์  ํ•ด์‹ฑ
๏‚— ๋ฐ˜๋ณตํ•ด์‹ฑ
๏‚— ๊ณ„์ธต์  ํ•ด์‹ฑ
๏‚— ๊ฒฐํ•ฉํ•ด์‹ฑ
๋น„ํŠธ์ฝ”์ธ์—์„œ Hash ํ•จ์ˆ˜ ์‚ฌ์šฉ
๏‚— RIPEMD160(SHA256(x))
๏‚— ๋น„ํŠธ์ฝ”์ธ ์ฃผ์†Œ ์ƒ์„ฑ
๏‚— SHA256(SHA256(x))
๏‚— ๋จธํดํŠธ๋ฆฌ์—์„œ ํŠธ๋žœ์žญ์…˜์˜ ํ•ด์‰ฌ ์—ฐ์‚ฐ
๏‚— ํŠธ๋žœ์žญ์…˜ ID ์ƒ์„ฑ
๏‚— ๋ธ”๋กํ—ค๋”์˜ ํ•ด์‰ฌ ์—ฐ์‚ฐ
๏‚— Double hash ์—ฐ์‚ฐ์„ ํ•˜๋Š” ์ด์œ 
๏‚— length-extension attacks ๋ฐฉ์ง€
๏‚— A๊ฐ’์„ ๋ชฐ๋ผ๋„ hash(A)์™€ length(A)๋ฅผ ์•Œ๋ฉด hash(A||B)์„ ์•Œ์ˆ˜ ์žˆ์Œ
๋น„ํŠธ์ฝ”์ธ์˜ ๋ธ”๋ก โ€“ ๋ธ”๋ก์ •๋ณด
๏‚— Block explorer : https://www.blockchain.com/en/explorer
๋น„ํŠธ์ฝ”์ธ์˜ ๋ธ”๋ก - ๋ธ”๋กํ—ค๋”
๋น„ํŠธ์ฝ”์ธ์˜ ๋ธ”๋ก - ๋ธ”๋กํ—ค๋”
๏‚— Timestamp(๋ธ”๋ก์ด ์ƒ์„ฑ๋œ ์‹œ๊ฐ„) : 2018-03-01 08:11:49
๏‚— Bits(๋ธ”๋ก ์ƒ์„ฑ์˜ ๋‚œ์ด๋„) : 392009692
๏‚— Version(ํ”„๋กœํ† ์ฝœ ๋ฒ„์ „) : 0x20000000
๏‚— Merkle Root(ํŠธ๋žœ์žญ์…˜ ID๋ฅผ ๋จธํดํŠธ๋ฆฌ ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑํ•œ ํ•ด์‹œ์ •๋ณด) :
b958fda3ce4d3cd0a41f01a6b00f6ae4e70f498a27f526cc5612f72450152d17
๏‚— Previois Block(์ด์ „ ๋ธ”๋ก์˜ ํ•ด์‹œ์ •๋ณด) :
00000000000000000029b633899beed322666cc0041fbdf471300d52e6de1887
๏‚— Nonce : 2170187189
๋จธํดํŠธ๋ฆฌ
๏‚— ํŠน์ •๊ฑฐ๋ž˜๊ฐ€ ๋ธ”๋ก๋‚ด๋ถ€์— ํฌํ•จ๋˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์ฆํ•˜๋Š”๋ฐ ํšจ์œจ์ ์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ œ๊ณต
๏‚— ์ƒํ–ฅ์‹์œผ๋กœ ๋‘๊ฐœ์˜ Hash๊ฐ’์„ ๋‘๋ฒˆ ํ•ด์‰ฌ(Double SHA256)ํ•˜์—ฌ ์ƒ์œ„ Hash๊ฐ’ ์ƒ์„ฑ
๏‚— Hash(AB) = SHA256(SHA256(Hash(A) + Hash(B))
๏‚— ์ด์ง„ ํŠธ๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ง์ˆ˜๊ฐœ์˜ ๋ฆฌํ”„๋…ธ๋“œ๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ ํ™€์ˆ˜๊ฐœ์˜ ๊ฒฝ์šฐ์—๋Š” ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ์ง์ˆ˜
๋กœ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉ
๋จธํด๋ฃจํŠธ ๊ณ„์‚ฐ
import hashlib
# Hash pairs of items recursively until a single value is obtained
def merkle(hashList):
if len(hashList) == 1:
return hashList[0]
newHashList = []
# Process pairs. For odd length, the last is skipped
for i in range(0, len(hashList)-1, 2):
newHashList.append(hash2(hashList[i], hashList[i+1]))
if len(hashList) % 2 == 1: # odd, hash last item twice
newHashList.append(hash2(hashList[-1], hashList[-1]))
return merkle(newHashList)
def hash2(a, b):
# Reverse inputs before and after hashing
# due to big-endian / little-endian nonsense
a1 = a.decode('hex')[::-1]
b1 = b.decode('hex')[::-1]
h = hashlib.sha256(hashlib.sha256(a1+b1).digest()).digest()
return h[::-1].encode('hex')
#
https://www.blockchain.com/en/btc/block/000000000003ba27aa200b1cecaad478d2b00432346c
3f1f3986da1afd33e506
txHashes = [
"8c14f0db3df150123e6f3dbbf30f8b955a8249b62ac1d1ff16284aefa3d06d87",
"fff2525b8931402dd09222c50775608f75787bd2b87e56995a7bdd30f79702c4",
"6359f0868171b1d194cbee1af2f16ea598ae8fad666d9b012c8ed2b79a236ec4",
"e9a66845e05d5abc0ad04ec80f774a7e585c6e8db975962d069a522137b80c1d",
]
print merkle(txHashes)
๋น„ํŠธ์ฝ”์ธ์˜ ๋ธ”๋ก โ€“ ๋ธ”๋กํ—ค๋” ๊ตฌ์กฐ
๋น„ํŠธ์ฝ”์ธ์˜ ๋ธ”๋ก โ€“ ๋ธ”๋ก์ฒด์ธ
๏‚— ํ•˜๋‚˜์˜ ๋ธ”๋ก์€ ๊ณ„์‚ฐ๋œ Hash ๊ฐ’๊ณผ ๋ธ”๋กํ—ค๋”, 10๋ถ„๊ฐ„ ์ง„ํ–‰๋œ ๊ฑฐ๋ž˜(Transaction) ๋‚ด์—ญ์ด ํฌํ•จ
๋˜๋ฉฐ ์ด ๋ธ”๋ก์ด ์—ฐ์†๋œ ์ฒด์ธํ˜•ํƒœ๋กœ ๊ตฌ์„ฑ.
๋Œ€์นญํ‚ค ์•Œ๊ณ ๋ฆฌ์ฆ˜
๏‚— ์•”ํ˜ธํ™”/๋ณตํ˜ธํ™” ์†๋„๊ฐ€ ๋น„๋Œ€์นญํ‚ค ์•”ํ˜ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋ณด๋‹ค ๋น ๋ฅด๋‹ค(์ตœ์†Œ10~์ตœ๋Œ€1000๋ฐฐ).
๏‚— ์•”ํ˜ธ๋ฌธ์˜ ํฌ๊ธฐ๊ฐ€ ํ‰๋ฌธ๋ณด๋‹ค ํฌ์ง€ ์•Š๋‹ค(์•”ํ˜ธํ™” ์‹œ ๋ฐ์ดํ„ฐ ์ฆ๊ฐ€๊ฐ€ ์—†๋‹ค).
๏‚— ์ฃผ๋กœ ๋ฐ์ดํ„ฐ ํ†ต์‹ ์˜ ์•”ํ˜ธํ™”์— ์‚ฌ์šฉ
๋น„๋Œ€์นญํ‚ค ์•Œ๊ณ ๋ฆฌ์ฆ˜
๏‚— ๊ณต๊ฐœํ‚ค๋กœ ์•”ํ˜ธํ™”ํ•œ ๋ฐ์ดํ„ฐ๋Š” ๊ฐœ์ธํ‚ค๋กœ๋งŒ ๋ณตํ˜ธํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
๏‚— ๊ฐœ์ธํ‚ค๋กœ ์•”ํ˜ธํ™”ํ•œ ๋ฐ์ดํ„ฐ๋Š” ๊ณต๊ฐœํ‚ค๋กœ๋งŒ ๋ณตํ˜ธํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
๏‚— ๋น„ํŠธ์ฝ”์ธ์˜ ํŠธ๋žœ์žญ์…˜์—์„œ๋Š” ๋น„๋Œ€์นญํ‚ค ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์œ ํšจ์„ฑ ๊ฒ€์ฆ์ด ์ด๋ฃจ์–ด์ง„๋‹ค.
https://anders.com/blockchain/public-private-keys/signatures.html
๊ฐœ์ธํ‚ค(Private key)
๏‚— ๋ฌด์ž‘์œ„๋กœ ์ถ”์ถœํ•œ ๋‹จ์ˆœํ•œ ์ˆซ์ž
๏‚— ์•”ํ˜ธํ•™์ ์œผ๋กœ ์•ˆ์ „ํ•œ ์˜์‚ฌ๋‚œ์ˆ˜์ƒ์„ฑ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ๋˜์–ด์•ผ ํ•จ
๏‚— ๋น„ํŠธ์ฝ”์ธ์—์„œ ๊ฐœ์ธํ‚ค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ž‘์—…์€ 1์—์„œ 2256 ์‚ฌ์ด์˜ ์ˆซ์ž๋ฅผ ์„ ํƒํ•˜๋Š”๊ฒƒ๊ณผ ๋™์ผ
๏‚— ๊ฐœ์ธํ‚ค๋Š” 256๋น„ํŠธ ๊ธธ์ด์˜ ์ˆซ์ž๋กœ ์ƒ์„ฑ
์œ ํ˜• ์ ‘๋‘๋ถ€ ์„ค๋ช…
Hex ์—†์Œ
64๊ฐœ์˜ 16์ง„์ˆ˜
ex) 1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD
WIF 5
Base58Check ์—”์ฝ”๋”ฉ
ex) 5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn
WIF-์••์ถ•ํ˜• K ๋˜๋Š” L
Base58Check ์—”์ฝ”๋”ฉ, ์ธ์ฝ”๋”ฉ์ „ ์ ‘๋ฏธ๋ถ€ 0x01 ์ถ”๊ฐ€
ex) KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ
ํƒ€์›๊ณก์„ ์•”ํ˜ธํ™”(Elliptic Curve Cryptography)
๏‚— ๊ณต๊ฐœํ‚ค ์•”ํ˜ธํ™”์˜ ํ•ต์‹ฌ์€ ๊ณ ์œ ์˜ ํŠธ๋žฉ๋„์–ดํ•จ์ˆ˜(Trapdoor function)
๏‚— A + B = C : Not Trapdoor function
๏‚— โ€œMessageโ€ + public key = โ€œs80s1s9sadjds9sโ€ : Trapdoor function
๏‚— RSA๋Œ€๋น„ 256๋น„ํŠธ์˜ ECC๊ฐ€ 3072 ๋น„ํŠธ์˜ RSA์™€ ๋™์ผํ•œ ๋ณด์•ˆ์„ ์ œ๊ณต
ํƒ€์›๊ณก์„  ๋ง์…ˆํ•จ์ˆ˜ ํƒ€์›๊ณก์„  ๊ณฑ์…ˆํ•จ์ˆ˜
๊ณต๊ฐœํ‚ค(Public key) - 1
๏‚— ํƒ€์›๊ณก์„  ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด Private ํ‚ค๋กœ๋ถ€ํ„ฐ ๊ณ„์‚ฐ. : OpenSSL ์•”ํ˜ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ
๏‚— K = 1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD * G
๏‚— K = (x, y)
x = F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A
y = 07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB
K = k * G (K : Public ํ‚ค, k : Private ํ‚ค, G : ์ƒ์„ฑํฌ์ธํŠธ ์ƒ์ˆ˜)
๐‘ฆ2 = ๐‘ฅ3 + ๐‘Ž๐‘ฅ + ๐‘
๐‘ฆ2
= ๐‘ฅ3
+ 7 : secp256k1(๋น„ํŠธ์ฝ”์ธ, ์ด๋”๋ฆฌ์›€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํƒ€์›๊ณก์„ )
: a = 0, b = 7
: G = 02 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798
๊ณต๊ฐœํ‚ค(Public key) - 2
๏‚— ๋น„์••์ถ• ๊ณต๊ฐœํ‚ค
: K = 04F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341Aโ†ต
07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB
๏‚— ์••์ถ• ๊ณต๊ฐœํ‚ค :
: K = 03F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A
: ์••์ถ• ๊ณต๊ฐœํ‚ค๋Š” 02, 03 ์˜ ์ ‘๋‘์–ด๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋จ
์ฃผ์†Œ(Address)
๏‚— ์ˆซ์ž์™€ ๋ฌธ์ž๋กœ ๊ตฌ์„ฑ๋œ ๋ฌธ์ž์—ด๋กœ ์ˆซ์ž 1๋กœ ์‹œ์ž‘
: 1thMirt546nngXqyPEz532S8fLwbozud8
๏‚— ๊ฐœ์ธํ‚ค ๋ฐ ๊ณต๊ฐœํ‚ค ์Œ์„ ๋ณด์œ ํ•œ ์†Œ์œ ์ฃผ
๏‚— ๋น„ํŠธ์ฝ”์ธ ๊ฑฐ๋ž˜์˜ ๋Œ€์ƒ
๏‚— A = RIPEMD160(SHA256(K)) : K = Public ํ‚ค
Base58Check Encoding
Base58Check Encoding
๏‚— ๊ธธ์ด๊ฐ€ ๊ธด ์ˆซ์ž์—ด์„ ์••์ถ•ํ•ด์„œ ํ‘œํ˜„
๏‚— 10์ง„๋ฒ• : 0์—์„œ 9๊นŒ์ง€์˜ 10๊ฐœ์˜ ์ˆซ์ž๋ฅผ ์‚ฌ์šฉ
๏‚— 16์ง„๋ฒ• : 10๊ฐœ์˜ ์ˆซ์ž์™€ 6๊ฐœ์˜ ๋ถ€ํ˜ธ๋ฅผ ์‚ฌ์šฉ
๏‚— Base64 : ์†Œ๋ฌธ์ž 26๊ฐœ, ๋Œ€๋ฌธ์ž 26๊ฐœ, ์ˆซ์ž 10๊ฐœ, ํŠน์ˆ˜๋ฌธ์ž 2๊ฐœ(+, /) ์‚ฌ์šฉ
๏‚— Base58 : Base64์—์„œ 0, O, l, I, +, / ๋ฅผ ์ œ์™ธ
๏‚— ์˜ค์ž๋‚˜ ๋ฐ์ดํ„ฐ ์ž…๋ ฅ์˜ค๋ฅ˜ ๋“ฑ์— ๋Œ€ํ•œ ์ถ”๊ฐ€๋ณด์•ˆ์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด Checksum ์ถ”๊ฐ€
์œ ํ˜• ๋ฒ„์ „ ์ ‘๋‘๋ถ€ Base58 ์ ‘๋‘๋ถ€ ๊ฒฐ๊ณผ๊ฐ’
๋น„ํŠธ์ฝ”์ธ ์ฃผ์†Œ 0x00 1
Pay-to-script-Hash ์ฃผ์†Œ 0x05 3
๋น„ํŠธ์ฝ”์ธ ํ…Œ์ŠคํŠธ๋„ท ์ฃผ์†Œ 0x6F m , n
๊ฐœ์ธํ‚ค WIF 0x80 5, K, L
BIF38 ์•”ํ˜ธํ™” ๊ฐœ์ธํ‚ค 0x0142 6P
BIF32 ํ™•์žฅ ๊ณต๊ฐœํ‚ค 0x0488B21E xpub
BIF32 ํ™•์žฅ ๊ฐœ์ธํ‚ค 0x0488ADE4 xprv
๊ฐœ์ธํ‚ค, ๊ณต๊ฐœํ‚ค, ์ฃผ์†Œ์˜ ๋ณ€ํ™˜๊ณผ์ •
http://royalforkblog.github.io/2014/08/11/graphical-address-generator/
์ƒ์„ฑ ๊ฐ€๋Šฅํ•œ ์ฃผ์†Œ์˜ ํฌ๊ธฐ
๏‚— ์ƒ์„ฑ ๊ฐ€๋Šฅํ•œ ๋น„ํŠธ์ฝ”์ธ ์ฃผ์†Œ์˜ ํฌ๊ธฐ : 2160
๏‚— 1,461,501,637,330,902,918,203,684,832,716,283,019,655,932,542,97
๏‚— ์ง€๊ตฌ์ƒ์˜ ๋ชจ๋ž˜์•Œ์˜ ์ˆ˜ : 263
๏‚— 263๊ฐœ์˜ ์ง€๊ตฌ์— 263๊ฐœ์˜ ๋ชจ๋ž˜์•Œ์ด ์žˆ๋Š”๊ฒฝ์šฐ์˜ ์ˆ˜ : 2126
๏‚— 2126 = 2160 ์˜ 0.0000000058 %
๏‚— 2017๋…„ ๊ธฐ์ค€ ์ „์„ธ๊ณ„ ์ธ๊ตฌ๊ฐ€ 75์–ต์ธ ๊ฒฝ์šฐ, ๋ชจ๋“  ์‚ฌ๋žŒ์€ ๊ฐ๊ฐ 2127 ๊ฐœ์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€์งˆ์ˆ˜ ์žˆ์Œ
Libbitcoin ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
๏‚— Bitcoin ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ œ์ž‘ํ•˜๊ธฐ์œ„ํ•œ ํฌ๋กœ์Šค ํ”Œ๋žซํผ C++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
Libbitcoin ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
๏‚— Libbitcoin ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ : https://github.com/libbitcoin/libbitcoin
๏‚— Secp256k1 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ : https://github.com/libbitcoin/secp256k1
$ git clone
https://github.com/libbitcoin/secp256k1
$cd secp256k1
$ ./autogen.sh
$ ./configure
$ make
$ ./tests
$ sudo make install # optional
$ g++ version # g++ ๋ฒ„์ „ ํ™•์ธ
# ๋งŒ์•ฝ g++ ๋ฒ„์ „์ด ๋‚ฎ๋‹ค๋ฉด ์—…๊ทธ๋ ˆ์ด๋“œ
$ sudo apt-get install g++-4.8
$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 50
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 50
$ sudo update-alternatives --install /usr/bin/gcov gcov /usr/bin/gcov-4.8 50
$ sudo apt-get install build-essential autoconf automake libtool pkg-config
git
$ sudo apt-get install libboost-all-dev
$ wget
https://raw.githubusercontent.com/libbitcoin/libbitcoin/version3/install.sh
$ chmod +x install.sh
$ sudo ./install.sh
Libbitcoin ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
#include <bitcoin/bitcoin.hpp>
using namespace bc;
int main()
{
// Extracting Satoshi's words from genesis block.
const auto block = bc::chain::block::genesis_mainnet();
const auto& coinbase = block.transactions().front();
const auto& input = coinbase.inputs().front();
BITCOIN_ASSERT_MSG(input.script().size() > 2u, "unexpected genesis");
const auto headline = input.script()[2].data();
std::string message(headline.begin(), headline.end());
bc::cout << message << std::endl;
return EXIT_SUCCESS;
}
$ g++ -std=c++11 -o satoshi satoshiwords.cpp $(pkg-config --cflags libbitcoin --libs libbitcoin)
๊ฐœ์ธํ‚ค, ๊ณต๊ฐœํ‚ค, ์ฃผ์†Œ ์ƒ์„ฑ
#include <bitcoin/bitcoin.hpp>
#include <string>
#include <iostream>
using namespace bc;
int main(void) {
data_chunk seed(16);
pseudo_random_fill(seed);
ec_secret secretKey = bitcoin_hash(seed);
std::string hexKey = encode_base16(secretKey);
std::cout << "secret key: " << hexKey << std::endl;
wallet::ec_private privateKey(secretKey);
std::cout << "Private key: " << privateKey.encoded() << std::endl;
wallet::ec_public publicKey = privateKey.to_public();
std::cout << "Public Key: " << publicKey.encoded() << std::endl;
wallet::payment_address paymentAddress = publicKey.to_payment_address();
std::cout << "Bitcoin address: " << paymentAddress.encoded() << std::endl;
return 0;
}
$ g++ -std=c++11 -o key key.cpp $(pkg-config --cflags libbitcoin --libs libbitcoin)
๊ฐœ์ธํ‚ค, ๊ณต๊ฐœํ‚ค, ์ฃผ์†Œ ์ƒ์„ฑ
์ง€๊ฐ‘(Wallet)
๏‚— ๊ฐœ์ธํ‚ค(Private ํ‚ค) ์™€ ๊ณต๊ฐœํ‚ค(Public key)๋ฅผ ๋‹ด๋Š”๊ณณ
๏‚— ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ์œ ๋ฌด์— ๋”ฐ๋ผ Hot wallet, Cold wallet์œผ๋กœ ๊ตฌ๋ถ„
๏‚— ๋น„ํŠธ์ฝ”์ธ์€ UTXO(Unspent Transaction Output)์˜ ํ˜•ํƒœ๋กœ ๋ธ”๋ก์ฒด์ธ์ƒ์— ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž์—๊ฒŒ
๋ชจ๋‘ ๊ณต์œ ๋˜์–ด ์ €์žฅ
๏‚— ์ด์™€ ๊ฐ™์ด ์ง€๊ฐ‘์€ ์‹ค์ œ ๋น„ํŠธ์ฝ”์ธ์„ ์ €์žฅํ•˜๋Š”๊ฒƒ์ด ์•„๋‹ˆ๊ณ , ์ž์‹  ์†Œ์œ ์ž„์„ ์ฆ๋ช…ํ•˜๊ธฐ์œ„ํ•œ ๊ฐœ์ธ
ํ‚ค์™€ ๊ณต๊ฐœํ‚ค๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณณ
๏‚— ์ง€๊ฐ‘์˜ ์ข…๋ฅ˜
๏‚— ๋น„๊ฒฐ์ •์  ์ง€๊ฐ‘
๏‚— ๊ฒฐ์ •์  ์ง€๊ฐ‘
๏‚— ๊ณ„์ธต ๊ฒฐ์ •์  ์ง€๊ฐ‘
๋น„๊ฒฐ์ •์  ์ง€๊ฐ‘
๏‚— ๋ฌด์ž‘์œ„๋กœ ์„ ํƒ๋œ Private ํ‚ค๊ฐ€ ์ €์žฅ๋˜์–ด์žˆ๋Š” ์ง€๊ฐ‘
๏‚— ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ‚ค ์‚ฌ์ด์— ๊ทœ์น™์ด๋‚˜ ์—ฐ์†์„ฑ์ด ์—†์ด ๋ฌด์ž‘์œ„
๋กœ ํ‚ค๊ฐ€ ์ƒ์„ฑ
๏‚— ์ง€๊ฐ‘์ด ์ƒ์„ฑ๋ ๋•Œ 100๊ฐœ์˜ ๊ฐœ์ธํ‚ค๋ฅผ ๋ฌด์ž‘์œ„๋กœ ์ƒ์„ฑ
ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ณ  ์ดํ›„ ๋ชจ๋“ ํ‚ค๊ฐ€ ์‚ฌ์šฉ๋œํ›„์— ๋‹ค์‹œ ๋ฌด์ž‘
์œ„๋กœ ์ƒˆ๋กœ์šด ํ‚ค๋ฅผ ์ƒ์„ฑ
๏‚— ๋ชจ๋“ ํ‚ค๋ฅผ ๋ฐฑ์—…ํ•˜์ง€๋ชปํ•œ ๊ฒฝ์šฐ์— ์ง€๊ฐ‘์ด ์†์‹ค๋˜๋ฉด ๋ณต
๊ตฌ๋ฅผ ํ• ์ˆ˜๊ฐ€ ์—†๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ
๏‚— ์ง€๊ฐ‘์˜ ์†์‹ค์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ฃผ๊ธฐ์ ์œผ๋กœ ์ง€๊ฐ‘
์˜ ๋ชจ๋“ ํ‚ค๋ฅผ ๋ฐฑ์—…ํ•ด์•ผ ํ•จ
๊ฒฐ์ •์  ์ง€๊ฐ‘
๏‚— ๋žœ๋คํ•˜๊ฒŒ ๋ฐœ์ƒ๋œ Seed ์—์„œ ๋‹จ๋ฐฉํ–ฅ Hash ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ๊ฐœ์ธํ‚ค๋ฅผ ์—ฐ์†์ ์œผ๋กœ ์ƒ์„ฑ
๏‚— Seed๋งŒ ์•Œ๊ณ ์žˆ์œผ๋ฉด ์ถ”์ถœํ‚ค ์ „๋ถ€๋ฅผ ๋ณต์›ํ• ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํŠน์ •์‹œ๊ธฐ์— ํ•œ๋ฒˆ์˜ ๋ฐฑ์—…๋งŒ ํ•ด๋„ ๋จ
๊ฒฐ์ •์  ์ง€๊ฐ‘ โ€“ ์—ฐ์ƒ๊ธฐํ˜ธ ์ฝ”๋“œ์›Œ๋“œ (BIP39)
๏‚— ์—ฐ์ƒ๊ธฐํ˜ธ์ฝ”๋“œ๋Š” ๊ฒฐ์ •์  ์ง€๊ฐ‘์„ ์–ป๊ธฐ ์œ„ํ•ด ์ข…์ž๋กœ ์ด์šฉํ•œ ๋‚œ์ˆ˜๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ์˜์–ด ๋‹จ์–ด์—ด
๏‚— ์—ฐ์ƒ๊ธฐํ˜ธ ๋‹จ์–ด ์ƒ์„ฑ๊ณผ์ •
๏‚— 128~256 ๋น„ํŠธ์˜ random ๊ฐ’ A ์ƒ์„ฑ
๏‚— SHA256(A) ๊ฐ’์˜ ์ฒซ ๋ช‡๋น„ํŠธ๋ฅผ check sum์œผ๋กœ ์ƒ์„ฑ
๏‚— check sum์„ A ๊ฐ’์˜ ๋๋ถ€๋ถ„์— ์ถ”๊ฐ€
๏‚— A๋ฅผ 11๋น„ํŠธ๋กœ ๋‚˜๋ˆ„์–ด 24๊ฐœ์˜ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋ฏธ๋ฆฌ ์ •ํ•ด์ง„ 2048๊ฐœ์˜ ๋‹จ์–ด๋กœ ๊ตฌ์„ฑ๋œ ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋กœ ์‚ฌ์šฉ
ํ•˜์—ฌ ๋‹จ์–ด์—ด ์ƒ์„ฑ
๏‚— PBKDF2 ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 512๋น„ํŠธ์˜ common seed ์ƒ์„ฑ
๏‚— ์—ฐ์ƒ๊ธฐํ˜ธ ์ฝ”๋“œ์˜ ์—”ํŠธ๋กœํ”ผ์™€ ๋‹จ์–ด๊ธธ์ด
์—”ํŠธ๋กœํ”ผ(๋น„ํŠธ) ์ฒดํฌ์„ฌ(๋น„ํŠธ) ์—”ํŠธ๋กœํ”ผ+์ฒดํฌ์„ฌ ๋‹จ์–ด ๊ธธ์ด
128 4 132 12
160 5 165 15
192 6 198 18
224 7 231 21
256 8 264 24
๊ฒฐ์ •์  ์ง€๊ฐ‘ โ€“ ์—ฐ์ƒ๊ธฐํ˜ธ ์ฝ”๋“œ์›Œ๋“œ
๊ณ„์ธต๊ฒฐ์ •์  ์ง€๊ฐ‘(HD Wallet) (BIP32, BIP44)
๏‚— ๋‹จ์ผ ์ข…์ž(Seed)๋กœ๋ถ€ํ„ฐ ๋งŽ์€ ํ‚ค๋ฅผ ์‰ฝ๊ฒŒ ์–ป๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ
๏‚— ๋ถ€๋ชจํ‚ค๊ฐ€ ์ž์‹ํ‚ค์—ด์„ ๋งŒ๋“ค๊ณ , ๊ฐ๊ฐ์˜ ์ž์‹ํ‚ค๋Š” ์†์žํ‚ค ์—ด์„ ๋งŒ๋“ค์ˆ˜ ์žˆ์Œ
๏‚— ์œ ๊ธฐ์ ์ธ ๊ตฌ์กฐ์˜ ์˜๋ฏธ๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ํŠธ๋ฆฌ ๊ตฌ์กฐ๊ฐ€ ์‚ฌ์šฉ๋ ์ˆ˜ ์žˆ์Œ
๏‚— ๊ณต๊ฐœํ‚ค์— ๋Œ€์‘ํ•˜๋Š” ๊ฐœ์ธํ‚ค์— ์ ‘๊ทผํ•˜์ง€ ์•Š๊ณ ๋„ ๊ณต๊ฐœํ‚ค์—ด์„ ์ƒ์„ฑํ• ์ˆ˜ ์žˆ์Œ
์ข…์ž(Seed)๋กœ๋ถ€ํ„ฐ ๋งˆ์Šคํ„ฐํ‚ค์™€ ์ฒด์ธ์ฝ”๋“œ ์ƒ์„ฑํ•˜๊ธฐ
๏‚— HD์ง€๊ฐ‘์€ 128,256,512๋น„ํŠธ ํฌ๊ธฐ์˜ ๋ฌด์ž‘์œ„ ์ˆซ์ž์ธ root seed๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑ๋จ
๏‚— Root seed๋กœ๋ถ€ํ„ฐ HD์ง€๊ฐ‘ ์ „์ฒด๋ฅผ ๋ณต์›ํ• ์ˆ˜ ์žˆ์Œ
๏‚— Root seed๋Š” ์—ฐ์ƒ๊ธฐํ˜ธ ๋‹จ์–ด์—ด๋กœ ํ‘œํ˜„๋จ
๊ฐœ์ธ ์ž์‹ํ‚ค ์œ ๋„ํ•˜๊ธฐ
๏‚— ๋ถ€๋ชจํ‚ค๋กœ๋ถ€ํ„ฐ ์ž์‹ํ‚ค๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์ž์‹ํ‚ค ์œ ๋„(CHD) ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ
ํ™•์žฅํ‚ค
๏‚— ํ‚ค ์œ ๋„ํ•จ์ˆ˜๋Š” ์„ธ๊ฐ€์ง€ ์ž…๋ ฅ๊ฐ’(ํ‚ค, ์ฒด์ธ์ฝ”๋“œ, ๋ชฉํ‘œ์ž์‹์˜ ์ธ๋ฑ์Šค)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž์‹ํ‚ค๋ฅผ ์ƒ์„ฑ
๏‚— ํ‚ค์™€ ์ฒด์ธ์ฝ”๋“œ๋ฅผ ๊ฒฐํ•ฉํ•œ๊ฒƒ : 256๋น„ํŠธ์˜ ํ‚ค์™€ 256๋น„ํŠธ์˜ ์ฒด์ธ์ฝ”๋“œ๋ฅผ 512๋น„ํŠธ๋กœ ๊ฒฐํ•ฉ
๏‚— ํ™•์žฅ ๊ฐœ์ธํ‚ค : ๊ฐœ์ธํ‚ค์™€ ์ฒด์ธ์ฝ”๋“œ์˜ ๊ฒฐํ•ฉ, Base58Check ์—”์ฝ”๋”ฉ์‹œ โ€˜xprvโ€™ ์ ‘๋‘๋ถ€
xprv9tyUQV64JT5qs3RSTJkXCWKMyUgoQp7F3hA1xzG6ZGu6u6Q9VMNjGr67Lctvy5P8oyaY
AL9CAWrUE9i6GoNMKUga5biW6Hx4tws2six3b9c
๏‚— ํ™•์žฅ ๊ณต๊ฐœํ‚ค : ๊ณต๊ฐœํ‚ค์™€ ์ฒด์ธ์ฝ”๋“œ์˜ ๊ฒฐํ•ฉ, Base58Check ์—”์ฝ”๋”ฉ์‹œ โ€˜xpubโ€™ ์ ‘๋‘๋ถ€
xpub67xpozcx8pe95XVuZLHXZeG6XWXHpGq6Qv5cmNfi7cS5mtjJ2tgypeQbBs2UAR6KECeeM
VKZBPLrtJunSDMstweyLXhRgPxdp14sk9tJPW9
๊ณต๊ฐœ ์ž์‹ํ‚ค ์œ ๋„ํ•˜๊ธฐ
๏‚— ๊ฐœ์ธํ‚ค์—†์ด ๊ณต๊ฐœ ๋ถ€๋ชจํ‚ค๋กœ๋ถ€ํ„ฐ ๊ณต๊ฐœ ์ž์‹ํ‚ค๋ฅผ ์ƒ์„ฑ
๏‚— ๋ฌดํ•œ๊ฐœ์˜ ๊ณต๊ฐœํ‚ค์™€ ๋น„ํŠธ์ฝ”์ธ ์ฃผ์†Œ๋ฅผ ์ƒ์„ฑํ• ์ˆ˜ ์žˆ์ง€๋งŒ ์†ก๊ธˆ๋œ ๋ˆ์„ ์†Œ๋น„ํ• ์ˆ˜ ์—†์Œ
Libbitcoin์„ ์‚ฌ์šฉํ•˜์—ฌ HD์ง€๊ฐ‘์˜ ํ‚ค์ƒ์„ฑ
#include <bitcoin/bitcoin.hpp>
#include <string.h>
#include <iostream>
using namespace bc;
int main(void)
{
data_chunk seedChunk(16);
pseudo_random_fill(seedChunk);
std::cout << "nHex Seed: " << std::endl;
std::cout << encode_base16(seedChunk)<< std::endl;
wallet::word_list writtenWord = wallet::create_mnemonic(seedChunk);
if(wallet::validate_mnemonic(writtenWord)){
for(auto i = writtenWord.begin(); i != writtenWord.end(); ++i)
std::cout << *i << ' ';
}else{
std::cout << "mnemonic invalid!" << std::endl;
}
wallet::hd_private privateKey(seedChunk);
std::cout << "nnMaster Private Key: " << std::endl;
std::cout << privateKey.encoded() << std::endl;
wallet::hd_key keys = privateKey.to_hd_key();
std::cout << "nHex Master Private Key: " << std::endl;
std::cout << encode_base16(keys) << std::endl;
wallet::hd_public publicKey = privateKey.to_public();
std::cout << "nMaster Public Key: " << std::endl;
std::cout << publicKey.encoded() << std::endl;
wallet::hd_private childPrivateKey = privateKey.derive_private(1);
std::cout << "nChild Private Key: " << std::endl;
std::cout << childPrivateKey.encoded() << std::endl;
wallet::hd_public childPublicKey = privateKey.derive_public(1);
std::cout << "nChild Public Key: " << std::endl;
std::cout << publicKey.encoded() << std::endl;
std::cout << "nPayment Adress: " << std::endl;
std::cout <<
wallet::ec_public(childPublicKey.point()).to_payment_address().encoded()
<< "n" << std::endl;
}
https://github.com/ihpark92/Libbitcoin_Tutorial/blob/master/HD_Key.cpp
HD์ง€๊ฐ‘์˜ ํ‚ค์ƒ์„ฑ
ihpark92@ubuntu:~/work$ ./HD_key
Hex Seed:
c6343e966440d61d17423e81bfef3746
shiver peanut pitch silk aspect attend fringe elephant like youth soccer mind
Master Private Key:
xprv9s21ZrQH143K2CspDbSR9pNddmpvjZWpGV4KoZ2bc9d3RgthSDLreyTb72UFwwZowQjTwBBLaRceNgLwdjL77SccLQuQsp6vB8rujhW1xEp
Hex Master Private Key:
0488ade40000000000000000000ec10abb36391b6aebb63d3697b8d1c61fd6f66d274b06945f9cc42c41cd40a000df61edf0d6426ebc85
f94e0668b053b1801f3ac40dcc7dd948d4ba329030d603731b412d
Master Public Key:
xpub661MyMwAqRbcEgxHKcyRWxKNBofR92EfdhyvbwSDAVA2JVDqykf7Cmn4xGoRNgqjSPh4SkXXzQ8GUr42KAUEr53q2N8bpfpu8tznqZWm5fM
Child Private Key:
xprv9vfdCPd3QdEeYdDEGBjV2gSVkdwcDLButpskBgm88hgKTQR6CaaQnKCrHhF2YSiKW652bazqYdLATouWi5fZaiYo4YRs1Y3TXF4Cr6Boxjd
Child Public Key:
xpub661MyMwAqRbcEgxHKcyRWxKNBofR92EfdhyvbwSDAVA2JVDqykf7Cmn4xGoRNgqjSPh4SkXXzQ8GUr42KAUEr53q2N8bpfpu8tznqZWm5fM
Payment Adress:
1Bngpmye1f91RDtStQAVS2b9NsbNYhhK1K
ihpark92@ubuntu:~/work$
๋น„ํŠธ์ฝ”์ธ์˜ ๊ฑฐ๋ž˜(Transaction)
https://www.blockchain.com/en/explorer
์ผ๋ฐ˜์ ์ธ ๊ฑฐ๋ž˜
๏‚— ๋ณต์‹๋ถ€๊ธฐ ํ˜•ํƒœ์˜ ๊ฑฐ๋ž˜
์ผ๋ฐ˜์ ์ธ ๊ฑฐ๋ž˜
๏‚— ํ•œ ๊ฑฐ๋ž˜์˜ ์ถœ๋ ฅ๊ฐ’์ด ์ƒˆ๋กœ์šด ๊ฑฐ๋ž˜์˜ ์ž…๋ ฅ๊ฐ’์ด ๋˜๋Š” ๊ฑฐ๋ž˜์ฒด์ธ
๊ฑฐ๋ž˜์˜ ์ข…๋ฅ˜
๏‚— ํ•˜๋‚˜์˜ ์ž…๋ ฅ๊ฐ’๊ณผ 2๊ฐœ์˜ ์ถœ๋ ฅ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ
๏‚— ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๊ฑฐ๋ž˜๋กœ ํ˜„์‹ค์—์„œ ๊ฑฐ์Šค๋ฆ„๋ˆ์„ ๋ฐ›๋Š” ํ˜•ํƒœ
๏‚— B์—๊ฒŒ ๋น„ํŠธ์ฝ”์ธ 2๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ๋‚˜๋จธ์ง€ 8์„ ๊ฑฐ์Šค๋ฆ„๋ˆ์œผ๋กœ ๋ฐ›๋Š” ๊ฑฐ๋ž˜
๊ฑฐ๋ž˜์˜ ์ข…๋ฅ˜
๏‚— ๋‹ค์ˆ˜์˜ ์ž…๋ ฅ๊ฐ’๊ณผ ํ•˜๋‚˜์˜ ์ถœ๋ ฅ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ
๏‚— ๋™์ „๊ณผ ๋‹จ์œ„๊ฐ€ ์ž‘์€ ์ง€ํ๊ฐ€ ๋งŽ์€๊ฒฝ์šฐ ํฐ ๋‹จ์œ„์˜ ์ง€ํ ํ•œ์žฅ์œผ๋กœ ๊ตํ™˜ํ•˜๋Š” ํ–‰์œ„
๏‚— ์ง€๋ถˆ๊ณผ์ •์—์„œ ์ž”์•ก์œผ๋กœ ๋ฐ›์€ ์ž‘์€ ๋‹จ์œ„์˜ ๊ธˆ์•ก์„ ์ •๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ง€๊ฐ‘ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ด
์œ ํ˜•์˜ ๊ฑฐ๋ž˜๊ฐ€ ์‹œํ–‰๋˜๊ธฐ๋„ ํ•จ
๊ฑฐ๋ž˜์˜ ์ข…๋ฅ˜
๏‚— ํ•˜๋‚˜์˜ ์ž…๋ ฅ๊ฐ’๊ณผ ๋‹ค์ˆ˜์˜ ์ถœ๋ ฅ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ
๏‚— ๊ธฐ์—…์ฒด์—์„œ ๋‹ค์ˆ˜์˜ ์ง์›์—๊ฒŒ ๊ธ‰์—ฌ๋ฅผ ์ง€๋ถˆํ•˜๋Š”๋“ฑ ๋ˆ์„ ๋ถ„๋ฐฐํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ
๊ฑฐ๋ž˜์˜ ์ข…๋ฅ˜
๏‚— ์ž…๋ ฅ๊ฐ’์ด ์—†๊ณ  ์ถœ๋ ฅ๊ฐ’๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ
๏‚— ์ฑ„๊ตด์— ์„ฑ๊ณตํ•œ๊ฒฝ์šฐ ์ฑ„๊ตด์ž์—๊ฒŒ ๋ณด์ƒ์œผ๋กœ ๋น„ํŠธ์ฝ”์ธ์„ ์ œ๊ณตํ•˜๋Š” ๊ฑฐ๋ž˜ : Coinbase ๊ฑฐ๋ž˜
UTXO(Unspent Transaction Output)
๏‚— ๋ธ”๋ก์ฒด์ธ์ƒ์—์„œ ๊ฑฐ๋ž˜์˜ ๋‹จ์œ„
๏‚— ๊ฑฐ๋ž˜์˜ ์ถœ๋ ฅ๊ฐ’์œผ๋กœ, ์‚ฌ์šฉ๋˜์ง€์•Š๊ณ  ๊ณต๊ฐœํ‚ค๋กœ ์•”ํ˜ธํ™”๋˜์–ด ๋ธ”๋ก์ฒด์ธ์ƒ์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋‹จ์œ„
๏‚— ์•”ํ˜ธํ™”๋œ UTXO๋Š” ์‚ฌ์šฉ์‹œ์ ์— ์†Œ์œ ์ž์˜ ๊ฐœ์ธํ‚ค๋กœ ์•”ํ˜ธ๋ฅผ ํ•ด์ œํ•˜์—ฌ ๊ฑฐ๋ž˜์˜ ์ž…๋ ฅ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ
๏‚— ์ž์‹  ์†Œ์œ ์˜ ๋น„ํŠธ์ฝ”์ธ์˜ ์ „์ฒด ์ž”์•ก์„ ํ™•์ธํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด, ์ง€๊ฐ‘์— ์ €์žฅ๋˜์–ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋Š”
๋น„ํŠธ์ฝ”์ธ์˜ ๊ฐฏ์ˆ˜๋ฅผ ํ™•์ธํ•˜๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋ธ”๋ก์ฒด์ธ์ƒ์— ์ž์‹ ์˜ ์†Œ์œ ๋กœ ์ €์žฅ๋˜์–ด ์žˆ๋Š” UTXO
์˜ ์ถœ๋ ฅ๊ฐ’์„ ๋ชจ๋‘ ํ•ฉํ•œ๊ฒƒ์„ ํ™•์ธ
๋น„ํŠธ์ฝ”์ธ ์ž”์•ก์กฐํšŒ - UTXO์˜ ์ดํ•ฉ
# get unspent outputs from blockchain API
import json
import requests
# example address
address = 1JBwfNy2oyhFCoNyLb4nnh2se7gA6DBU7B'
resp = requests.get('https://blockchain.info/unspent?active=%s' % address)
utxo_set = json.loads(resp.text)["unspent_outputs"]
for utxo in utxo_set:
print("%s:%d - %ld Satoshis" % (utxo['tx_hash'], utxo['tx_output_n'], utxo['value']))
๋น„ํŠธ์ฝ”์ธ ์ž”์•ก์กฐํšŒ - Libbitcoin ์‚ฌ์šฉ
https://github.com/ihpark92/Libbitcoin_Tutorial/blob/master/BitcoinNetwork/Balance.cpp
#include <bitcoin/bitcoin.hpp>
#include <bitcoin/client.hpp>
#include <string.h>
#include <iostream>
using namespace bc;
uint64_t balancer(const chain::history::list& rows)
{
uint64_t unspent_balance = 0;
for(const auto& row: rows)
{
// spend unconfirmed (or no spend attempted)
if (row.spend.hash() == null_hash)
unspent_balance += row.value;
}
return unspent_balance;
}
void getBalance(wallet::payment_address address)
{
client::connection_type connection = {};
connection.retries = 3;
connection.timeout_seconds = 8;
connection.server =
config::endpoint("tcp://mainnet.libbitcoin.net:9091");
client::obelisk_client client(connection);
โ€ฆโ€ฆ
if(!client.connect(connection))
{
std::cout << "Fail" << std::endl;
} else {
std::cout << "Connection Succeeded" << std::endl;
}
client.blockchain_fetch_history3(on_error2, on_done, address);
client.wait();
}
int main()
{
wallet::payment_address addy("15QzCiznJXqihKmNTgcxwS8nf7sdSXBAE9");
getBalance(addy);
}
UTXO์˜ ์ƒ์„ฑ
๏‚— ๋‹ค๋ฅธ ์ฃผ์†Œ์—์„œ ์ž์‹ ์˜ ์ฃผ์†Œ๋กœ ๋น„ํŠธ์ฝ”์ธ์„ ์†ก๊ธˆ๋ฐ›๋Š” ๊ฒฝ์šฐ
UTXO์˜ ์†Œ๋ฉธ
๏‚— ๋‹ค๋ฅธ ์ฃผ์†Œ๋กœ ์†ก๊ธˆํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ
๊ฑฐ๋ž˜(Transaction)์˜ ๊ตฌ์กฐ
ํฌ๊ธฐ ํ•„๋“œ ์„ค๋ช…
4 Byte Version ํ”„๋กœํ† ์ฝœ ๋ฒ„์ „
1~9 Byte Input Count ์ž…๋ ฅ๊ฐ’์˜ ๊ฐฏ์ˆ˜
Variable Input ํ•˜๋‚˜ ์ด์ƒ์˜ ์ž…๋ ฅ๊ฐ’
1~9 Byte Output Count ์ถœ๋ ฅ๊ฐ’์˜ ๊ฐฏ์ˆ˜
Variable Output ํ•˜๋‚˜ ์ด์ƒ์˜ ์ถœ๋ ฅ๊ฐ’
4 Byte Locktime ๋ธ”๋ก์— ์ถ”๊ฐ€๋˜๋Š” ๊ฐ€์žฅ๋น ๋ฅธ์‹œ๊ฐ„
๊ฑฐ๋ž˜(Transaction)์˜ ๊ตฌ์กฐ
{
"lock_time":0,
"ver":1,
"size":257,
"inputs":[
{
"sequence":4294967295,
"witness":"",
"prev_out":{
"spent":true,
"tx_index":581424,
"type":0,
"addr":"1E3GodQUs3pdW4SasKXNHAtfJZHGmUhUxe",
"value":1000000000,
"n":1,
"script":"76a9148f07a8d943b08ea22cd9e98d329d99025b45edfb88ac"
},
"script":"47304402206f9748d80344eb4ef6492248843f0f179f8275c30788adf3ddbcddaebc9fc0
8a02202f09fda4b5f7caf0e958889069e999d1fb9258b28c7b6a8484b108f5be08efc60141046128
6410eda379b4790c5ff7d3ebcd078821c1773ee8200ae90ef211efe3aadd48ab65e2c4b482c23ba
6db447d9cf6d63939e07b73f57898d69a7bd3f90f4a97"
}
],
"weight":1028,
"time":1388195590,
"tx_index":41376062,
"vin_sz":1,
"hash":"04905ff987ddd4cfe603b03cfb7ca50ee81d89d1f8f5f265c38f763eea4a21fd",
"vout_sz":2,
"relayed_by":"67.83.126.1",
"out":[
{
"spent":true,
"tx_index":41376062,
"type":0,
"addr":"1K8jp6ifZQZMT1WmJUKuh4RAJFtPAFGCHB",
"value":500000000,
"n":0,
"script":"76a914c6e8e9dd79b5d8fef5309eba6aadc5323bf6315f88ac"
},
{
"spent":true,
"tx_index":41376062,
"type":0,
"addr":"1Mdhkk4ofugGrtTCfJBiivzcGWRW4RWquF",
"value":500000000,
"n":1,
"script":"76a914e253829af94cfba03688ad705b6b9d519ec9d3d588ac"
}
]
},
https://blockchain.info/block-height/277316?format=json
๊ฑฐ๋ž˜์˜ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์˜ ๊ด€๊ณ„
https://blockchain.info/block-height/499118?format=json https://blockchain.info/block-height/500000?format=json
{
"lock_time":0,
"ver":1,
"size":215,
"inputs":[
{
"sequence":4294967295,
"witness":"0247304402205f39ccbab38b644acea0776d18cb63ce3e37428cbac06dc23b59c61607aef6
9102206b8610827e9cb853ea0ba38983662034bd3575cc1ab118fb66d6a98066fa0bed01210304c0156
3d46e38264283b99bb352b46e69bf132431f102d4bd9a9d8dab075e7f",
"prev_out":{
"spent":true,
"tx_index":311962649,
"type":0,
"addr":"3FfQGY7jqsADC7uTVqF3vKQzeNPiBPTqt4",
"value":34676070,
"n":0,
"script":"a914994394dbd20b7752e272458c738ae9b7666271b787"
},
"script":"1600142b2296c588ec413cebd19c3cbc04ea830ead6e78"
}
],
"weight":533,
"time":1513194393,
"tx_index":311967252,
"vin_sz":1,
"hash":"fe6c48bbfdc025670f4db0340650ba5a50f9307b091d9aaa19aa44291961c69f",
"hash":"503e4e9824282eb06f1a328484e2b367b5f4f93a405d6e7b97261bafabfb53d5",
"vout_sz":2,
"relayed_by":"0.0.0.0",
"out":[
{
"spent":true,
"tx_index":311962649,
"type":0,
"addr":"3FfQGY7jqsADC7uTVqF3vKQzeNPiBPTqt4",
"value":34676070,
"n":0,
"script":"a914994394dbd20b7752e272458c738ae9b7666271b787"
},
{
"spent":true,
"tx_index":311962649,
"type":0,
"addr":"1NdvAyRJLdK5EXs7DV3ebYb5wffdCZk1pD",
"value":31129454,
"n":1,
"script":"76a914ed5600751fea259a0f8c8bec09a626e7e4450e7a88ac"
}
]
๊ฑฐ๋ž˜ ์ž…๋ ฅ๊ฐ’๊ณผ ์ถœ๋ ฅ๊ฐ’
ํ•„๋“œ ์„ค๋ช…
Transaction Hash ์†Œ๋น„๋  UTXO๋ฅผ ๋‹ด๊ณ ์žˆ๋Š” ๊ฑฐ๋ž˜์— ๋Œ€ํ•œ ID (TxID)
Output Index ์†Œ๋น„๋  UTXO์˜ ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ
Unlocking Script Length ํ•ด์ œ ์Šคํฌ๋ฆฝํŠธ ๊ธธ์ด
Unlocking Script(ScriptSig) UTXO์˜ ์†Œ๋น„์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ
Sequence Number ์‚ฌ์šฉํ•˜์ง€์•Š์Œ, 0xFFFFFFFF๋กœ ์„ค์ •
๏‚— Input
๏‚— Output
ํ•„๋“œ ์„ค๋ช…
value ์‚ฌํ† ์‹œ ๋‹จ์œ„์˜ ๊ฑฐ๋ž˜๊ธˆ์•ก(1์‚ฌํ† ์‹œ๋Š” 1์–ต๋ถ„์˜ 1 ๋น„ํŠธ์ฝ”์ธ)
Locking script length ์ž ๊ธˆ ์Šคํฌ๋ฆฝํŠธ ๊ธธ์ด
Locking Script
(ScriptPubKey)
์ถœ๋ ฅ๊ฐ’์„ ์†Œ๋น„ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์กฐ๊ฑด
๊ฑฐ๋ž˜ ์Šคํฌ๋ฆฝํŠธ
๏‚— ๋น„ํŠธ์ฝ”์ธ ๊ฑฐ๋ž˜ ์œ ํšจํ™” ์—”์ง„์—์„œ ๊ฑฐ๋ž˜์˜ ์œ ํšจ์„ฑ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ
๏‚— ์ž ๊ธˆ ์Šคํฌ๋ฆฝํŠธ(scriptPubKey)์™€ ํ•ด์ œ ์Šคํฌ๋ฆฝํŠธ(scriptSig)
๏‚— ์Šคํƒ(stack)์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ„์‚ฐ๋˜์–ด์ง
๏‚— ์กฐ๊ฑด๋ถ€ ํ๋ฆ„์ œ์–ด๊ธฐ๋Šฅ ์ด์™ธ์—๋Š” ๋ฃจํ”„๋‚˜ ๋ณต์žกํ•œ ํ๋ฆ„์ œ์–ด๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€์•Š์Œ
๏‚— ๊ฑฐ๋ž˜ ์Šคํฌ๋ฆฝํŠธ์˜ 5๊ฐ€์ง€ ํ‘œ์ค€
๏‚— Pay-to-public-key-hash(P2PKH), ๊ณต๊ฐœํ‚ค, ๋‹ค์ค‘์„œ๋ช…, pay-to-script-hash(P2SH), ๋ฐ์ดํƒ€์ถœ๋ ฅ
(OP_RETURN)
์ž ๊ธˆ ์Šคํฌ๋ฆฝํŠธ(scriptPubKey) ์ƒ์„ฑํ•˜๊ธฐ
๏‚— DUP + HASH160 + <pubKeyHash> + EQUALVERIFY + CHECKSIG
๏‚— 76 + a9 + length + pubKeyHash + 88 + ac
๏‚— pubKeyHash = Base58Decode(1NdvAyRJLdK5EXs7DV3ebYb5wffdCZk1pD)
๏‚— 00ED5600751FEA259A0F8C8BEC09A626E7E4450E7A2F6DA14A
๏‚— 76 + a9 + 14 + ED5600751FEA259A0F8C8BEC09A626E7E4450E7A + 88 + ac
๏‚— 76a914ED5600751FEA259A0F8C8BEC09A626E7E4450E7A88ac
"addr":"1NdvAyRJLdK5EXs7DV3ebYb5wffdCZk1pD",
"value":31129454,
"n":1,
"script":"76a914ed5600751fea259a0f8c8bec09a626e7e4450e7a88ac"
ํ•ด์ œ ์Šคํฌ๋ฆฝํŠธ(scriptSig) ์ƒ์„ฑํ•˜๊ธฐ
๏‚— scriptSig๋ฅผ ์ œ์™ธํ•œ ํŠธ๋žœ์žญ์…˜ ํ…œํ”Œ๋ฆฟ ์ž‘์„ฑ ๏‚— ์ด์ „์ถœ๋ ฅ์˜ scriptPubKey๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ช…
ํ•ด์ œ ์Šคํฌ๋ฆฝํŠธ(scriptSig) ์ƒ์„ฑํ•˜๊ธฐ
๏‚— 16์ง„์ˆ˜ ํŠธ๋žœ์žญ์…˜ ๋ฉ”์‹œ์ง€์™€ private key๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ signature ์ƒ์„ฑ
๏‚— ์ƒ์„ฑ๋œ signature
304402201c3be71e1794621cbe3a7adec1af25f818f238f5796d47152137eba710f2174a02204f8
fe667b696e30012ef4e56ac96afb830bddffee3b15d2e474066ab3aa39bad
import hashlib, ecdsa, binascii
from ecdsa import SigningKey, SECP256k1
mhex =
โ€˜0100000001416e9b4555180aaa0c417067a46607bc58c96f0131b2f41f7d0fb665eab03a7e000000001976a91499b1ebcfc11a13df5161aba81
60460fe1601d54188acffffffff01204e0000000000001976a914e81d742e2c3c7acd4c29de090fc2c4d4120b2bf888ac0000000001000000โ€™
txHash = hashlib.sha256(hashlib.sha256(mhex.decode('hex')).digest()).hexdigest()
privkey = '3cd0560f5b27591916c643a0b7aa69d03839380a738d2e912990dcc573715d2c'
signingkey = ecdsa.SigningKey.from_string(privkey.decode('hex'), curve=ecdsa.SECP256k1)
SIG = signingkey.sign_digest(txhash, sigencode=ecdsa.util.sigencode_der_canonize)
binascii.hexlify(SIG)
ํ•ด์ œ ์Šคํฌ๋ฆฝํŠธ(scriptSig) ์ƒ์„ฑํ•˜๊ธฐ
๏‚— ์ƒ์„ฑ๋œ signatur์™€ public key๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ scriptSig ๊ตฌ์„ฑ
PUSHDATA Opcode 0x47
: ์Šคํƒ์— ํ‘ธ์‰ฌ๋  ๋ฐ”์ดํŠธ์ˆ˜, sigHash ํฌํ•จ
R, S๋Š” 32, 33 ๋ฐ”์ดํŠธ๊ฐ€ ๋ ์ˆ˜ ์žˆ์Œ
์••์ถ•๊ณต๊ฐœํ‚ค(02, 03), ๋น„์••์ถ• ๊ณต๊ฐœํ‚ค(04)
ํ•ด์ œ ์Šคํฌ๋ฆฝํŠธ(scriptSig) ์ƒ์„ฑํ•˜๊ธฐ
๏‚— ์ตœ์ข… ์™„์„ฑ๋œ ํŠธ๋žœ์žญ์…˜
0100000001416e9b4555180aaa0c417067a46
607bc58c96f0131b2f41f7d0fb665eab03a7e0
00000006a47304402201c3be71e1794621cbe
3a7adec1af25f818f238f5796d47152137eba7
10f2174a02204f8fe667b696e30012ef4e56ac
96afb830bddffee3b15d2e474066ab3aa39bad
012103bf350d2821375158a608b51e3e898e5
07fe47f2d2e8c774de4a9a7edecf74edaffffffff
01204e0000000000001976a914e81d742e2c
3c7acd4c29de090fc2c4d4120b2bf888ac0000
0000
Pay-to-public-key-hash(P2PKH) ์Šคํฌ๋ฆฝํŠธ ์—ฐ์‚ฐ
Pay-to-public-key-hash(P2PKH) ์Šคํฌ๋ฆฝํŠธ ์—ฐ์‚ฐ
Libbitcoin ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ Raw transaction ์ƒ์„ฑํ•˜๊ธฐ
๏‚— https://github.com/ihpark92/Libbitcoin_T
utorial/blob/master/BitcoinNetwork/rawT
X.cpp
๏‚— https://github.com/ihpark92/Libbitcoin_T
utorial/blob/master/BitcoinNetwork/HD_
Wallet_Testnet.cpp
Libbitcoin ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ Raw transaction ์ƒ์„ฑํ•˜๊ธฐ
Libbitcoin ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ Raw transaction ์ƒ์„ฑํ•˜๊ธฐ
๋น„ํŠธ์ฝ”์ธ ๋…ธ๋“œ์˜ ๊ธฐ๋Šฅ
๏‚— Wallet
๏‚— ์ง€๊ฐ‘๊ธฐ๋Šฅ
๏‚— ์ง€๊ฐ‘์€ ์‚ฌ์šฉ์ž์˜ ๊ฐœ์ธํ‚ค์™€ ๊ณต๊ฐœํ‚ค๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ๊ฑฐ๋ž˜์— ์‚ฌ์šฉ๋˜๋Š” ์ฃผ์†Œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋‹ด๋‹น
๏‚— Miner
๏‚— ์ž‘์—…์ฆ๋ช…(Proof of Work : PoW) ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ 10๋ถ„๊ฐ„์˜ ์œ ํšจํ•œ ๊ฑฐ๋ž˜๋ฅผ ๋ธ”๋ก์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ 
๋ฉ”์ธ์ฒด์ธ์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ธฐ๋Šฅ
๏‚— Full Blockchain
๏‚— ์ตœ์ดˆ์˜ ๋ธ”๋Ÿญ์ธ ์ œ๋„ค์‹œ์Šค๋ธ”๋ก๊ณผ ๊ฐ€์žฅ ์ตœ์‹ ์˜ ๋ธ”๋ก๊นŒ์ง€ ํฌํ•จํ•œ ์™„์ „ํ•œ ๋ธ”๋ก์ฒด์ธ ๋ณต์‚ฌ๋ณธ์„ ๋ณด์œ 
๏‚— Network Routing
๏‚— ๋ธ”๋ก์ฒด์ธ์ƒ์˜ P2P ๋„คํŠธ์›Œํฌ ์ „์†ก๊ธฐ๋Šฅ
๋น„ํŠธ์ฝ”์ธ ๋…ธ๋“œ์˜ ์ข…๋ฅ˜
๏‚— Reference Client
๏‚— ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํฌํ•จํ•œ ์™„์ „ํ•œ ๋„คํŠธ์›Œํฌ์˜ ํ˜•ํƒœ. Bitcoin Core๊ฐ€ ์—ฌ๊ธฐ์— ํ•ด๋‹น
๏‚— Full Blockchain Node
๏‚— ๋„คํŠธ์›Œํฌ ๋ผ์šฐํŒ… ๊ธฐ๋Šฅ๊ณผ ๋ชจ๋“  ๋ธ”๋ก์ฒด์ธ ๋ฐ์ดํƒ€๋ฅผ ๊ฐ€์ง„ ํ˜•ํƒœ
๋น„ํŠธ์ฝ”์ธ ๋…ธ๋“œ์˜ ์ข…๋ฅ˜
๏‚— Solo Miner
๏‚— ์ง€๊ฐ‘๊ธฐ๋Šฅ์€ ์ œ์™ธํ•˜๊ณ  ์ฑ„๊ตด์— ํŠนํ™”๋œ ํ˜•ํƒœ์˜ ๋…ธ๋“œ
๏‚— Lightweight wallet(SPV : Simplified Payment Verification)
๏‚— ์ง€๊ฐ‘๊ธฐ๋Šฅ๊ณผ ๋„คํŠธ์›Œํฌ ๋ผ์šฐํŒ…๊ธฐ๋Šฅ๋งŒ ํฌํ•จ๋œ ๋…ธ๋“œ๋กœ ์ „์ฒด ๋ธ”๋ก์ฒด์ธ ๋ฐ์ดํƒ€๋Š” ์—†์ด ๋‹จ์ˆœํžˆ ๊ฑฐ๋ž˜์™€ ์œ 
ํšจ์„ฑ ๊ฒ€์ฆ๋งŒ ๊ฐ€๋Šฅํ•œ ๋…ธ๋“œ
SPV ๋…ธ๋“œ์˜ ์œ ํšจ์„ฑ ๊ฒ€์ฆ
๏‚— ํ’€๋…ธ๋“œ์˜ ๊ฒฝ์šฐ, ์ „์ฒด ๊ฑฐ๋ž˜์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ UTXO๋ฅผ ๊ฒ€์ฆํ•˜์—ฌ ๊ฑฐ๋ž˜์— ์œ ํšจํ•œ์ง€๋ฅผ ํŒ๋‹จ
๏‚— SPV๋…ธ๋“œ๋Š” ์ „์ฒด ๋ธ”๋ก์„ ๋‹ค์šด๋กœ๋“œํ•˜์ง€์•Š๊ณ , ๋ธ”๋กํ—ค๋”๋งŒ ๋‹ค์šด๋กœ๋“œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด๋ธ”๋ก ๋Œ€๋น„ 1000๋ถ„
์˜ 1์ •๋„์˜ ์ž‘์€ ์šฉ๋Ÿ‰๋งŒ ์ฐจ์ง€
๏‚— ๊ฑฐ๋ž˜์ •๋ณด๊ฐ€ ์—†์ด ๋ธ”๋กํ—ค๋”๋งŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ฑฐ๋ž˜๋ฅผ ์œ„ํ•ด ๋ธ”๋ก์ฒด์ธ์ƒ์˜ ๋ธ”๋ก์˜ ๋†’์ด ๋Œ€์‹  ๊นŠ์ด
๋ฅผ ์ฐธ์กฐํ•ด์„œ ๊ฑฐ๋ž˜๋ฅผ ๊ฒ€์ฆ
SPV ๋…ธ๋“œ์˜ ์œ ํšจ์„ฑ ๊ฒ€์ฆ์„ ์œ„ํ•œ ๋ธ”๋ฃธํ•„ํ„ฐ
๏‚— ์ธ๊ทผ์˜ ํ’€๋…ธ๋“œ์—๊ฒŒ ํ—ค๋”์™€ ๊ฑฐ๋ž˜์ •๋ณด๋ฅผ ์š”์ฒญํ•˜์—ฌ ๊ฑฐ๋ž˜์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์ฆํ•˜์—ฌ ๊ฑฐ๋ž˜๋ฅผ ์ง„ํ–‰
๏‚— ํ—ค๋”์™€ ๊ฑฐ๋ž˜์ •๋ณด๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ณผ์ •์—์„œ ์ž์‹ ์˜ ์ •๋ณด๊ฐ€ ๋…ธ์ถœ๋˜์–ด ์ต๋ช…์„ฑ์ด ์œ„๋ฐฐ
๏‚— SPV ๋…ธ๋“œ๋Š” ์ต๋ช…์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ธ”๋ฃธํ•„ํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฑฐ๋ž˜์— ์‚ฌ์šฉ
๏‚— N๊ฐœ์˜ ํ•ด์‰ฌํ•จ์ˆ˜์™€ M๊ฐœ์˜ 1๋น„ํŠธ ๋ฐฐ์—ด๋กœ ๊ตฌ์„ฑ
๏‚— N๊ฐœ์˜ ํ•ด์‰ฌํ•จ์ˆ˜๋Š” 1์—์„œ M ์‚ฌ์ด์˜ ์ถœ๋ ฅ๊ฐ’์„ ๊ฐ€์ง€๊ณ , ํ•ด๋‹น ์ถœ๋ ฅ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” ์ธ๋ฑ์Šค์˜ ๋น„ํŠธ๋ฐฐ์—ด์„ 1
๋กœ ์„ค์ •
๏‚— N๊ฐœ์˜ ํ•ด์‰ฌํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ถœ๋ ฅ๊ฒฐ๊ณผ๋กœ M๋น„ํŠธ๋ฐฐ์—ด์€ N๊ฐœ๊ฐ€ 1๋กœ ์„ค์ •
๋ธ”๋ฃธํ•„ํ„ฐ์˜ ๋™์ž‘์›๋ฆฌ - ํ•„ํ„ฐ์ƒ์„ฑ
๋ธ”๋ฃธํ•„ํ„ฐ์˜ ๋™์ž‘์›๋ฆฌ - ํŒจํ„ด๊ฒ€์ฆ
SPV๋…ธ๋“œ์˜ ๊ฑฐ๋ž˜๋ฅผ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•œ ๋จธํดํŒจ์Šค
๏‚— ๊ฑฐ๋ž˜ K์™€ ๋จธํดํŒจ์Šค๋กœ ์ œ๊ณต๋œ Hash(L)์„ ์‚ฌ์šฉํ•˜์—ฌ Hash(KL)์„ ๊ณ„์‚ฐ
๏‚— ๋จธํดํŒจ์Šค๋กœ ์ œ๊ณต๋œ Hash(IJ)์™€ ๊ณ„์‚ฐ๋œ Hash(KL)์„ ์‚ฌ์šฉํ•˜์—ฌ Hash(IJHL) ๊ณ„์‚ฐ
๏‚— ๊ณ„์‚ฐ๋œ Hash(IJKL)๊ณผ ๋จธํดํŒจ์Šค๋กœ ์ œ๊ณต๋œ Hash(MNOP)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Hash(IJKLMNOP) ๊ณ„์‚ฐ
๏‚— ๋จธํดํŒจ์Šค๋กœ ์ œ๊ณต๋œ Hash(ABCDEFGH)์™€ ๊ณ„์‚ฐ๋œ Hash(IJKLMNOP)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Hash(ABCDEFGHIJKLMNOP)๋ฅผ
๊ณ„์‚ฐ
๏‚— ๊ณ„์‚ฐ๋œ Hash(ABCDEFGHIJKLMNOP)์™€ ํ—ค๋”์— ํฌํ•จ๋œ ๋จธํด๋ฃจํŠธ๋ฅผ ๋น„๊ตํ•˜์—ฌ ๋™์ผํ•œ ๊ฐ’์ด๋ฉด ๊ฑฐ๋ž˜ K๊ฐ€ ๋ธ”๋ก์— ํฌํ•จ
๋˜์–ด์žˆ์Œ์ด ์ฆ๋ช…๋จ
๋จธํดํŠธ๋ฆฌ์˜ ํšจ์œจ์„ฑ
๏‚— ๋ธ”๋กํ—ค๋”(๋ธ”๋ก๋‹น 80 ๋ฐ”์ดํŠธ)๋งŒ ๋‹ค์šด๋กœ๋“œ ๋ฐ›๊ณ , ์ˆ˜์‹ญ ๊ธฐ๊ฐ€๋ฐ”์ดํŠธ๊ฐ€ ๋ ์ง€๋„ ๋ชจ๋ฅด๋Š” ๋ธ”๋ก์ฒด์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ €
์žฅํ•˜๊ฑฐ๋‚˜ ์ „์†กํ•  ํ•„์š”์—†์ด ํ’€๋…ธ๋“œ๋กœ๋ถ€ํ„ฐ ์ž‘์€ ํฌ๊ธฐ์˜ ๋จธํดํŒจ์Šค๋งŒ ์ „์†ก๋ฐ›์•„ ๊ฑฐ๋ž˜์˜ ํฌํ•จ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ• 
์ˆ˜ ์žˆ์Œ
๊ฑฐ๋ž˜๊ฑด์ˆ˜ ๋ธ”๋ก์˜ ๋Œ€๋žต์ ํฌ๊ธฐ ๊ฒฝ๋กœํฌ๊ธฐ(ํ•ด์‰ฌ) ๊ฒฝ๋กœํฌ๊ธฐ(๋ฐ”์ดํŠธ)
16๊ฑด 4 KB 4 Hash 128 Byte
512๊ฑด 128 KB 9 Hash 288 Byte
2,048๊ฑด 512 KB 11 Hash 352 Byte
65,535๊ฑด 16 MB 16 Hash 512 Byte
๋น„ํŠธ์ฝ”์ธ์˜ ๋งˆ์ด๋‹
๏‚— ์ฑ„๊ตด(Mining)์€ 10๋ถ„๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๋น„ํŠธ์ฝ”์ธ์„ ์ƒ์‚ฐํ•˜๋Š” ๊ณผ์ •
๏‚— ์ตœ์ดˆ์— ๋น„ํŠธ์ฝ”์ธ์˜ ์ œ๋„ค์‹œ์Šค ๋ธ”๋ก์ด ์ƒ์„ฑ๋œ ์‹œ์ ์—๋Š” ์ƒˆ๋กœ์šด ๋ธ”๋ก์ด ์ƒ์„ฑ๋ ๋•Œ๋งˆ๋‹ค 50๊ฐœ์˜ ๋น„ํŠธ์ฝ”์ธ์ด
๋ณด์ƒ์œผ๋กœ ์ œ๊ณต
๏‚— ํ†ตํ™”์˜ ์ธํ”Œ๋ ˆ์ด์…˜์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋น„ํŠธ์ฝ”์ธ์€ 4๋…„๋งˆ๋‹ค(์ •ํ™•ํžˆ๋Š” 210,000๋ธ”๋ก๋งˆ๋‹ค) ๊ทธ ์ƒ์‚ฐ๋Ÿ‰์ด ์ ˆ
๋ฐ˜์œผ๋กœ ์ค„์–ด๋“ฌ
๊ฑฐ๋ž˜์˜ ์œ ํšจ์„ฑ ๊ฒ€์ฆ
๏‚— ๊ฑฐ๋ž˜์˜ ๊ตฌ๋ฌธ๊ณผ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ์ •ํ™•ํ•ด์•ผ ํ•œ๋‹ค.
๏‚— ์ž…๋ ฅ๊ฐ’์ด๋‚˜ ์ถœ๋ ฅ๊ฐ’ ๋ชฉ๋ก์ด ๋น„์–ด์žˆ์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.
๏‚— ๋ฐ”์ดํŠธ ๋‹จ์œ„์˜ ๊ฑฐ๋ž˜ ํฌ๊ธฐ๊ฐ€ MAX_BLOCK_SIZE๋ณด๋‹ค ์ž‘๋‹ค.
๏‚— ์ถœ๋ ฅ๊ฐ’ ๊ธˆ์•ก๊ณผ ๋…ธ๋“œ์˜ ์ด ๊ธˆ์•ก์ด ํ—ˆ์šฉ๋œ ๊ฐ€์น˜๋ฒ”์œ„(0~2100๋งŒ)๋‚ด์— ์žˆ์–ด์•ผ ํ•œ๋‹ค.
๏‚— ์ž…๋ ฅ๊ฐ’์ค‘ ํ•ด์‹œ๊ฐ’์€ 0, N๊ฐ’์€ -1์ด์–ด์„œ๋Š” ์•ˆ๋œ๋‹ค.
๏‚— nLOCKTime์€ INT_MAX๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๋™์ผํ•ด์•ผ ํ•œ๋‹ค.
๏‚— ๋ฐ”์ดํŠธ ๋‹จ์œ„์˜ ๊ฑฐ๋ž˜ ํฌ๊ธฐ๊ฐ€ 100๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๋™์ผํ•ด์•ผ ํ•œ๋‹ค.
๏‚— ๊ฑฐ๋ž˜์— ๋‹ด๊ฒจ์žˆ๋Š” ์„œ๋ช…์ž‘์—… ๊ฑด์ˆ˜๊ฐ€ ์„œ๋ช…์ž‘์—… ํ•œ๋„๋‚ด์— ์žˆ์–ด์•ผ ํ•œ๋‹ค.
๏‚— ํ•ด์ œ์Šคํฌ๋ฆฝํŠธ๋Š” ์Šคํƒ์ƒ๋ถ€์— ์ˆซ์ž๋ฅผ ์ถ”๊ฐ€ํ• ์ˆ˜๋งŒ ์žˆ๊ณ , ์ž ๊ธˆ ์Šคํฌ๋ฆฝํŠธ๋Š” isStandard ํ˜•ํƒœ์™€ ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค.
๏‚— ํ’€์ด๋‚˜ ๋ฉ”์ธ ๋ธŒ๋ Œ์น˜์— ์žˆ๋Š” ๋ธ”๋ก์— ์ง์„ ์ด๋ฃจ๋Š” ๊ฑฐ๋ž˜๊ฐ€ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค.
๏‚— ๊ฐ๊ฐ์˜ ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•ด, ์ฐธ์กฐ ์ถœ๋ ฅ๊ฐ’์ด ํ’€ ๋‚ด์˜ ์–ด๋– ํ•œ ๊ฑฐ๋ž˜ ๋‚ด๋ถ€์— ์กด์žฌํ•œ๋‹ค๋ฉด ํ•ด๋‹น๊ฑฐ๋ž˜๋Š” ๊ฑฐ๋ถ€๋˜์–ด์•ผ ํ•œ๋‹ค.
๏‚— ์ž…๋ ฅ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” ์ฐธ์กฐ๊ฑฐ๋ž˜๊ฐ€ ์—†๋Š”๊ฒฝ์šฐ ๊ณ ์•„๊ฑฐ๋ž˜ ํ’€์— ์ถ”๊ฐ€ํ•˜๋ผ.
๏‚— ๊ฐ๊ฐ์˜ ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•ด ์ฐธ์กฐ ์ถœ๋ ฅ๊ฐ’์ด ์ฝ”์ธ๋ฒ ์ด์Šค ์ถœ๋ ฅ์ด๋ผ๋ฉด ์ตœ์†Œ COINBASE_MATURITY(100) ์Šน์ธ์„ ๋ฐ›์•„์•ผํ•œ๋‹ค.
๏‚— ๊ฐ๊ฐ์˜ ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•œ ์ฐธ์กฐ ์ถœ๋ ฅ๊ฐ’์ด ์กด์žฌํ•ด์•ผ ํ•˜๊ณ , ์ด๋ฏธ ์†Œ๋น„๋˜์—ˆ์œผ๋ฉด ์•ˆ๋œ๋‹ค.
๏‚— ์ฐธ์กฐ์ถœ๋ ฅ ๊ฑฐ๋ž˜์—์„œ ์ž…๋ ฅ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ๋•Œ ์ž…๋ ฅ๊ฐ’ ๊ธˆ์•ก๊ณผ ์ž…๋ ฅ๊ฐ’ ์ด์•ก์ด ํ—ˆ์šฉ๋œ ๊ฐ€์น˜๋ฒ”์œ„๋‚ด์— ์žˆ์–ด์•ผ ํ•œ๋‹ค.
๏‚— ์ž…๋ ฅ๊ฐ’ ๊ธˆ์•ก์ด ์ถœ๋ ฅ๊ฐ’ ์ด์•ก๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ ํ•ด๋‹น ๊ฑฐ๋ž˜๋ฅผ ๊ฑฐ์ ˆํ•˜๋ผ.
๏‚— ๊ฑฐ๋ž˜ ์ˆ˜์ˆ˜๋ฃŒ๊ฐ€ ๋น„์–ด์žˆ๋Š” ๋ธ”๋ก์— ๋“ค์–ด๊ฐ€๊ธฐ์— ๋„ˆ๋ฌด ์ž‘์„๋•Œ๋Š” ํ•ด๋‹น ๊ฑฐ๋ž˜๋ฅผ ๊ฑฐ์ ˆํ•˜๋ผ.
๏‚— ๊ฐ ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•œ ํ•ด์ œ ์Šคํฌ๋ฆฝํŠธ๋Š” ๊ทธ์— ํ•ด๋‹นํ•˜๋Š” ์ถœ๋ ฅ๊ฐ’ ์ž ๊ธˆ ์Šคํฌ๋ฆฝํŠธ์— ๋Œ€ํ•ด ๊ฒ€์ฆํ•ด์•ผ ํ•œ๋‹ค.
๋ธ”๋ก์— ๊ฑฐ๋ž˜ ์ถ”๊ฐ€ํ•˜๊ธฐ
๏‚— ์ฑ„๊ตด๋…ธ๋“œ๋Š” ๋จผ์ € ๊ฒ€์ฆ๋œ ๊ฑฐ๋ž˜๊ฐ€ ๋“ค์–ด์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌํ’€(Memory pool) ๋˜๋Š” ๊ฑฐ๋ž˜ํ’€(Transaction pool)์—์„œ ์กฐ๊ฑด์— ๋งž
๋Š” ๊ฑฐ๋ž˜๋“ค์„ ์„ ๋ณ„ํ•˜์—ฌ ๋ธ”๋ก์„ ๊ตฌ์„ฑ
๏‚— ๊ฑฐ๋ž˜ํ’€์€ ๊ฑฐ๋ž˜๋“ค์ด ๋ธ”๋ก๋‚ด์— ํฌํ•จ๋ ์ˆ˜ ์žˆ์„๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์žฅ์†Œ
๏‚— ์ˆ˜์ˆ˜๋ฃŒ์™€ ์šฐ์„ ์ˆœ์œ„๋กœ ๋ฉ”๋ชจ๋ฆฌํ’€์—์„œ ๊ฑฐ๋ž˜๊ฐ€ ์„ ํƒ๋˜์–ด์ง : ์šฐ์„ ์ˆœ์œ„ = sum(๊ฑฐ๋ž˜์ˆ˜์ˆ˜๋ฃŒ * ๊ฑฐ๋ž˜๋‚˜์ด) / ๊ฑฐ๋ž˜ํฌ๊ธฐ
๏‚— ๋ธ”๋ก๋‚ด๋ถ€์˜ ๊ฑฐ๋ž˜๊ณต๊ฐ„์ค‘ ์ฒซ 50kbyte๋Š” ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ๊ฑฐ๋ž˜๋“ค์—๊ฒŒ ํ• ๋‹น๋จ
๋ธ”๋ก์˜ ํ—ค๋” ๊ตฌ์„ฑํ•˜๊ธฐ
ํฌ๊ธฐ ํ•„๋“œ ์„ค๋ช…
4 ๋ฐ”์ดํŠธ ๋ฒ„์ „ ๋ฒ„์ „ ๋ฒˆํ˜ธ
32 ๋ฐ”์ดํŠธ ์ด์ „๋ธ”๋ก ํ•ด์‹œ ์ฒด์ธ๋‚ด ์ด์ „๋ธ”๋ก์˜ ํ•ด์‹œ์— ๋Œ€ํ•œ ์ฐธ์กฐ
32 ๋ฐ”์ดํŠธ ๋จธํด ๋ฃจํŠธ ๊ฑฐ๋ž˜์˜ ๋จธํดํŠธ๋ฆฌ์˜ ๋ฃจํŠธ์— ๋Œ€ํ•œ ํ•ด์‹œ
4 ๋ฐ”์ดํŠธ ํƒ€์ž„์Šคํƒฌํ”„ ๋ธ”๋ก์˜ ๋Œ€๋žต์ ์ธ ์ƒ์„ฑ์‹œ๊ฐ„
4 ๋ฐ”์ดํŠธ ๋‚œ์ด๋„ ๋ชฉํ‘œ ๋ธ”๋ก์˜ ์ž‘์—…์ฆ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•œ ๋‚œ์ด๋„ ๋ชฉํ‘œ
4 ๋ฐ”์ดํŠธ ๋…ผ์Šค ์ž‘์—…์ฆ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์‚ฌ์šฉ๋˜๋Š” ์นด์šดํ„ฐ
์ž‘์—…์ฆ๋ช…(PoW:Proof of Work) ์•Œ๊ณ ๋ฆฌ์ฆ˜
๏‚— ํ•ด์‹œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ž„์˜์˜ ๊ธธ์ด๋ฅผ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ ์ž…๋ ฅ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ๊ณ ์ •๋œ ๊ธธ์ด์˜ ๊ฒฐ์ •์  ๊ฒฐ๊ณผ๊ฐ’์„ ์ƒ์‚ฐ
๏‚— ํŠน์ • ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•œ ํ•ด์‹œ ๊ฒฐ๊ณผ๊ฐ’์€ ํ•ญ์ƒ ๋™์ผํ•˜๊ณ  ์‰ฝ๊ฒŒ ๊ณ„์‚ฐ๊ฐ€๋Šฅํ•˜๋ฉฐ ์–ด๋–ค ๋…ธ๋“œ์—์„œ๋„ ๊ฒ€์ฆ๊ฐ€๋Šฅ
๏‚— ํŠน์ • ์ถœ๋ ฅ๊ฐ’์— ๋Œ€ํ•œ ์ž…๋ ฅ๊ฐ’์˜ ์ถ”์ธก์ด ๋ถˆ๊ฐ€๋Šฅํ•˜์—ฌ, ๋ฌด์ž‘์œ„ ๋Œ€์ž…์„ ํ†ตํ•ด์„œ๋งŒ ์›ํ•˜๋Š” ์ถœ๋ ฅ๊ฐ’์„ ์–ป์„์ˆ˜ ์žˆ์Œ
๏‚— SHA256 ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ถœ๋ ฅ๊ฐ’์€ 256๋น„ํŠธ ๊ธธ์ด์˜ ์ถœ๋ ฅ๊ฐ’ ์ƒ์„ฑ
๏‚— Nonce๋ฅผ ๋ณ€ํ™”์‹œ์ผœ๊ฐ€๋ฉฐ ๋‚œ์ด๋„ ๋ชฉํ‘œ๊ฐ’๋ณด๋‹ค ์ž‘์€ ์ถœ๋ ฅ๊ฐ’์ด ์ƒ์„ฑ๋ ๋•Œ๊นŒ์ง€ SHA256 ์—ฐ์‚ฐ์„ ๋ฐ˜๋ณต
๏‚— ๋‚œ์ด๋„ ๋ชฉํ‘œ๊ฐ’๋ณด๋‹ค ์ž‘์€๊ฐ’์ด ๋ฐœ๊ฒฌ๋œ๊ฒฝ์šฐ ๋ธ”๋ก์ฑ„๊ตด์— ์„ฑ๊ณตํ•˜์—ฌ ์ฑ„๊ตด๋œ ๋ธ”๋ก์„ ์ „ํŒŒ
์ž‘์—…์ฆ๋ช…(PoW:Proof of Work) ์•Œ๊ณ ๋ฆฌ์ฆ˜
๏‚— Nonce ๊ฐ’์˜ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๋Š” 4๋ฐ”์ดํŠธ
๏‚— nonce๋กœ ํ‘œํ˜„๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€๊ฐ’์€ 42์–ต
๏‚— nonce๋ฅผ ์ฐพ๊ธฐ์œ„ํ•ด ๋ธ”๋กํ—ค๋”๋ฅผ hash ์—ฐ์‚ฐ์‹œ 42์–ต๋ฒˆ์˜ ์—ฐ์‚ฐ์ด ์ˆ˜ํ–‰๋˜๋ฉด 0์œผ๋กœ ์ดˆ๊ธฐํ™”๊ฐ€ ๋จ
๏‚— ์ฆ‰, 42์–ต๋ฒˆ์˜ ์—ฐ์‚ฐํ›„์—๋Š” hash ์—ฐ์‚ฐ์˜ ์ดˆ๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•จ
๏‚— merkle root ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์—ฌ ๋‹ค์‹œ nonce๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ›„ PoW ์—ฐ์‚ฐ ์ˆ˜ํ–‰
๏‚— Coinbase ๊ฑฐ๋ž˜์˜ ์ฒ˜์Œ 8๋ฐ”์ดํŠธ(Extra nonce)๋ฅผ ์ถ”๊ฐ€๋กœ ์‚ฌ์šฉ
๏‚— 1์ดˆ์— 296 ๊ฐœ์˜ ํšŸ์ˆ˜๊นŒ์ง€ ๊ณ„์‚ฐ๊ฐ€๋Šฅ
๋ธ”๋ก์˜ ์ž‘์—…์ฆ๋ช… ๋‚œ์ด๋„ ๋ชฉํ‘œ๊ฐ’
๏‚— target = coefficient * 2(8 โˆ— ๐‘’๐‘ฅ๐‘๐‘œ๐‘›๐‘’๐‘›๐‘ก โˆ’3 )
๏‚— Bits : 419668748 = 0x1903a30c :
=> exponent = 0x19, coefficient = 0x03a30c
๏‚— target = 0x03a30c * 2**(0x08 * (0x19 - 0x03))
=> target = 0x03a30c * 2**(0x08 * 0x16)
=> target = 0x03a30c * 2**0xB0
=> target = 238348 * 2176
๏‚— target =
22,829,202,948,393,929,850,749,706,076,701,368,331,0
72,452,018,388,575,715,328
๏‚— target
= 0x0000000000000003A30C0000000000000000000000
0000000000000000000000
๏‚— 2์ฃผ๋งˆ๋‹ค(2016๋ธ”๋ก) ์ƒˆ๋กญ๊ฒŒ ๊ณ„์‚ฐ
๋ธ”๋กํ•ด์‰ฌ ๊ตฌํ•˜๊ธฐ
https://blockchain.info/block-height/277316?format=json
import hashlib
import struct
little_endian = lambda value: struct.pack('<L', value).hex()
reverse_order_pair = lambda value: ''.join([value[i - 2:i] for i in range(len(value), 0, -2)])
# https://blockchain.info/block-height/277316?format=json
block_info = {
'version' : 2,
'prev_hash' : '0000000000000002a7bbd25a417c0374cc55261021e8a9ca74442b01284f0569',
'merkle_root' : 'c91c008c26e50763e9f548bb8b2fc323735f73577effbc55502c51eb4cc7cf2e',
'time' : 1388185914,
'bits' : 419668748,
'nonce' : 924591752,
}
convert_block_info = {}
# convert version, time, bits, nonce to little endian format
convert_block_info['version'] = little_endian(block_info['version'])
convert_block_info['time'] = little_endian(block_info['time'])
convert_block_info['bits'] = little_endian(block_info['bits'])
convert_block_info['nonce'] = little_endian(block_info['nonce'])
# reverse order of prev block hash, merkle root
convert_block_info['prev_hash'] = reverse_order_pair(block_info['prev_hash'])
convert_block_info['merkle_root'] = reverse_order_pair(block_info['merkle_root'])
# mix 6 block header info to one hex value
header_hex = convert_block_info['version'] + convert_block_info['prev_hash'] + 
convert_block_info['merkle_root'] + convert_block_info['time'] + 
convert_block_info['bits'] + convert_block_info['nonce']
# convert hex value to bin
header_bin = bytes.fromhex(header_hex)
# double hash
hash = hashlib.sha256(hashlib.sha256(header_bin).digest()).digest()
# reverse order and convert to hex
result_header_hex = hash[::-1].hex()
print(result_header_hex)
์ฑ„๊ตด ๋ธ”๋ก์˜ ์œ ํšจ์„ฑ ๊ฒ€์ฆ
๏‚— ํ•ด๋‹น ๋ธ”๋ก์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋Š” ๋ฌธ๋ฒ•์ ์œผ๋กœ ์œ ํšจํ•˜๋‹ค.
๏‚— ํ•ด๋‹น ๋ธ”๋ก ํ—ค๋” ํ•ด์‹œ๋Š” ์ž‘์—…์ฆ๋ช…์„ ์‹œํ–‰ํ•˜๋Š” ๋ชฉํ‘œ ๋‚œ์ด๋„๋ณด๋‹ค ์ž‘๋‹ค.
๏‚— ํ•ด๋‹น ๋ธ”๋ก์˜ ํƒ€์ž„์Šคํƒฌํ”„๋Š” (์‹œ๊ฐ„์˜ค๋ฅ˜๋ฅผ ๊ณ ๋ คํ•ด์„œ) ํ–ฅํ›„ 2์‹œ๊ฐ„ ์ด๋‚ด๋‹ค.
๏‚— ํ•ด๋‹น ๋ธ”๋ก์˜ ํฌ๊ธฐ๋Š” ํ—ˆ์šฉํ• ์ˆ˜ ์žˆ๋Š” ํ•œ๋„๋‚ด์— ์žˆ๋‹ค.
๏‚— ์ œ์ผ ์ฒซ ๊ฑฐ๋ž˜๋Š” ์ฝ”์ธ๋ฒ ์ด์Šค ์ƒ์„ฑ๊ฑฐ๋ž˜์ด๋‹ค.
๏‚— ๋ธ”๋ก๋‚ด์˜ ๋ชจ๋“  ๊ฑฐ๋ž˜๋Š” ๊ฑฐ๋ž˜ ์œ ํšจ์„ฑ ๊ฒ€์ฆ๊ณผ์ •์— ์ด์ƒ์ด ์—†๋Š” ์œ ํšจํ•œ ๊ฑฐ๋ž˜์ด์–ด์•ผ ํ•œ๋‹ค.
๋ธ”๋ก์ฒด์ธ์˜ ๋ถ„๊ธฐ - 1
๏‚— ํŒŒ๋ž€์ƒ‰ ๋ธ”๋ก์„ ๊ฐ€์žฅ ์ตœ์ƒ์œ„ ๋ธ”๋ก์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ธ”๋ก์ฒด์ธ์„ ๋‚˜ํƒ€๋‚ด๊ณ  ์žˆ์œผ๋ฉฐ, ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ๋™์ผํ•œ ํŒŒ๋ž€๋ธ”๋ก์„ ๋ถ€
๋ชจ๋ธ”๋ก์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์Œ
๋ธ”๋ก์ฒด์ธ์˜ ๋ถ„๊ธฐ - 2
๏‚— ์บ๋‚˜๋‹ค์—์„œ ๋นจ๊ฐ„์ƒ‰ ๋ธ”๋ก์ด ์ƒ์„ฑ๋˜์–ด ์ „ํŒŒ๊ฐ€ ๋˜๊ณ , ํ˜ธ์ฃผ์—์„œ ์ดˆ๋ก์ƒ‰ ๋ธ”๋ก์ด ์ƒ์„ฑ๋˜์–ด ์ „ํŒŒ๊ฐ€ ๋˜๊ณ  ์žˆ์œผ๋ฉฐ ๋‘๊ฐœ ๋ธ”๋ก
์€ ๋ชจ๋‘ ๋™์ผํ•œ ํŒŒ๋ž€์ƒ‰ ๋ธ”๋ก์„ ๋ถ€๋ชจ๋ธ”๋ก์œผ๋กœ ํ•˜์—ฌ ์ „ํŒŒ
๋ธ”๋ก์ฒด์ธ์˜ ๋ถ„๊ธฐ - 3
๏‚— ๊ฐ์ž ์ƒ์„ฑ๋œ ๋ธ”๋ก์ด ๋ชจ๋“ ๋…ธ๋“œ์— ์ „ํŒŒ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋‹ค์Œ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋นจ๊ฐ„์ƒ‰ ๋ธ”๋ก๊ณผ ์ดˆ๋ก์ƒ‰ ๋ธ”๋ก์ด ๋งˆ์ง€๋ง‰ ๋ธ”๋ก์œผ๋กœ
์ด๋ฃจ์–ด์ง„ ๋‘๊ฐœ์˜ ๋ธ”๋ก์ฒด์ธ์œผ๋กœ ๋ถ„๊ธฐ๊ฐ€ ๋ฐœ์ƒ
๏‚— ์ดˆ๋ก์ƒ‰ ๋ธ”๋ก์œผ๋กœ ํ™•์žฅ๋œ ๋…ธ๋“œ์—์„œ๋Š” ๋’ค๋Šฆ๊ฒŒ ๋„์ฐฉํ•œ ๋นจ๊ฐ„์ƒ‰ ๋ธ”๋ก์€ ๋ฌด์‹œํ•˜๊ฒŒ ๋˜๊ณ , ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋นจ๊ฐ„์ƒ‰ ๋ธ”๋ก์œผ๋กœ ํ™•์žฅ
๋œ ๋…ธ๋“œ๋Š” ๋’ค๋Šฆ๊ฒŒ ๋„์ฐฉํ•œ ์ดˆ๋ก์ƒ‰ ๋ธ”๋ก์€ ๋ฌด์‹œํ•˜๊ฒŒ ๋จ
๋ธ”๋ก์ฒด์ธ์˜ ๋ถ„๊ธฐ - 4
๏‚— ์ดˆ๋ก์ƒ‰ ๋ธ”๋ก์„ ๋ถ€๋ชจ๋ธ”๋ก์œผ๋กœ ๊ฐ€์ง€๋Š” ๋…ธ๋“œ์—์„œ ์ƒˆ๋กญ๊ฒŒ ๋ถ„ํ™์ƒ‰ ๋ธ”๋ก์„ ์ƒ์„ฑํ•˜์—ฌ ์ „ํŒŒ๋ฅผ ์‹œ์ž‘
๋ธ”๋ก์ฒด์ธ์˜ ๋ถ„๊ธฐ - 5
๏‚— ์ดˆ๋ก์ƒ‰ ๋ธ”๋ก์„ ๋ถ€๋ชจ๋ธ”๋ก์œผ๋กœ ๊ฐ€์ง€๋Š” ๋…ธ๋“œ๋Š” ์ •์ƒ์ ์œผ๋กœ ํ™•์žฅ์ด ์ง„ํ–‰๋˜์ง€๋งŒ, ๋นจ๊ฐ„์ƒ‰ ๋ธ”๋ก์„ ๋ถ€๋ชจ๋กœ ๊ฐ€์ง€๋Š” ๋…ธ๋“œ๋Š” 2๊ฐœ
์˜ ๋ธ”๋ก์ฒด์ธ์œผ๋กœ ๋ถ„๊ธฐ
๏‚— ํŒŒ๋ž€๋ธ”๋ก->๋นจ๊ฐ„๋ธ”๋ก์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ธ”๋ก์ฒด์ธ๊ณผ, ํŒŒ๋ž€๋ธ”๋ก->์ดˆ๋ก๋ธ”๋ก->๋ถ„ํ™๋ธ”๋ก ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ 2๊ฐœ์˜ ๋ธ”๋ก์œผ๋กœ ๋ถ„๊ธฐ
๏‚— ๋ถ„๊ธฐ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ ๊ฐ€์žฅ๋งŽ์€์ˆ˜์˜ ๋ธ”๋ก์œผ๋กœ ๊ตฌ์„ฑ๋œ ์ฒด์ธ์ด ๊ทธ๋งŒํผ ์œ ํšจํ•œ ์ž‘์—…์ฆ๋ช…์ด ์ด๋ฃจ์–ด์กŒ๋‹ค๊ณ  ํŒ๋‹จํ•˜์—ฌ
ํ•˜๊ธฐ ์˜ˆ์—์„œ๋Š” ํŒŒ๋ž€์ƒ‰->์ดˆ๋ก์ƒ‰->๋ถ„ํ™์ƒ‰ ๋ธ”๋ก์œผ๋กœ ๊ตฌ์„ฑ๋œ ์ฒด์ธ์„ ๋ฉ”์ธ์ฒด์ธ์œผ๋กœ ์„ ํƒํ•˜๊ฒŒ ๋˜๊ณ , ๋นจ๊ฐ„์ƒ‰ ๋ธ”๋ก์— ํฌํ•จ๋˜
์–ด ์žˆ๋˜ ๊ฑฐ๋ž˜๋Š” ๋‹ค์‹œ ๊ฑฐ๋ž˜ํ’€์— ๋“ค์–ด๊ฐ€ ์ƒˆ๋กœ์šด ๋ธ”๋ก์ƒ์„ฑ์„ ์œ„ํ•ด ๋Œ€๊ธฐ

Blockchain 1st bitcoin_core

  • 1.
  • 2.
    ๋ชฉ์ฐจ ๏‚— ๋ธ”๋ก์ฒด์ธ์˜ ๊ฐœ๋… ๏‚—๋น„ํŠธ์ฝ”์ธ์˜ ๊ตฌ์„ฑ์š”์†Œ ๏‚— ๋น„ํŠธ์ฝ”์ธ ๋ธ”๋ก์˜ ๊ตฌ์กฐ ๏‚— ๊ฐœ์ธํ‚ค(Private key), ๊ณต๊ฐœํ‚ค(Public key), ๋น„ํŠธ์ฝ”์ธ ์ฃผ์†Œ(Address) ๏‚— ํ‚ค์™€ ์ฃผ์†Œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ง€๊ฐ‘(Wallet) ๏‚— ๋น„ํŠธ์ฝ”์ธ ํŠธ๋žœ์žญ์…˜ ๏‚— scriptSig์™€ scriptPubKey์˜ ์ƒ์„ฑ๋ฐฉ๋ฒ•๊ณผ ์œ ํšจ์„ฑ ๊ฒ€์ฆ๋ฐฉ๋ฒ• ๏‚— ๋น„ํŠธ์ฝ”์ธ์˜ ํ•ฉ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ : PoW(Proof of Work) ๏‚— ๋ธ”๋ก์ฒด์ธ์˜ ๋ถ„๊ธฐ
  • 3.
    ๋ธ”๋ก์ฒด์ธ โ€“ ๊ฐ€์น˜๊ณต์œ ์˜์ธํ„ฐ๋„ท ๏‚— ๊ธฐ์กด์˜ ์ธํ„ฐ๋„ท์€ "์ •๋ณด"๋ฅผ ์ „๋‹ฌ, ๋ธ”๋ก์ฒด์ธ์€ "๊ฐ€์น˜"๋ฅผ ์ „๋‹ฌ ๏‚— Alice๊ฐ€ Bob์—๊ฒŒ 1๋‹ฌ๋Ÿฌ์˜ ๊ฐ€์น˜๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ ๏‚— ์ธํ„ฐ๋„ท ๋ฑ…ํ‚น์„ ํ†ตํ•œ 1๋‹ฌ๋Ÿฌ ์ด์ฒด ๏‚— 1๋‹ฌ๋Ÿฌ์˜ ๋””์ง€ํ„ธ ์ƒํ’ˆ๊ถŒ์„ ๊ตฌ์ž…ํ•˜์—ฌ ์ „๋‹ฌ ๏‚— ์ธํ„ฐ๋„ท์ƒ์—์„œ์˜ ๊ฐ€์น˜์ „๋‹ฌ์˜ ๋ฌธ์ œ์  ๏‚— ์ค‘์•™์ง‘์ค‘์„œ๋ฒ„๊ฐ€ ๋ณต๊ตฌ๋ถˆ๊ฐ€๋Šฅ์ƒํƒœ๋กœ ํŒŒ๊ดด๋˜๊ฑฐ๋‚˜ ํ•ดํ‚น๋œ ๊ฒฝ์šฐ ๊ฐ€์น˜์†Œ๋ฉธ ๏‚— ์ƒํ’ˆ๊ถŒ์„ ๋ณต์ œํ•˜์—ฌ ์ด์ค‘์ง€๋ถˆ ๋ฌธ์ œ ๋ฐœ์ƒ ๏‚— ๋ธ”๋ก์ฒด์ธ์„ ํ†ตํ•œ ๊ฐ€์น˜์ „๋‹ฌ๋ฌธ์ œ์˜ ํ•ด๊ฒฐ ๏‚— ๋ชจ๋“  ๊ฑฐ๋ž˜์ •๋ณด๊ฐ€ ๋ธ”๋ก์˜ ํ˜•ํƒœ๋กœ ์ €์žฅ๋˜์–ด ๋ชจ๋“  ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐฐํฌ๋˜๊ณ  ์ €์žฅ ๏‚— ๋ธ”๋ก์ฒด์ธ ๊ณ ์œ ์˜ ํ•ฉ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด ์ด์ค‘์ง€๋ถˆ ๋ฌธ์ œ ํ•ด๊ฒฐ
  • 4.
  • 5.
  • 6.
    ๋น„ํŠธ์ฝ”์ธ์˜ ๊ตฌ์„ฑ์š”์†Œ -2 ๏‚— Wallet ๏‚— ๊ฐ ์‚ฌ์šฉ์ž์˜ Private/Public ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ณด๊ด€ ๏‚— Publicํ‚ค๋Š” Privateํ‚ค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑ๋˜๊ณ  Public ํ‚ค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Bitcoin ์ฃผ์†Œ๊ฐ€ ์ƒ์„ฑ ๏‚— Transaction ๏‚— ์‹ค์ œ ๋น„ํŠธ์ฝ”์ธ์˜ ์ด๋™์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฑฐ๋ž˜๋ฅผ ๋งํ•˜๋ฉฐ, ๊ฑฐ๋ž˜์˜ ๋‹จ์œ„๋Š” UTXO์ด๊ณ , ๊ฐ ๊ฑฐ๋ž˜๋Š” ๊ฐ ์‚ฌ์šฉ์ž ์˜ ํ‚ค๋กœ ์„œ๋ช…์ด ๋˜์–ด ์ง€์ •๋œ ์‚ฌ์šฉ์ž๋ผ๋ฆฌ๋งŒ ๊ฑฐ๋ž˜๊ฐ€ ๊ฐ€๋Šฅ ๏‚— Block ๏‚— ๊ฐ๊ฐ์˜ ๋ธ”๋ก์€ ํ—ค๋”์™€ 10๋ถ„๊ฐ„ ๋ฐœ์ƒํ•œ ๊ฑฐ๋ž˜์ •๋ณด๊ฐ€ ํฌํ•จ ๏‚— Network ๏‚— ๊ฑฐ๋ž˜์™€ ๋ธ”๋ก์„ ๋„คํŠธ์›Œํฌ์ƒ์˜ ๋ชจ๋“  ๋…ธ๋“œ์—๊ฒŒ ์ „ํŒŒํ•˜๋Š” P2P ๊ธฐ๋ฐ˜ ๋„คํŠธ์›Œํฌ ๏‚— Miner ๏‚— ๊ฑฐ๋ž˜๊ฐ€ ํฌํ•จ๋œ Block์„ ๊ฐ€์ง€๊ณ , ์ด์ค‘์ง€๋ถˆ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก PoW(Proof of Work : ์ž‘์—…์ฆ๋ช…) ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋ธ”๋ก์„ ์—ฐ๊ฒฐํ•˜๋Š” ์ฃผ์ฒด
  • 7.
    ๋น„ํŠธ์ฝ”์ธ์˜ ํ•ด์‰ฌ(Hash) ํ•จ์ˆ˜: SHA256 ๏‚— ์–ด๋–ค ๊ธธ์ด์˜ ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•ด์„œ๋„ ๋™์ผํ•œ ๊ธธ์ด์˜ ์ถœ๋ ฅ๊ฐ’์„ ์ƒ์„ฑ ๏‚— Hash(A) = 123โ€ฆasd(32๋ฐ”์ดํŠธ ๊ธธ์ด), Hash(ABC) = afdโ€ฆ35f(32๋ฐ”์ดํŠธ ๊ธธ์ด) ๏‚— ์–ด๋–ค ์ž…๋ ฅ X์— ๋Œ€ํ•ด์„œ Hash(X) = Y ๊ฐ’์„ ์‰ฝ๊ฒŒ ๊ณ„์‚ฐ๊ฐ€๋Šฅ ๏‚— ๋น„ํŠธ์ฝ”์ธ ์ž‘์—…์ฆ๋ช…์˜ ๊ฒฐ๊ณผ๋ฌผ์ธ ๋ธ”๋ก์˜ ์œ ํšจ์„ฑ ๊ฒ€์ฆ์ด ์‰ฝ๊ฒŒ ๋จ ๏‚— Hash(X) = Y ์ธ ๊ฒฝ์šฐ, X๊ฐ’์„ ์œ ์ถ”ํ•˜๋Š”๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์ผ๋ฐฉํ•จ์ˆ˜ ๏‚— ๋น„ํŠธ์ฝ”์ธ PoW์—์„œ nonce๋ฅผ ์ฐพ๋Š” ๊ณผ์ • ๏‚— ๋™์ผํ•œ ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•ด์„œ๋Š” ๋™์ผํ•œ ์ถœ๋ ฅ๊ฐ’์„ ์ƒ์„ฑํ•˜์ง€๋งŒ, ์ž…๋ ฅ๋ฐ์ดํƒ€๊ฐ€ ๋ณ€ํ•˜๋ฉด ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ์ถœ๋ ฅ๊ฐ’์„ ์ƒ์„ฑ ๏‚— https://anders.com/blockchain/hash.html
  • 8.
    ํ•ด์‹ฑ ๋ฐ์ดํ„ฐ์˜ 5๊ฐ€์ง€ํŒจํ„ด ๏‚— ๋…๋ฆฝํ•ด์‹ฑ ๏‚— ์ˆœ์ฐจ์  ํ•ด์‹ฑ ๏‚— ๋ฐ˜๋ณตํ•ด์‹ฑ ๏‚— ๊ณ„์ธต์  ํ•ด์‹ฑ ๏‚— ๊ฒฐํ•ฉํ•ด์‹ฑ
  • 9.
    ๋น„ํŠธ์ฝ”์ธ์—์„œ Hash ํ•จ์ˆ˜์‚ฌ์šฉ ๏‚— RIPEMD160(SHA256(x)) ๏‚— ๋น„ํŠธ์ฝ”์ธ ์ฃผ์†Œ ์ƒ์„ฑ ๏‚— SHA256(SHA256(x)) ๏‚— ๋จธํดํŠธ๋ฆฌ์—์„œ ํŠธ๋žœ์žญ์…˜์˜ ํ•ด์‰ฌ ์—ฐ์‚ฐ ๏‚— ํŠธ๋žœ์žญ์…˜ ID ์ƒ์„ฑ ๏‚— ๋ธ”๋กํ—ค๋”์˜ ํ•ด์‰ฌ ์—ฐ์‚ฐ ๏‚— Double hash ์—ฐ์‚ฐ์„ ํ•˜๋Š” ์ด์œ  ๏‚— length-extension attacks ๋ฐฉ์ง€ ๏‚— A๊ฐ’์„ ๋ชฐ๋ผ๋„ hash(A)์™€ length(A)๋ฅผ ์•Œ๋ฉด hash(A||B)์„ ์•Œ์ˆ˜ ์žˆ์Œ
  • 10.
    ๋น„ํŠธ์ฝ”์ธ์˜ ๋ธ”๋ก โ€“๋ธ”๋ก์ •๋ณด ๏‚— Block explorer : https://www.blockchain.com/en/explorer
  • 11.
  • 12.
    ๋น„ํŠธ์ฝ”์ธ์˜ ๋ธ”๋ก -๋ธ”๋กํ—ค๋” ๏‚— Timestamp(๋ธ”๋ก์ด ์ƒ์„ฑ๋œ ์‹œ๊ฐ„) : 2018-03-01 08:11:49 ๏‚— Bits(๋ธ”๋ก ์ƒ์„ฑ์˜ ๋‚œ์ด๋„) : 392009692 ๏‚— Version(ํ”„๋กœํ† ์ฝœ ๋ฒ„์ „) : 0x20000000 ๏‚— Merkle Root(ํŠธ๋žœ์žญ์…˜ ID๋ฅผ ๋จธํดํŠธ๋ฆฌ ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑํ•œ ํ•ด์‹œ์ •๋ณด) : b958fda3ce4d3cd0a41f01a6b00f6ae4e70f498a27f526cc5612f72450152d17 ๏‚— Previois Block(์ด์ „ ๋ธ”๋ก์˜ ํ•ด์‹œ์ •๋ณด) : 00000000000000000029b633899beed322666cc0041fbdf471300d52e6de1887 ๏‚— Nonce : 2170187189
  • 13.
    ๋จธํดํŠธ๋ฆฌ ๏‚— ํŠน์ •๊ฑฐ๋ž˜๊ฐ€ ๋ธ”๋ก๋‚ด๋ถ€์—ํฌํ•จ๋˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์ฆํ•˜๋Š”๋ฐ ํšจ์œจ์ ์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ œ๊ณต ๏‚— ์ƒํ–ฅ์‹์œผ๋กœ ๋‘๊ฐœ์˜ Hash๊ฐ’์„ ๋‘๋ฒˆ ํ•ด์‰ฌ(Double SHA256)ํ•˜์—ฌ ์ƒ์œ„ Hash๊ฐ’ ์ƒ์„ฑ ๏‚— Hash(AB) = SHA256(SHA256(Hash(A) + Hash(B)) ๏‚— ์ด์ง„ ํŠธ๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ง์ˆ˜๊ฐœ์˜ ๋ฆฌํ”„๋…ธ๋“œ๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ ํ™€์ˆ˜๊ฐœ์˜ ๊ฒฝ์šฐ์—๋Š” ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ์ง์ˆ˜ ๋กœ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉ
  • 14.
    ๋จธํด๋ฃจํŠธ ๊ณ„์‚ฐ import hashlib #Hash pairs of items recursively until a single value is obtained def merkle(hashList): if len(hashList) == 1: return hashList[0] newHashList = [] # Process pairs. For odd length, the last is skipped for i in range(0, len(hashList)-1, 2): newHashList.append(hash2(hashList[i], hashList[i+1])) if len(hashList) % 2 == 1: # odd, hash last item twice newHashList.append(hash2(hashList[-1], hashList[-1])) return merkle(newHashList) def hash2(a, b): # Reverse inputs before and after hashing # due to big-endian / little-endian nonsense a1 = a.decode('hex')[::-1] b1 = b.decode('hex')[::-1] h = hashlib.sha256(hashlib.sha256(a1+b1).digest()).digest() return h[::-1].encode('hex') # https://www.blockchain.com/en/btc/block/000000000003ba27aa200b1cecaad478d2b00432346c 3f1f3986da1afd33e506 txHashes = [ "8c14f0db3df150123e6f3dbbf30f8b955a8249b62ac1d1ff16284aefa3d06d87", "fff2525b8931402dd09222c50775608f75787bd2b87e56995a7bdd30f79702c4", "6359f0868171b1d194cbee1af2f16ea598ae8fad666d9b012c8ed2b79a236ec4", "e9a66845e05d5abc0ad04ec80f774a7e585c6e8db975962d069a522137b80c1d", ] print merkle(txHashes)
  • 15.
    ๋น„ํŠธ์ฝ”์ธ์˜ ๋ธ”๋ก โ€“๋ธ”๋กํ—ค๋” ๊ตฌ์กฐ
  • 16.
    ๋น„ํŠธ์ฝ”์ธ์˜ ๋ธ”๋ก โ€“๋ธ”๋ก์ฒด์ธ ๏‚— ํ•˜๋‚˜์˜ ๋ธ”๋ก์€ ๊ณ„์‚ฐ๋œ Hash ๊ฐ’๊ณผ ๋ธ”๋กํ—ค๋”, 10๋ถ„๊ฐ„ ์ง„ํ–‰๋œ ๊ฑฐ๋ž˜(Transaction) ๋‚ด์—ญ์ด ํฌํ•จ ๋˜๋ฉฐ ์ด ๋ธ”๋ก์ด ์—ฐ์†๋œ ์ฒด์ธํ˜•ํƒœ๋กœ ๊ตฌ์„ฑ.
  • 17.
    ๋Œ€์นญํ‚ค ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๏‚— ์•”ํ˜ธํ™”/๋ณตํ˜ธํ™”์†๋„๊ฐ€ ๋น„๋Œ€์นญํ‚ค ์•”ํ˜ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋ณด๋‹ค ๋น ๋ฅด๋‹ค(์ตœ์†Œ10~์ตœ๋Œ€1000๋ฐฐ). ๏‚— ์•”ํ˜ธ๋ฌธ์˜ ํฌ๊ธฐ๊ฐ€ ํ‰๋ฌธ๋ณด๋‹ค ํฌ์ง€ ์•Š๋‹ค(์•”ํ˜ธํ™” ์‹œ ๋ฐ์ดํ„ฐ ์ฆ๊ฐ€๊ฐ€ ์—†๋‹ค). ๏‚— ์ฃผ๋กœ ๋ฐ์ดํ„ฐ ํ†ต์‹ ์˜ ์•”ํ˜ธํ™”์— ์‚ฌ์šฉ
  • 18.
    ๋น„๋Œ€์นญํ‚ค ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๏‚— ๊ณต๊ฐœํ‚ค๋กœ์•”ํ˜ธํ™”ํ•œ ๋ฐ์ดํ„ฐ๋Š” ๊ฐœ์ธํ‚ค๋กœ๋งŒ ๋ณตํ˜ธํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ๏‚— ๊ฐœ์ธํ‚ค๋กœ ์•”ํ˜ธํ™”ํ•œ ๋ฐ์ดํ„ฐ๋Š” ๊ณต๊ฐœํ‚ค๋กœ๋งŒ ๋ณตํ˜ธํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ๏‚— ๋น„ํŠธ์ฝ”์ธ์˜ ํŠธ๋žœ์žญ์…˜์—์„œ๋Š” ๋น„๋Œ€์นญํ‚ค ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์œ ํšจ์„ฑ ๊ฒ€์ฆ์ด ์ด๋ฃจ์–ด์ง„๋‹ค. https://anders.com/blockchain/public-private-keys/signatures.html
  • 19.
    ๊ฐœ์ธํ‚ค(Private key) ๏‚— ๋ฌด์ž‘์œ„๋กœ์ถ”์ถœํ•œ ๋‹จ์ˆœํ•œ ์ˆซ์ž ๏‚— ์•”ํ˜ธํ•™์ ์œผ๋กœ ์•ˆ์ „ํ•œ ์˜์‚ฌ๋‚œ์ˆ˜์ƒ์„ฑ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ๋˜์–ด์•ผ ํ•จ ๏‚— ๋น„ํŠธ์ฝ”์ธ์—์„œ ๊ฐœ์ธํ‚ค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ž‘์—…์€ 1์—์„œ 2256 ์‚ฌ์ด์˜ ์ˆซ์ž๋ฅผ ์„ ํƒํ•˜๋Š”๊ฒƒ๊ณผ ๋™์ผ ๏‚— ๊ฐœ์ธํ‚ค๋Š” 256๋น„ํŠธ ๊ธธ์ด์˜ ์ˆซ์ž๋กœ ์ƒ์„ฑ ์œ ํ˜• ์ ‘๋‘๋ถ€ ์„ค๋ช… Hex ์—†์Œ 64๊ฐœ์˜ 16์ง„์ˆ˜ ex) 1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD WIF 5 Base58Check ์—”์ฝ”๋”ฉ ex) 5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn WIF-์••์ถ•ํ˜• K ๋˜๋Š” L Base58Check ์—”์ฝ”๋”ฉ, ์ธ์ฝ”๋”ฉ์ „ ์ ‘๋ฏธ๋ถ€ 0x01 ์ถ”๊ฐ€ ex) KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ
  • 20.
    ํƒ€์›๊ณก์„ ์•”ํ˜ธํ™”(Elliptic Curve Cryptography) ๏‚—๊ณต๊ฐœํ‚ค ์•”ํ˜ธํ™”์˜ ํ•ต์‹ฌ์€ ๊ณ ์œ ์˜ ํŠธ๋žฉ๋„์–ดํ•จ์ˆ˜(Trapdoor function) ๏‚— A + B = C : Not Trapdoor function ๏‚— โ€œMessageโ€ + public key = โ€œs80s1s9sadjds9sโ€ : Trapdoor function ๏‚— RSA๋Œ€๋น„ 256๋น„ํŠธ์˜ ECC๊ฐ€ 3072 ๋น„ํŠธ์˜ RSA์™€ ๋™์ผํ•œ ๋ณด์•ˆ์„ ์ œ๊ณต ํƒ€์›๊ณก์„  ๋ง์…ˆํ•จ์ˆ˜ ํƒ€์›๊ณก์„  ๊ณฑ์…ˆํ•จ์ˆ˜
  • 21.
    ๊ณต๊ฐœํ‚ค(Public key) -1 ๏‚— ํƒ€์›๊ณก์„  ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด Private ํ‚ค๋กœ๋ถ€ํ„ฐ ๊ณ„์‚ฐ. : OpenSSL ์•”ํ˜ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ ๏‚— K = 1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD * G ๏‚— K = (x, y) x = F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A y = 07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB K = k * G (K : Public ํ‚ค, k : Private ํ‚ค, G : ์ƒ์„ฑํฌ์ธํŠธ ์ƒ์ˆ˜) ๐‘ฆ2 = ๐‘ฅ3 + ๐‘Ž๐‘ฅ + ๐‘ ๐‘ฆ2 = ๐‘ฅ3 + 7 : secp256k1(๋น„ํŠธ์ฝ”์ธ, ์ด๋”๋ฆฌ์›€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํƒ€์›๊ณก์„ ) : a = 0, b = 7 : G = 02 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798
  • 22.
    ๊ณต๊ฐœํ‚ค(Public key) -2 ๏‚— ๋น„์••์ถ• ๊ณต๊ฐœํ‚ค : K = 04F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341Aโ†ต 07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB ๏‚— ์••์ถ• ๊ณต๊ฐœํ‚ค : : K = 03F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A : ์••์ถ• ๊ณต๊ฐœํ‚ค๋Š” 02, 03 ์˜ ์ ‘๋‘์–ด๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋จ
  • 23.
    ์ฃผ์†Œ(Address) ๏‚— ์ˆซ์ž์™€ ๋ฌธ์ž๋กœ๊ตฌ์„ฑ๋œ ๋ฌธ์ž์—ด๋กœ ์ˆซ์ž 1๋กœ ์‹œ์ž‘ : 1thMirt546nngXqyPEz532S8fLwbozud8 ๏‚— ๊ฐœ์ธํ‚ค ๋ฐ ๊ณต๊ฐœํ‚ค ์Œ์„ ๋ณด์œ ํ•œ ์†Œ์œ ์ฃผ ๏‚— ๋น„ํŠธ์ฝ”์ธ ๊ฑฐ๋ž˜์˜ ๋Œ€์ƒ ๏‚— A = RIPEMD160(SHA256(K)) : K = Public ํ‚ค
  • 24.
  • 25.
    Base58Check Encoding ๏‚— ๊ธธ์ด๊ฐ€๊ธด ์ˆซ์ž์—ด์„ ์••์ถ•ํ•ด์„œ ํ‘œํ˜„ ๏‚— 10์ง„๋ฒ• : 0์—์„œ 9๊นŒ์ง€์˜ 10๊ฐœ์˜ ์ˆซ์ž๋ฅผ ์‚ฌ์šฉ ๏‚— 16์ง„๋ฒ• : 10๊ฐœ์˜ ์ˆซ์ž์™€ 6๊ฐœ์˜ ๋ถ€ํ˜ธ๋ฅผ ์‚ฌ์šฉ ๏‚— Base64 : ์†Œ๋ฌธ์ž 26๊ฐœ, ๋Œ€๋ฌธ์ž 26๊ฐœ, ์ˆซ์ž 10๊ฐœ, ํŠน์ˆ˜๋ฌธ์ž 2๊ฐœ(+, /) ์‚ฌ์šฉ ๏‚— Base58 : Base64์—์„œ 0, O, l, I, +, / ๋ฅผ ์ œ์™ธ ๏‚— ์˜ค์ž๋‚˜ ๋ฐ์ดํ„ฐ ์ž…๋ ฅ์˜ค๋ฅ˜ ๋“ฑ์— ๋Œ€ํ•œ ์ถ”๊ฐ€๋ณด์•ˆ์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด Checksum ์ถ”๊ฐ€ ์œ ํ˜• ๋ฒ„์ „ ์ ‘๋‘๋ถ€ Base58 ์ ‘๋‘๋ถ€ ๊ฒฐ๊ณผ๊ฐ’ ๋น„ํŠธ์ฝ”์ธ ์ฃผ์†Œ 0x00 1 Pay-to-script-Hash ์ฃผ์†Œ 0x05 3 ๋น„ํŠธ์ฝ”์ธ ํ…Œ์ŠคํŠธ๋„ท ์ฃผ์†Œ 0x6F m , n ๊ฐœ์ธํ‚ค WIF 0x80 5, K, L BIF38 ์•”ํ˜ธํ™” ๊ฐœ์ธํ‚ค 0x0142 6P BIF32 ํ™•์žฅ ๊ณต๊ฐœํ‚ค 0x0488B21E xpub BIF32 ํ™•์žฅ ๊ฐœ์ธํ‚ค 0x0488ADE4 xprv
  • 26.
    ๊ฐœ์ธํ‚ค, ๊ณต๊ฐœํ‚ค, ์ฃผ์†Œ์˜๋ณ€ํ™˜๊ณผ์ • http://royalforkblog.github.io/2014/08/11/graphical-address-generator/
  • 27.
    ์ƒ์„ฑ ๊ฐ€๋Šฅํ•œ ์ฃผ์†Œ์˜ํฌ๊ธฐ ๏‚— ์ƒ์„ฑ ๊ฐ€๋Šฅํ•œ ๋น„ํŠธ์ฝ”์ธ ์ฃผ์†Œ์˜ ํฌ๊ธฐ : 2160 ๏‚— 1,461,501,637,330,902,918,203,684,832,716,283,019,655,932,542,97 ๏‚— ์ง€๊ตฌ์ƒ์˜ ๋ชจ๋ž˜์•Œ์˜ ์ˆ˜ : 263 ๏‚— 263๊ฐœ์˜ ์ง€๊ตฌ์— 263๊ฐœ์˜ ๋ชจ๋ž˜์•Œ์ด ์žˆ๋Š”๊ฒฝ์šฐ์˜ ์ˆ˜ : 2126 ๏‚— 2126 = 2160 ์˜ 0.0000000058 % ๏‚— 2017๋…„ ๊ธฐ์ค€ ์ „์„ธ๊ณ„ ์ธ๊ตฌ๊ฐ€ 75์–ต์ธ ๊ฒฝ์šฐ, ๋ชจ๋“  ์‚ฌ๋žŒ์€ ๊ฐ๊ฐ 2127 ๊ฐœ์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€์งˆ์ˆ˜ ์žˆ์Œ
  • 28.
    Libbitcoin ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๏‚— Bitcoin์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ œ์ž‘ํ•˜๊ธฐ์œ„ํ•œ ํฌ๋กœ์Šค ํ”Œ๋žซํผ C++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • 29.
    Libbitcoin ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๏‚— Libbitcoin๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ : https://github.com/libbitcoin/libbitcoin ๏‚— Secp256k1 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ : https://github.com/libbitcoin/secp256k1 $ git clone https://github.com/libbitcoin/secp256k1 $cd secp256k1 $ ./autogen.sh $ ./configure $ make $ ./tests $ sudo make install # optional $ g++ version # g++ ๋ฒ„์ „ ํ™•์ธ # ๋งŒ์•ฝ g++ ๋ฒ„์ „์ด ๋‚ฎ๋‹ค๋ฉด ์—…๊ทธ๋ ˆ์ด๋“œ $ sudo apt-get install g++-4.8 $ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 50 $ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 50 $ sudo update-alternatives --install /usr/bin/gcov gcov /usr/bin/gcov-4.8 50 $ sudo apt-get install build-essential autoconf automake libtool pkg-config git $ sudo apt-get install libboost-all-dev $ wget https://raw.githubusercontent.com/libbitcoin/libbitcoin/version3/install.sh $ chmod +x install.sh $ sudo ./install.sh
  • 30.
    Libbitcoin ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ #include<bitcoin/bitcoin.hpp> using namespace bc; int main() { // Extracting Satoshi's words from genesis block. const auto block = bc::chain::block::genesis_mainnet(); const auto& coinbase = block.transactions().front(); const auto& input = coinbase.inputs().front(); BITCOIN_ASSERT_MSG(input.script().size() > 2u, "unexpected genesis"); const auto headline = input.script()[2].data(); std::string message(headline.begin(), headline.end()); bc::cout << message << std::endl; return EXIT_SUCCESS; } $ g++ -std=c++11 -o satoshi satoshiwords.cpp $(pkg-config --cflags libbitcoin --libs libbitcoin)
  • 31.
    ๊ฐœ์ธํ‚ค, ๊ณต๊ฐœํ‚ค, ์ฃผ์†Œ์ƒ์„ฑ #include <bitcoin/bitcoin.hpp> #include <string> #include <iostream> using namespace bc; int main(void) { data_chunk seed(16); pseudo_random_fill(seed); ec_secret secretKey = bitcoin_hash(seed); std::string hexKey = encode_base16(secretKey); std::cout << "secret key: " << hexKey << std::endl; wallet::ec_private privateKey(secretKey); std::cout << "Private key: " << privateKey.encoded() << std::endl; wallet::ec_public publicKey = privateKey.to_public(); std::cout << "Public Key: " << publicKey.encoded() << std::endl; wallet::payment_address paymentAddress = publicKey.to_payment_address(); std::cout << "Bitcoin address: " << paymentAddress.encoded() << std::endl; return 0; } $ g++ -std=c++11 -o key key.cpp $(pkg-config --cflags libbitcoin --libs libbitcoin)
  • 32.
  • 33.
    ์ง€๊ฐ‘(Wallet) ๏‚— ๊ฐœ์ธํ‚ค(Private ํ‚ค)์™€ ๊ณต๊ฐœํ‚ค(Public key)๋ฅผ ๋‹ด๋Š”๊ณณ ๏‚— ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ์œ ๋ฌด์— ๋”ฐ๋ผ Hot wallet, Cold wallet์œผ๋กœ ๊ตฌ๋ถ„ ๏‚— ๋น„ํŠธ์ฝ”์ธ์€ UTXO(Unspent Transaction Output)์˜ ํ˜•ํƒœ๋กœ ๋ธ”๋ก์ฒด์ธ์ƒ์— ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ชจ๋‘ ๊ณต์œ ๋˜์–ด ์ €์žฅ ๏‚— ์ด์™€ ๊ฐ™์ด ์ง€๊ฐ‘์€ ์‹ค์ œ ๋น„ํŠธ์ฝ”์ธ์„ ์ €์žฅํ•˜๋Š”๊ฒƒ์ด ์•„๋‹ˆ๊ณ , ์ž์‹  ์†Œ์œ ์ž„์„ ์ฆ๋ช…ํ•˜๊ธฐ์œ„ํ•œ ๊ฐœ์ธ ํ‚ค์™€ ๊ณต๊ฐœํ‚ค๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณณ ๏‚— ์ง€๊ฐ‘์˜ ์ข…๋ฅ˜ ๏‚— ๋น„๊ฒฐ์ •์  ์ง€๊ฐ‘ ๏‚— ๊ฒฐ์ •์  ์ง€๊ฐ‘ ๏‚— ๊ณ„์ธต ๊ฒฐ์ •์  ์ง€๊ฐ‘
  • 34.
    ๋น„๊ฒฐ์ •์  ์ง€๊ฐ‘ ๏‚— ๋ฌด์ž‘์œ„๋กœ์„ ํƒ๋œ Private ํ‚ค๊ฐ€ ์ €์žฅ๋˜์–ด์žˆ๋Š” ์ง€๊ฐ‘ ๏‚— ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ‚ค ์‚ฌ์ด์— ๊ทœ์น™์ด๋‚˜ ์—ฐ์†์„ฑ์ด ์—†์ด ๋ฌด์ž‘์œ„ ๋กœ ํ‚ค๊ฐ€ ์ƒ์„ฑ ๏‚— ์ง€๊ฐ‘์ด ์ƒ์„ฑ๋ ๋•Œ 100๊ฐœ์˜ ๊ฐœ์ธํ‚ค๋ฅผ ๋ฌด์ž‘์œ„๋กœ ์ƒ์„ฑ ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ณ  ์ดํ›„ ๋ชจ๋“ ํ‚ค๊ฐ€ ์‚ฌ์šฉ๋œํ›„์— ๋‹ค์‹œ ๋ฌด์ž‘ ์œ„๋กœ ์ƒˆ๋กœ์šด ํ‚ค๋ฅผ ์ƒ์„ฑ ๏‚— ๋ชจ๋“ ํ‚ค๋ฅผ ๋ฐฑ์—…ํ•˜์ง€๋ชปํ•œ ๊ฒฝ์šฐ์— ์ง€๊ฐ‘์ด ์†์‹ค๋˜๋ฉด ๋ณต ๊ตฌ๋ฅผ ํ• ์ˆ˜๊ฐ€ ์—†๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ ๏‚— ์ง€๊ฐ‘์˜ ์†์‹ค์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ฃผ๊ธฐ์ ์œผ๋กœ ์ง€๊ฐ‘ ์˜ ๋ชจ๋“ ํ‚ค๋ฅผ ๋ฐฑ์—…ํ•ด์•ผ ํ•จ
  • 35.
    ๊ฒฐ์ •์  ์ง€๊ฐ‘ ๏‚— ๋žœ๋คํ•˜๊ฒŒ๋ฐœ์ƒ๋œ Seed ์—์„œ ๋‹จ๋ฐฉํ–ฅ Hash ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ๊ฐœ์ธํ‚ค๋ฅผ ์—ฐ์†์ ์œผ๋กœ ์ƒ์„ฑ ๏‚— Seed๋งŒ ์•Œ๊ณ ์žˆ์œผ๋ฉด ์ถ”์ถœํ‚ค ์ „๋ถ€๋ฅผ ๋ณต์›ํ• ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํŠน์ •์‹œ๊ธฐ์— ํ•œ๋ฒˆ์˜ ๋ฐฑ์—…๋งŒ ํ•ด๋„ ๋จ
  • 36.
    ๊ฒฐ์ •์  ์ง€๊ฐ‘ โ€“์—ฐ์ƒ๊ธฐํ˜ธ ์ฝ”๋“œ์›Œ๋“œ (BIP39) ๏‚— ์—ฐ์ƒ๊ธฐํ˜ธ์ฝ”๋“œ๋Š” ๊ฒฐ์ •์  ์ง€๊ฐ‘์„ ์–ป๊ธฐ ์œ„ํ•ด ์ข…์ž๋กœ ์ด์šฉํ•œ ๋‚œ์ˆ˜๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ์˜์–ด ๋‹จ์–ด์—ด ๏‚— ์—ฐ์ƒ๊ธฐํ˜ธ ๋‹จ์–ด ์ƒ์„ฑ๊ณผ์ • ๏‚— 128~256 ๋น„ํŠธ์˜ random ๊ฐ’ A ์ƒ์„ฑ ๏‚— SHA256(A) ๊ฐ’์˜ ์ฒซ ๋ช‡๋น„ํŠธ๋ฅผ check sum์œผ๋กœ ์ƒ์„ฑ ๏‚— check sum์„ A ๊ฐ’์˜ ๋๋ถ€๋ถ„์— ์ถ”๊ฐ€ ๏‚— A๋ฅผ 11๋น„ํŠธ๋กœ ๋‚˜๋ˆ„์–ด 24๊ฐœ์˜ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋ฏธ๋ฆฌ ์ •ํ•ด์ง„ 2048๊ฐœ์˜ ๋‹จ์–ด๋กœ ๊ตฌ์„ฑ๋œ ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋กœ ์‚ฌ์šฉ ํ•˜์—ฌ ๋‹จ์–ด์—ด ์ƒ์„ฑ ๏‚— PBKDF2 ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 512๋น„ํŠธ์˜ common seed ์ƒ์„ฑ ๏‚— ์—ฐ์ƒ๊ธฐํ˜ธ ์ฝ”๋“œ์˜ ์—”ํŠธ๋กœํ”ผ์™€ ๋‹จ์–ด๊ธธ์ด ์—”ํŠธ๋กœํ”ผ(๋น„ํŠธ) ์ฒดํฌ์„ฌ(๋น„ํŠธ) ์—”ํŠธ๋กœํ”ผ+์ฒดํฌ์„ฌ ๋‹จ์–ด ๊ธธ์ด 128 4 132 12 160 5 165 15 192 6 198 18 224 7 231 21 256 8 264 24
  • 37.
    ๊ฒฐ์ •์  ์ง€๊ฐ‘ โ€“์—ฐ์ƒ๊ธฐํ˜ธ ์ฝ”๋“œ์›Œ๋“œ
  • 38.
    ๊ณ„์ธต๊ฒฐ์ •์  ์ง€๊ฐ‘(HD Wallet)(BIP32, BIP44) ๏‚— ๋‹จ์ผ ์ข…์ž(Seed)๋กœ๋ถ€ํ„ฐ ๋งŽ์€ ํ‚ค๋ฅผ ์‰ฝ๊ฒŒ ์–ป๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ ๏‚— ๋ถ€๋ชจํ‚ค๊ฐ€ ์ž์‹ํ‚ค์—ด์„ ๋งŒ๋“ค๊ณ , ๊ฐ๊ฐ์˜ ์ž์‹ํ‚ค๋Š” ์†์žํ‚ค ์—ด์„ ๋งŒ๋“ค์ˆ˜ ์žˆ์Œ ๏‚— ์œ ๊ธฐ์ ์ธ ๊ตฌ์กฐ์˜ ์˜๋ฏธ๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ํŠธ๋ฆฌ ๊ตฌ์กฐ๊ฐ€ ์‚ฌ์šฉ๋ ์ˆ˜ ์žˆ์Œ ๏‚— ๊ณต๊ฐœํ‚ค์— ๋Œ€์‘ํ•˜๋Š” ๊ฐœ์ธํ‚ค์— ์ ‘๊ทผํ•˜์ง€ ์•Š๊ณ ๋„ ๊ณต๊ฐœํ‚ค์—ด์„ ์ƒ์„ฑํ• ์ˆ˜ ์žˆ์Œ
  • 39.
    ์ข…์ž(Seed)๋กœ๋ถ€ํ„ฐ ๋งˆ์Šคํ„ฐํ‚ค์™€ ์ฒด์ธ์ฝ”๋“œ์ƒ์„ฑํ•˜๊ธฐ ๏‚— HD์ง€๊ฐ‘์€ 128,256,512๋น„ํŠธ ํฌ๊ธฐ์˜ ๋ฌด์ž‘์œ„ ์ˆซ์ž์ธ root seed๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑ๋จ ๏‚— Root seed๋กœ๋ถ€ํ„ฐ HD์ง€๊ฐ‘ ์ „์ฒด๋ฅผ ๋ณต์›ํ• ์ˆ˜ ์žˆ์Œ ๏‚— Root seed๋Š” ์—ฐ์ƒ๊ธฐํ˜ธ ๋‹จ์–ด์—ด๋กœ ํ‘œํ˜„๋จ
  • 40.
    ๊ฐœ์ธ ์ž์‹ํ‚ค ์œ ๋„ํ•˜๊ธฐ ๏‚—๋ถ€๋ชจํ‚ค๋กœ๋ถ€ํ„ฐ ์ž์‹ํ‚ค๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์ž์‹ํ‚ค ์œ ๋„(CHD) ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ
  • 41.
    ํ™•์žฅํ‚ค ๏‚— ํ‚ค ์œ ๋„ํ•จ์ˆ˜๋Š”์„ธ๊ฐ€์ง€ ์ž…๋ ฅ๊ฐ’(ํ‚ค, ์ฒด์ธ์ฝ”๋“œ, ๋ชฉํ‘œ์ž์‹์˜ ์ธ๋ฑ์Šค)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž์‹ํ‚ค๋ฅผ ์ƒ์„ฑ ๏‚— ํ‚ค์™€ ์ฒด์ธ์ฝ”๋“œ๋ฅผ ๊ฒฐํ•ฉํ•œ๊ฒƒ : 256๋น„ํŠธ์˜ ํ‚ค์™€ 256๋น„ํŠธ์˜ ์ฒด์ธ์ฝ”๋“œ๋ฅผ 512๋น„ํŠธ๋กœ ๊ฒฐํ•ฉ ๏‚— ํ™•์žฅ ๊ฐœ์ธํ‚ค : ๊ฐœ์ธํ‚ค์™€ ์ฒด์ธ์ฝ”๋“œ์˜ ๊ฒฐํ•ฉ, Base58Check ์—”์ฝ”๋”ฉ์‹œ โ€˜xprvโ€™ ์ ‘๋‘๋ถ€ xprv9tyUQV64JT5qs3RSTJkXCWKMyUgoQp7F3hA1xzG6ZGu6u6Q9VMNjGr67Lctvy5P8oyaY AL9CAWrUE9i6GoNMKUga5biW6Hx4tws2six3b9c ๏‚— ํ™•์žฅ ๊ณต๊ฐœํ‚ค : ๊ณต๊ฐœํ‚ค์™€ ์ฒด์ธ์ฝ”๋“œ์˜ ๊ฒฐํ•ฉ, Base58Check ์—”์ฝ”๋”ฉ์‹œ โ€˜xpubโ€™ ์ ‘๋‘๋ถ€ xpub67xpozcx8pe95XVuZLHXZeG6XWXHpGq6Qv5cmNfi7cS5mtjJ2tgypeQbBs2UAR6KECeeM VKZBPLrtJunSDMstweyLXhRgPxdp14sk9tJPW9
  • 42.
    ๊ณต๊ฐœ ์ž์‹ํ‚ค ์œ ๋„ํ•˜๊ธฐ ๏‚—๊ฐœ์ธํ‚ค์—†์ด ๊ณต๊ฐœ ๋ถ€๋ชจํ‚ค๋กœ๋ถ€ํ„ฐ ๊ณต๊ฐœ ์ž์‹ํ‚ค๋ฅผ ์ƒ์„ฑ ๏‚— ๋ฌดํ•œ๊ฐœ์˜ ๊ณต๊ฐœํ‚ค์™€ ๋น„ํŠธ์ฝ”์ธ ์ฃผ์†Œ๋ฅผ ์ƒ์„ฑํ• ์ˆ˜ ์žˆ์ง€๋งŒ ์†ก๊ธˆ๋œ ๋ˆ์„ ์†Œ๋น„ํ• ์ˆ˜ ์—†์Œ
  • 43.
    Libbitcoin์„ ์‚ฌ์šฉํ•˜์—ฌ HD์ง€๊ฐ‘์˜ํ‚ค์ƒ์„ฑ #include <bitcoin/bitcoin.hpp> #include <string.h> #include <iostream> using namespace bc; int main(void) { data_chunk seedChunk(16); pseudo_random_fill(seedChunk); std::cout << "nHex Seed: " << std::endl; std::cout << encode_base16(seedChunk)<< std::endl; wallet::word_list writtenWord = wallet::create_mnemonic(seedChunk); if(wallet::validate_mnemonic(writtenWord)){ for(auto i = writtenWord.begin(); i != writtenWord.end(); ++i) std::cout << *i << ' '; }else{ std::cout << "mnemonic invalid!" << std::endl; } wallet::hd_private privateKey(seedChunk); std::cout << "nnMaster Private Key: " << std::endl; std::cout << privateKey.encoded() << std::endl; wallet::hd_key keys = privateKey.to_hd_key(); std::cout << "nHex Master Private Key: " << std::endl; std::cout << encode_base16(keys) << std::endl; wallet::hd_public publicKey = privateKey.to_public(); std::cout << "nMaster Public Key: " << std::endl; std::cout << publicKey.encoded() << std::endl; wallet::hd_private childPrivateKey = privateKey.derive_private(1); std::cout << "nChild Private Key: " << std::endl; std::cout << childPrivateKey.encoded() << std::endl; wallet::hd_public childPublicKey = privateKey.derive_public(1); std::cout << "nChild Public Key: " << std::endl; std::cout << publicKey.encoded() << std::endl; std::cout << "nPayment Adress: " << std::endl; std::cout << wallet::ec_public(childPublicKey.point()).to_payment_address().encoded() << "n" << std::endl; } https://github.com/ihpark92/Libbitcoin_Tutorial/blob/master/HD_Key.cpp
  • 44.
    HD์ง€๊ฐ‘์˜ ํ‚ค์ƒ์„ฑ ihpark92@ubuntu:~/work$ ./HD_key HexSeed: c6343e966440d61d17423e81bfef3746 shiver peanut pitch silk aspect attend fringe elephant like youth soccer mind Master Private Key: xprv9s21ZrQH143K2CspDbSR9pNddmpvjZWpGV4KoZ2bc9d3RgthSDLreyTb72UFwwZowQjTwBBLaRceNgLwdjL77SccLQuQsp6vB8rujhW1xEp Hex Master Private Key: 0488ade40000000000000000000ec10abb36391b6aebb63d3697b8d1c61fd6f66d274b06945f9cc42c41cd40a000df61edf0d6426ebc85 f94e0668b053b1801f3ac40dcc7dd948d4ba329030d603731b412d Master Public Key: xpub661MyMwAqRbcEgxHKcyRWxKNBofR92EfdhyvbwSDAVA2JVDqykf7Cmn4xGoRNgqjSPh4SkXXzQ8GUr42KAUEr53q2N8bpfpu8tznqZWm5fM Child Private Key: xprv9vfdCPd3QdEeYdDEGBjV2gSVkdwcDLButpskBgm88hgKTQR6CaaQnKCrHhF2YSiKW652bazqYdLATouWi5fZaiYo4YRs1Y3TXF4Cr6Boxjd Child Public Key: xpub661MyMwAqRbcEgxHKcyRWxKNBofR92EfdhyvbwSDAVA2JVDqykf7Cmn4xGoRNgqjSPh4SkXXzQ8GUr42KAUEr53q2N8bpfpu8tznqZWm5fM Payment Adress: 1Bngpmye1f91RDtStQAVS2b9NsbNYhhK1K ihpark92@ubuntu:~/work$
  • 45.
  • 46.
  • 47.
    ์ผ๋ฐ˜์ ์ธ ๊ฑฐ๋ž˜ ๏‚— ํ•œ๊ฑฐ๋ž˜์˜ ์ถœ๋ ฅ๊ฐ’์ด ์ƒˆ๋กœ์šด ๊ฑฐ๋ž˜์˜ ์ž…๋ ฅ๊ฐ’์ด ๋˜๋Š” ๊ฑฐ๋ž˜์ฒด์ธ
  • 48.
    ๊ฑฐ๋ž˜์˜ ์ข…๋ฅ˜ ๏‚— ํ•˜๋‚˜์˜์ž…๋ ฅ๊ฐ’๊ณผ 2๊ฐœ์˜ ์ถœ๋ ฅ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๏‚— ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๊ฑฐ๋ž˜๋กœ ํ˜„์‹ค์—์„œ ๊ฑฐ์Šค๋ฆ„๋ˆ์„ ๋ฐ›๋Š” ํ˜•ํƒœ ๏‚— B์—๊ฒŒ ๋น„ํŠธ์ฝ”์ธ 2๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ๋‚˜๋จธ์ง€ 8์„ ๊ฑฐ์Šค๋ฆ„๋ˆ์œผ๋กœ ๋ฐ›๋Š” ๊ฑฐ๋ž˜
  • 49.
    ๊ฑฐ๋ž˜์˜ ์ข…๋ฅ˜ ๏‚— ๋‹ค์ˆ˜์˜์ž…๋ ฅ๊ฐ’๊ณผ ํ•˜๋‚˜์˜ ์ถœ๋ ฅ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๏‚— ๋™์ „๊ณผ ๋‹จ์œ„๊ฐ€ ์ž‘์€ ์ง€ํ๊ฐ€ ๋งŽ์€๊ฒฝ์šฐ ํฐ ๋‹จ์œ„์˜ ์ง€ํ ํ•œ์žฅ์œผ๋กœ ๊ตํ™˜ํ•˜๋Š” ํ–‰์œ„ ๏‚— ์ง€๋ถˆ๊ณผ์ •์—์„œ ์ž”์•ก์œผ๋กœ ๋ฐ›์€ ์ž‘์€ ๋‹จ์œ„์˜ ๊ธˆ์•ก์„ ์ •๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ง€๊ฐ‘ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ด ์œ ํ˜•์˜ ๊ฑฐ๋ž˜๊ฐ€ ์‹œํ–‰๋˜๊ธฐ๋„ ํ•จ
  • 50.
    ๊ฑฐ๋ž˜์˜ ์ข…๋ฅ˜ ๏‚— ํ•˜๋‚˜์˜์ž…๋ ฅ๊ฐ’๊ณผ ๋‹ค์ˆ˜์˜ ์ถœ๋ ฅ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๏‚— ๊ธฐ์—…์ฒด์—์„œ ๋‹ค์ˆ˜์˜ ์ง์›์—๊ฒŒ ๊ธ‰์—ฌ๋ฅผ ์ง€๋ถˆํ•˜๋Š”๋“ฑ ๋ˆ์„ ๋ถ„๋ฐฐํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ
  • 51.
    ๊ฑฐ๋ž˜์˜ ์ข…๋ฅ˜ ๏‚— ์ž…๋ ฅ๊ฐ’์ด์—†๊ณ  ์ถœ๋ ฅ๊ฐ’๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ ๏‚— ์ฑ„๊ตด์— ์„ฑ๊ณตํ•œ๊ฒฝ์šฐ ์ฑ„๊ตด์ž์—๊ฒŒ ๋ณด์ƒ์œผ๋กœ ๋น„ํŠธ์ฝ”์ธ์„ ์ œ๊ณตํ•˜๋Š” ๊ฑฐ๋ž˜ : Coinbase ๊ฑฐ๋ž˜
  • 52.
    UTXO(Unspent Transaction Output) ๏‚—๋ธ”๋ก์ฒด์ธ์ƒ์—์„œ ๊ฑฐ๋ž˜์˜ ๋‹จ์œ„ ๏‚— ๊ฑฐ๋ž˜์˜ ์ถœ๋ ฅ๊ฐ’์œผ๋กœ, ์‚ฌ์šฉ๋˜์ง€์•Š๊ณ  ๊ณต๊ฐœํ‚ค๋กœ ์•”ํ˜ธํ™”๋˜์–ด ๋ธ”๋ก์ฒด์ธ์ƒ์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋‹จ์œ„ ๏‚— ์•”ํ˜ธํ™”๋œ UTXO๋Š” ์‚ฌ์šฉ์‹œ์ ์— ์†Œ์œ ์ž์˜ ๊ฐœ์ธํ‚ค๋กœ ์•”ํ˜ธ๋ฅผ ํ•ด์ œํ•˜์—ฌ ๊ฑฐ๋ž˜์˜ ์ž…๋ ฅ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ ๏‚— ์ž์‹  ์†Œ์œ ์˜ ๋น„ํŠธ์ฝ”์ธ์˜ ์ „์ฒด ์ž”์•ก์„ ํ™•์ธํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด, ์ง€๊ฐ‘์— ์ €์žฅ๋˜์–ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋Š” ๋น„ํŠธ์ฝ”์ธ์˜ ๊ฐฏ์ˆ˜๋ฅผ ํ™•์ธํ•˜๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋ธ”๋ก์ฒด์ธ์ƒ์— ์ž์‹ ์˜ ์†Œ์œ ๋กœ ์ €์žฅ๋˜์–ด ์žˆ๋Š” UTXO ์˜ ์ถœ๋ ฅ๊ฐ’์„ ๋ชจ๋‘ ํ•ฉํ•œ๊ฒƒ์„ ํ™•์ธ
  • 53.
    ๋น„ํŠธ์ฝ”์ธ ์ž”์•ก์กฐํšŒ -UTXO์˜ ์ดํ•ฉ # get unspent outputs from blockchain API import json import requests # example address address = 1JBwfNy2oyhFCoNyLb4nnh2se7gA6DBU7B' resp = requests.get('https://blockchain.info/unspent?active=%s' % address) utxo_set = json.loads(resp.text)["unspent_outputs"] for utxo in utxo_set: print("%s:%d - %ld Satoshis" % (utxo['tx_hash'], utxo['tx_output_n'], utxo['value']))
  • 54.
    ๋น„ํŠธ์ฝ”์ธ ์ž”์•ก์กฐํšŒ -Libbitcoin ์‚ฌ์šฉ https://github.com/ihpark92/Libbitcoin_Tutorial/blob/master/BitcoinNetwork/Balance.cpp #include <bitcoin/bitcoin.hpp> #include <bitcoin/client.hpp> #include <string.h> #include <iostream> using namespace bc; uint64_t balancer(const chain::history::list& rows) { uint64_t unspent_balance = 0; for(const auto& row: rows) { // spend unconfirmed (or no spend attempted) if (row.spend.hash() == null_hash) unspent_balance += row.value; } return unspent_balance; } void getBalance(wallet::payment_address address) { client::connection_type connection = {}; connection.retries = 3; connection.timeout_seconds = 8; connection.server = config::endpoint("tcp://mainnet.libbitcoin.net:9091"); client::obelisk_client client(connection); โ€ฆโ€ฆ if(!client.connect(connection)) { std::cout << "Fail" << std::endl; } else { std::cout << "Connection Succeeded" << std::endl; } client.blockchain_fetch_history3(on_error2, on_done, address); client.wait(); } int main() { wallet::payment_address addy("15QzCiznJXqihKmNTgcxwS8nf7sdSXBAE9"); getBalance(addy); }
  • 55.
    UTXO์˜ ์ƒ์„ฑ ๏‚— ๋‹ค๋ฅธ์ฃผ์†Œ์—์„œ ์ž์‹ ์˜ ์ฃผ์†Œ๋กœ ๋น„ํŠธ์ฝ”์ธ์„ ์†ก๊ธˆ๋ฐ›๋Š” ๊ฒฝ์šฐ
  • 56.
    UTXO์˜ ์†Œ๋ฉธ ๏‚— ๋‹ค๋ฅธ์ฃผ์†Œ๋กœ ์†ก๊ธˆํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ
  • 57.
    ๊ฑฐ๋ž˜(Transaction)์˜ ๊ตฌ์กฐ ํฌ๊ธฐ ํ•„๋“œ์„ค๋ช… 4 Byte Version ํ”„๋กœํ† ์ฝœ ๋ฒ„์ „ 1~9 Byte Input Count ์ž…๋ ฅ๊ฐ’์˜ ๊ฐฏ์ˆ˜ Variable Input ํ•˜๋‚˜ ์ด์ƒ์˜ ์ž…๋ ฅ๊ฐ’ 1~9 Byte Output Count ์ถœ๋ ฅ๊ฐ’์˜ ๊ฐฏ์ˆ˜ Variable Output ํ•˜๋‚˜ ์ด์ƒ์˜ ์ถœ๋ ฅ๊ฐ’ 4 Byte Locktime ๋ธ”๋ก์— ์ถ”๊ฐ€๋˜๋Š” ๊ฐ€์žฅ๋น ๋ฅธ์‹œ๊ฐ„
  • 58.
    ๊ฑฐ๋ž˜(Transaction)์˜ ๊ตฌ์กฐ { "lock_time":0, "ver":1, "size":257, "inputs":[ { "sequence":4294967295, "witness":"", "prev_out":{ "spent":true, "tx_index":581424, "type":0, "addr":"1E3GodQUs3pdW4SasKXNHAtfJZHGmUhUxe", "value":1000000000, "n":1, "script":"76a9148f07a8d943b08ea22cd9e98d329d99025b45edfb88ac" }, "script":"47304402206f9748d80344eb4ef6492248843f0f179f8275c30788adf3ddbcddaebc9fc0 8a02202f09fda4b5f7caf0e958889069e999d1fb9258b28c7b6a8484b108f5be08efc60141046128 6410eda379b4790c5ff7d3ebcd078821c1773ee8200ae90ef211efe3aadd48ab65e2c4b482c23ba 6db447d9cf6d63939e07b73f57898d69a7bd3f90f4a97" } ], "weight":1028, "time":1388195590, "tx_index":41376062, "vin_sz":1, "hash":"04905ff987ddd4cfe603b03cfb7ca50ee81d89d1f8f5f265c38f763eea4a21fd", "vout_sz":2, "relayed_by":"67.83.126.1", "out":[ { "spent":true, "tx_index":41376062, "type":0, "addr":"1K8jp6ifZQZMT1WmJUKuh4RAJFtPAFGCHB", "value":500000000, "n":0, "script":"76a914c6e8e9dd79b5d8fef5309eba6aadc5323bf6315f88ac" }, { "spent":true, "tx_index":41376062, "type":0, "addr":"1Mdhkk4ofugGrtTCfJBiivzcGWRW4RWquF", "value":500000000, "n":1, "script":"76a914e253829af94cfba03688ad705b6b9d519ec9d3d588ac" } ] }, https://blockchain.info/block-height/277316?format=json
  • 59.
    ๊ฑฐ๋ž˜์˜ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์˜๊ด€๊ณ„ https://blockchain.info/block-height/499118?format=json https://blockchain.info/block-height/500000?format=json { "lock_time":0, "ver":1, "size":215, "inputs":[ { "sequence":4294967295, "witness":"0247304402205f39ccbab38b644acea0776d18cb63ce3e37428cbac06dc23b59c61607aef6 9102206b8610827e9cb853ea0ba38983662034bd3575cc1ab118fb66d6a98066fa0bed01210304c0156 3d46e38264283b99bb352b46e69bf132431f102d4bd9a9d8dab075e7f", "prev_out":{ "spent":true, "tx_index":311962649, "type":0, "addr":"3FfQGY7jqsADC7uTVqF3vKQzeNPiBPTqt4", "value":34676070, "n":0, "script":"a914994394dbd20b7752e272458c738ae9b7666271b787" }, "script":"1600142b2296c588ec413cebd19c3cbc04ea830ead6e78" } ], "weight":533, "time":1513194393, "tx_index":311967252, "vin_sz":1, "hash":"fe6c48bbfdc025670f4db0340650ba5a50f9307b091d9aaa19aa44291961c69f", "hash":"503e4e9824282eb06f1a328484e2b367b5f4f93a405d6e7b97261bafabfb53d5", "vout_sz":2, "relayed_by":"0.0.0.0", "out":[ { "spent":true, "tx_index":311962649, "type":0, "addr":"3FfQGY7jqsADC7uTVqF3vKQzeNPiBPTqt4", "value":34676070, "n":0, "script":"a914994394dbd20b7752e272458c738ae9b7666271b787" }, { "spent":true, "tx_index":311962649, "type":0, "addr":"1NdvAyRJLdK5EXs7DV3ebYb5wffdCZk1pD", "value":31129454, "n":1, "script":"76a914ed5600751fea259a0f8c8bec09a626e7e4450e7a88ac" } ]
  • 60.
    ๊ฑฐ๋ž˜ ์ž…๋ ฅ๊ฐ’๊ณผ ์ถœ๋ ฅ๊ฐ’ ํ•„๋“œ์„ค๋ช… Transaction Hash ์†Œ๋น„๋  UTXO๋ฅผ ๋‹ด๊ณ ์žˆ๋Š” ๊ฑฐ๋ž˜์— ๋Œ€ํ•œ ID (TxID) Output Index ์†Œ๋น„๋  UTXO์˜ ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ Unlocking Script Length ํ•ด์ œ ์Šคํฌ๋ฆฝํŠธ ๊ธธ์ด Unlocking Script(ScriptSig) UTXO์˜ ์†Œ๋น„์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ Sequence Number ์‚ฌ์šฉํ•˜์ง€์•Š์Œ, 0xFFFFFFFF๋กœ ์„ค์ • ๏‚— Input ๏‚— Output ํ•„๋“œ ์„ค๋ช… value ์‚ฌํ† ์‹œ ๋‹จ์œ„์˜ ๊ฑฐ๋ž˜๊ธˆ์•ก(1์‚ฌํ† ์‹œ๋Š” 1์–ต๋ถ„์˜ 1 ๋น„ํŠธ์ฝ”์ธ) Locking script length ์ž ๊ธˆ ์Šคํฌ๋ฆฝํŠธ ๊ธธ์ด Locking Script (ScriptPubKey) ์ถœ๋ ฅ๊ฐ’์„ ์†Œ๋น„ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์กฐ๊ฑด
  • 61.
    ๊ฑฐ๋ž˜ ์Šคํฌ๋ฆฝํŠธ ๏‚— ๋น„ํŠธ์ฝ”์ธ๊ฑฐ๋ž˜ ์œ ํšจํ™” ์—”์ง„์—์„œ ๊ฑฐ๋ž˜์˜ ์œ ํšจ์„ฑ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ ๏‚— ์ž ๊ธˆ ์Šคํฌ๋ฆฝํŠธ(scriptPubKey)์™€ ํ•ด์ œ ์Šคํฌ๋ฆฝํŠธ(scriptSig) ๏‚— ์Šคํƒ(stack)์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ„์‚ฐ๋˜์–ด์ง ๏‚— ์กฐ๊ฑด๋ถ€ ํ๋ฆ„์ œ์–ด๊ธฐ๋Šฅ ์ด์™ธ์—๋Š” ๋ฃจํ”„๋‚˜ ๋ณต์žกํ•œ ํ๋ฆ„์ œ์–ด๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€์•Š์Œ ๏‚— ๊ฑฐ๋ž˜ ์Šคํฌ๋ฆฝํŠธ์˜ 5๊ฐ€์ง€ ํ‘œ์ค€ ๏‚— Pay-to-public-key-hash(P2PKH), ๊ณต๊ฐœํ‚ค, ๋‹ค์ค‘์„œ๋ช…, pay-to-script-hash(P2SH), ๋ฐ์ดํƒ€์ถœ๋ ฅ (OP_RETURN)
  • 62.
    ์ž ๊ธˆ ์Šคํฌ๋ฆฝํŠธ(scriptPubKey) ์ƒ์„ฑํ•˜๊ธฐ ๏‚—DUP + HASH160 + <pubKeyHash> + EQUALVERIFY + CHECKSIG ๏‚— 76 + a9 + length + pubKeyHash + 88 + ac ๏‚— pubKeyHash = Base58Decode(1NdvAyRJLdK5EXs7DV3ebYb5wffdCZk1pD) ๏‚— 00ED5600751FEA259A0F8C8BEC09A626E7E4450E7A2F6DA14A ๏‚— 76 + a9 + 14 + ED5600751FEA259A0F8C8BEC09A626E7E4450E7A + 88 + ac ๏‚— 76a914ED5600751FEA259A0F8C8BEC09A626E7E4450E7A88ac "addr":"1NdvAyRJLdK5EXs7DV3ebYb5wffdCZk1pD", "value":31129454, "n":1, "script":"76a914ed5600751fea259a0f8c8bec09a626e7e4450e7a88ac"
  • 63.
    ํ•ด์ œ ์Šคํฌ๋ฆฝํŠธ(scriptSig) ์ƒ์„ฑํ•˜๊ธฐ ๏‚—scriptSig๋ฅผ ์ œ์™ธํ•œ ํŠธ๋žœ์žญ์…˜ ํ…œํ”Œ๋ฆฟ ์ž‘์„ฑ ๏‚— ์ด์ „์ถœ๋ ฅ์˜ scriptPubKey๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ช…
  • 64.
    ํ•ด์ œ ์Šคํฌ๋ฆฝํŠธ(scriptSig) ์ƒ์„ฑํ•˜๊ธฐ ๏‚—16์ง„์ˆ˜ ํŠธ๋žœ์žญ์…˜ ๋ฉ”์‹œ์ง€์™€ private key๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ signature ์ƒ์„ฑ ๏‚— ์ƒ์„ฑ๋œ signature 304402201c3be71e1794621cbe3a7adec1af25f818f238f5796d47152137eba710f2174a02204f8 fe667b696e30012ef4e56ac96afb830bddffee3b15d2e474066ab3aa39bad import hashlib, ecdsa, binascii from ecdsa import SigningKey, SECP256k1 mhex = โ€˜0100000001416e9b4555180aaa0c417067a46607bc58c96f0131b2f41f7d0fb665eab03a7e000000001976a91499b1ebcfc11a13df5161aba81 60460fe1601d54188acffffffff01204e0000000000001976a914e81d742e2c3c7acd4c29de090fc2c4d4120b2bf888ac0000000001000000โ€™ txHash = hashlib.sha256(hashlib.sha256(mhex.decode('hex')).digest()).hexdigest() privkey = '3cd0560f5b27591916c643a0b7aa69d03839380a738d2e912990dcc573715d2c' signingkey = ecdsa.SigningKey.from_string(privkey.decode('hex'), curve=ecdsa.SECP256k1) SIG = signingkey.sign_digest(txhash, sigencode=ecdsa.util.sigencode_der_canonize) binascii.hexlify(SIG)
  • 65.
    ํ•ด์ œ ์Šคํฌ๋ฆฝํŠธ(scriptSig) ์ƒ์„ฑํ•˜๊ธฐ ๏‚—์ƒ์„ฑ๋œ signatur์™€ public key๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ scriptSig ๊ตฌ์„ฑ PUSHDATA Opcode 0x47 : ์Šคํƒ์— ํ‘ธ์‰ฌ๋  ๋ฐ”์ดํŠธ์ˆ˜, sigHash ํฌํ•จ R, S๋Š” 32, 33 ๋ฐ”์ดํŠธ๊ฐ€ ๋ ์ˆ˜ ์žˆ์Œ ์••์ถ•๊ณต๊ฐœํ‚ค(02, 03), ๋น„์••์ถ• ๊ณต๊ฐœํ‚ค(04)
  • 66.
    ํ•ด์ œ ์Šคํฌ๋ฆฝํŠธ(scriptSig) ์ƒ์„ฑํ•˜๊ธฐ ๏‚—์ตœ์ข… ์™„์„ฑ๋œ ํŠธ๋žœ์žญ์…˜ 0100000001416e9b4555180aaa0c417067a46 607bc58c96f0131b2f41f7d0fb665eab03a7e0 00000006a47304402201c3be71e1794621cbe 3a7adec1af25f818f238f5796d47152137eba7 10f2174a02204f8fe667b696e30012ef4e56ac 96afb830bddffee3b15d2e474066ab3aa39bad 012103bf350d2821375158a608b51e3e898e5 07fe47f2d2e8c774de4a9a7edecf74edaffffffff 01204e0000000000001976a914e81d742e2c 3c7acd4c29de090fc2c4d4120b2bf888ac0000 0000
  • 67.
  • 68.
  • 69.
    Libbitcoin ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ Rawtransaction ์ƒ์„ฑํ•˜๊ธฐ ๏‚— https://github.com/ihpark92/Libbitcoin_T utorial/blob/master/BitcoinNetwork/rawT X.cpp ๏‚— https://github.com/ihpark92/Libbitcoin_T utorial/blob/master/BitcoinNetwork/HD_ Wallet_Testnet.cpp
  • 70.
    Libbitcoin ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ Rawtransaction ์ƒ์„ฑํ•˜๊ธฐ
  • 71.
    Libbitcoin ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ Rawtransaction ์ƒ์„ฑํ•˜๊ธฐ
  • 72.
    ๋น„ํŠธ์ฝ”์ธ ๋…ธ๋“œ์˜ ๊ธฐ๋Šฅ ๏‚—Wallet ๏‚— ์ง€๊ฐ‘๊ธฐ๋Šฅ ๏‚— ์ง€๊ฐ‘์€ ์‚ฌ์šฉ์ž์˜ ๊ฐœ์ธํ‚ค์™€ ๊ณต๊ฐœํ‚ค๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ๊ฑฐ๋ž˜์— ์‚ฌ์šฉ๋˜๋Š” ์ฃผ์†Œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋‹ด๋‹น ๏‚— Miner ๏‚— ์ž‘์—…์ฆ๋ช…(Proof of Work : PoW) ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ 10๋ถ„๊ฐ„์˜ ์œ ํšจํ•œ ๊ฑฐ๋ž˜๋ฅผ ๋ธ”๋ก์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ๋ฉ”์ธ์ฒด์ธ์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ธฐ๋Šฅ ๏‚— Full Blockchain ๏‚— ์ตœ์ดˆ์˜ ๋ธ”๋Ÿญ์ธ ์ œ๋„ค์‹œ์Šค๋ธ”๋ก๊ณผ ๊ฐ€์žฅ ์ตœ์‹ ์˜ ๋ธ”๋ก๊นŒ์ง€ ํฌํ•จํ•œ ์™„์ „ํ•œ ๋ธ”๋ก์ฒด์ธ ๋ณต์‚ฌ๋ณธ์„ ๋ณด์œ  ๏‚— Network Routing ๏‚— ๋ธ”๋ก์ฒด์ธ์ƒ์˜ P2P ๋„คํŠธ์›Œํฌ ์ „์†ก๊ธฐ๋Šฅ
  • 73.
    ๋น„ํŠธ์ฝ”์ธ ๋…ธ๋“œ์˜ ์ข…๋ฅ˜ ๏‚—Reference Client ๏‚— ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํฌํ•จํ•œ ์™„์ „ํ•œ ๋„คํŠธ์›Œํฌ์˜ ํ˜•ํƒœ. Bitcoin Core๊ฐ€ ์—ฌ๊ธฐ์— ํ•ด๋‹น ๏‚— Full Blockchain Node ๏‚— ๋„คํŠธ์›Œํฌ ๋ผ์šฐํŒ… ๊ธฐ๋Šฅ๊ณผ ๋ชจ๋“  ๋ธ”๋ก์ฒด์ธ ๋ฐ์ดํƒ€๋ฅผ ๊ฐ€์ง„ ํ˜•ํƒœ
  • 74.
    ๋น„ํŠธ์ฝ”์ธ ๋…ธ๋“œ์˜ ์ข…๋ฅ˜ ๏‚—Solo Miner ๏‚— ์ง€๊ฐ‘๊ธฐ๋Šฅ์€ ์ œ์™ธํ•˜๊ณ  ์ฑ„๊ตด์— ํŠนํ™”๋œ ํ˜•ํƒœ์˜ ๋…ธ๋“œ ๏‚— Lightweight wallet(SPV : Simplified Payment Verification) ๏‚— ์ง€๊ฐ‘๊ธฐ๋Šฅ๊ณผ ๋„คํŠธ์›Œํฌ ๋ผ์šฐํŒ…๊ธฐ๋Šฅ๋งŒ ํฌํ•จ๋œ ๋…ธ๋“œ๋กœ ์ „์ฒด ๋ธ”๋ก์ฒด์ธ ๋ฐ์ดํƒ€๋Š” ์—†์ด ๋‹จ์ˆœํžˆ ๊ฑฐ๋ž˜์™€ ์œ  ํšจ์„ฑ ๊ฒ€์ฆ๋งŒ ๊ฐ€๋Šฅํ•œ ๋…ธ๋“œ
  • 75.
    SPV ๋…ธ๋“œ์˜ ์œ ํšจ์„ฑ๊ฒ€์ฆ ๏‚— ํ’€๋…ธ๋“œ์˜ ๊ฒฝ์šฐ, ์ „์ฒด ๊ฑฐ๋ž˜์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ UTXO๋ฅผ ๊ฒ€์ฆํ•˜์—ฌ ๊ฑฐ๋ž˜์— ์œ ํšจํ•œ์ง€๋ฅผ ํŒ๋‹จ ๏‚— SPV๋…ธ๋“œ๋Š” ์ „์ฒด ๋ธ”๋ก์„ ๋‹ค์šด๋กœ๋“œํ•˜์ง€์•Š๊ณ , ๋ธ”๋กํ—ค๋”๋งŒ ๋‹ค์šด๋กœ๋“œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด๋ธ”๋ก ๋Œ€๋น„ 1000๋ถ„ ์˜ 1์ •๋„์˜ ์ž‘์€ ์šฉ๋Ÿ‰๋งŒ ์ฐจ์ง€ ๏‚— ๊ฑฐ๋ž˜์ •๋ณด๊ฐ€ ์—†์ด ๋ธ”๋กํ—ค๋”๋งŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ฑฐ๋ž˜๋ฅผ ์œ„ํ•ด ๋ธ”๋ก์ฒด์ธ์ƒ์˜ ๋ธ”๋ก์˜ ๋†’์ด ๋Œ€์‹  ๊นŠ์ด ๋ฅผ ์ฐธ์กฐํ•ด์„œ ๊ฑฐ๋ž˜๋ฅผ ๊ฒ€์ฆ
  • 76.
    SPV ๋…ธ๋“œ์˜ ์œ ํšจ์„ฑ๊ฒ€์ฆ์„ ์œ„ํ•œ ๋ธ”๋ฃธํ•„ํ„ฐ ๏‚— ์ธ๊ทผ์˜ ํ’€๋…ธ๋“œ์—๊ฒŒ ํ—ค๋”์™€ ๊ฑฐ๋ž˜์ •๋ณด๋ฅผ ์š”์ฒญํ•˜์—ฌ ๊ฑฐ๋ž˜์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์ฆํ•˜์—ฌ ๊ฑฐ๋ž˜๋ฅผ ์ง„ํ–‰ ๏‚— ํ—ค๋”์™€ ๊ฑฐ๋ž˜์ •๋ณด๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ณผ์ •์—์„œ ์ž์‹ ์˜ ์ •๋ณด๊ฐ€ ๋…ธ์ถœ๋˜์–ด ์ต๋ช…์„ฑ์ด ์œ„๋ฐฐ ๏‚— SPV ๋…ธ๋“œ๋Š” ์ต๋ช…์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ธ”๋ฃธํ•„ํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฑฐ๋ž˜์— ์‚ฌ์šฉ ๏‚— N๊ฐœ์˜ ํ•ด์‰ฌํ•จ์ˆ˜์™€ M๊ฐœ์˜ 1๋น„ํŠธ ๋ฐฐ์—ด๋กœ ๊ตฌ์„ฑ ๏‚— N๊ฐœ์˜ ํ•ด์‰ฌํ•จ์ˆ˜๋Š” 1์—์„œ M ์‚ฌ์ด์˜ ์ถœ๋ ฅ๊ฐ’์„ ๊ฐ€์ง€๊ณ , ํ•ด๋‹น ์ถœ๋ ฅ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” ์ธ๋ฑ์Šค์˜ ๋น„ํŠธ๋ฐฐ์—ด์„ 1 ๋กœ ์„ค์ • ๏‚— N๊ฐœ์˜ ํ•ด์‰ฌํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ถœ๋ ฅ๊ฒฐ๊ณผ๋กœ M๋น„ํŠธ๋ฐฐ์—ด์€ N๊ฐœ๊ฐ€ 1๋กœ ์„ค์ •
  • 77.
  • 78.
  • 79.
    SPV๋…ธ๋“œ์˜ ๊ฑฐ๋ž˜๋ฅผ ๊ฒ€์ฆํ•˜๊ธฐ์œ„ํ•œ ๋จธํดํŒจ์Šค ๏‚— ๊ฑฐ๋ž˜ K์™€ ๋จธํดํŒจ์Šค๋กœ ์ œ๊ณต๋œ Hash(L)์„ ์‚ฌ์šฉํ•˜์—ฌ Hash(KL)์„ ๊ณ„์‚ฐ ๏‚— ๋จธํดํŒจ์Šค๋กœ ์ œ๊ณต๋œ Hash(IJ)์™€ ๊ณ„์‚ฐ๋œ Hash(KL)์„ ์‚ฌ์šฉํ•˜์—ฌ Hash(IJHL) ๊ณ„์‚ฐ ๏‚— ๊ณ„์‚ฐ๋œ Hash(IJKL)๊ณผ ๋จธํดํŒจ์Šค๋กœ ์ œ๊ณต๋œ Hash(MNOP)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Hash(IJKLMNOP) ๊ณ„์‚ฐ ๏‚— ๋จธํดํŒจ์Šค๋กœ ์ œ๊ณต๋œ Hash(ABCDEFGH)์™€ ๊ณ„์‚ฐ๋œ Hash(IJKLMNOP)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Hash(ABCDEFGHIJKLMNOP)๋ฅผ ๊ณ„์‚ฐ ๏‚— ๊ณ„์‚ฐ๋œ Hash(ABCDEFGHIJKLMNOP)์™€ ํ—ค๋”์— ํฌํ•จ๋œ ๋จธํด๋ฃจํŠธ๋ฅผ ๋น„๊ตํ•˜์—ฌ ๋™์ผํ•œ ๊ฐ’์ด๋ฉด ๊ฑฐ๋ž˜ K๊ฐ€ ๋ธ”๋ก์— ํฌํ•จ ๋˜์–ด์žˆ์Œ์ด ์ฆ๋ช…๋จ
  • 80.
    ๋จธํดํŠธ๋ฆฌ์˜ ํšจ์œจ์„ฑ ๏‚— ๋ธ”๋กํ—ค๋”(๋ธ”๋ก๋‹น80 ๋ฐ”์ดํŠธ)๋งŒ ๋‹ค์šด๋กœ๋“œ ๋ฐ›๊ณ , ์ˆ˜์‹ญ ๊ธฐ๊ฐ€๋ฐ”์ดํŠธ๊ฐ€ ๋ ์ง€๋„ ๋ชจ๋ฅด๋Š” ๋ธ”๋ก์ฒด์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ € ์žฅํ•˜๊ฑฐ๋‚˜ ์ „์†กํ•  ํ•„์š”์—†์ด ํ’€๋…ธ๋“œ๋กœ๋ถ€ํ„ฐ ์ž‘์€ ํฌ๊ธฐ์˜ ๋จธํดํŒจ์Šค๋งŒ ์ „์†ก๋ฐ›์•„ ๊ฑฐ๋ž˜์˜ ํฌํ•จ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ ๊ฑฐ๋ž˜๊ฑด์ˆ˜ ๋ธ”๋ก์˜ ๋Œ€๋žต์ ํฌ๊ธฐ ๊ฒฝ๋กœํฌ๊ธฐ(ํ•ด์‰ฌ) ๊ฒฝ๋กœํฌ๊ธฐ(๋ฐ”์ดํŠธ) 16๊ฑด 4 KB 4 Hash 128 Byte 512๊ฑด 128 KB 9 Hash 288 Byte 2,048๊ฑด 512 KB 11 Hash 352 Byte 65,535๊ฑด 16 MB 16 Hash 512 Byte
  • 81.
    ๋น„ํŠธ์ฝ”์ธ์˜ ๋งˆ์ด๋‹ ๏‚— ์ฑ„๊ตด(Mining)์€10๋ถ„๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๋น„ํŠธ์ฝ”์ธ์„ ์ƒ์‚ฐํ•˜๋Š” ๊ณผ์ • ๏‚— ์ตœ์ดˆ์— ๋น„ํŠธ์ฝ”์ธ์˜ ์ œ๋„ค์‹œ์Šค ๋ธ”๋ก์ด ์ƒ์„ฑ๋œ ์‹œ์ ์—๋Š” ์ƒˆ๋กœ์šด ๋ธ”๋ก์ด ์ƒ์„ฑ๋ ๋•Œ๋งˆ๋‹ค 50๊ฐœ์˜ ๋น„ํŠธ์ฝ”์ธ์ด ๋ณด์ƒ์œผ๋กœ ์ œ๊ณต ๏‚— ํ†ตํ™”์˜ ์ธํ”Œ๋ ˆ์ด์…˜์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋น„ํŠธ์ฝ”์ธ์€ 4๋…„๋งˆ๋‹ค(์ •ํ™•ํžˆ๋Š” 210,000๋ธ”๋ก๋งˆ๋‹ค) ๊ทธ ์ƒ์‚ฐ๋Ÿ‰์ด ์ ˆ ๋ฐ˜์œผ๋กœ ์ค„์–ด๋“ฌ
  • 82.
    ๊ฑฐ๋ž˜์˜ ์œ ํšจ์„ฑ ๊ฒ€์ฆ ๏‚—๊ฑฐ๋ž˜์˜ ๊ตฌ๋ฌธ๊ณผ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ์ •ํ™•ํ•ด์•ผ ํ•œ๋‹ค. ๏‚— ์ž…๋ ฅ๊ฐ’์ด๋‚˜ ์ถœ๋ ฅ๊ฐ’ ๋ชฉ๋ก์ด ๋น„์–ด์žˆ์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค. ๏‚— ๋ฐ”์ดํŠธ ๋‹จ์œ„์˜ ๊ฑฐ๋ž˜ ํฌ๊ธฐ๊ฐ€ MAX_BLOCK_SIZE๋ณด๋‹ค ์ž‘๋‹ค. ๏‚— ์ถœ๋ ฅ๊ฐ’ ๊ธˆ์•ก๊ณผ ๋…ธ๋“œ์˜ ์ด ๊ธˆ์•ก์ด ํ—ˆ์šฉ๋œ ๊ฐ€์น˜๋ฒ”์œ„(0~2100๋งŒ)๋‚ด์— ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๏‚— ์ž…๋ ฅ๊ฐ’์ค‘ ํ•ด์‹œ๊ฐ’์€ 0, N๊ฐ’์€ -1์ด์–ด์„œ๋Š” ์•ˆ๋œ๋‹ค. ๏‚— nLOCKTime์€ INT_MAX๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๋™์ผํ•ด์•ผ ํ•œ๋‹ค. ๏‚— ๋ฐ”์ดํŠธ ๋‹จ์œ„์˜ ๊ฑฐ๋ž˜ ํฌ๊ธฐ๊ฐ€ 100๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๋™์ผํ•ด์•ผ ํ•œ๋‹ค. ๏‚— ๊ฑฐ๋ž˜์— ๋‹ด๊ฒจ์žˆ๋Š” ์„œ๋ช…์ž‘์—… ๊ฑด์ˆ˜๊ฐ€ ์„œ๋ช…์ž‘์—… ํ•œ๋„๋‚ด์— ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๏‚— ํ•ด์ œ์Šคํฌ๋ฆฝํŠธ๋Š” ์Šคํƒ์ƒ๋ถ€์— ์ˆซ์ž๋ฅผ ์ถ”๊ฐ€ํ• ์ˆ˜๋งŒ ์žˆ๊ณ , ์ž ๊ธˆ ์Šคํฌ๋ฆฝํŠธ๋Š” isStandard ํ˜•ํƒœ์™€ ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค. ๏‚— ํ’€์ด๋‚˜ ๋ฉ”์ธ ๋ธŒ๋ Œ์น˜์— ์žˆ๋Š” ๋ธ”๋ก์— ์ง์„ ์ด๋ฃจ๋Š” ๊ฑฐ๋ž˜๊ฐ€ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค. ๏‚— ๊ฐ๊ฐ์˜ ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•ด, ์ฐธ์กฐ ์ถœ๋ ฅ๊ฐ’์ด ํ’€ ๋‚ด์˜ ์–ด๋– ํ•œ ๊ฑฐ๋ž˜ ๋‚ด๋ถ€์— ์กด์žฌํ•œ๋‹ค๋ฉด ํ•ด๋‹น๊ฑฐ๋ž˜๋Š” ๊ฑฐ๋ถ€๋˜์–ด์•ผ ํ•œ๋‹ค. ๏‚— ์ž…๋ ฅ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” ์ฐธ์กฐ๊ฑฐ๋ž˜๊ฐ€ ์—†๋Š”๊ฒฝ์šฐ ๊ณ ์•„๊ฑฐ๋ž˜ ํ’€์— ์ถ”๊ฐ€ํ•˜๋ผ. ๏‚— ๊ฐ๊ฐ์˜ ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•ด ์ฐธ์กฐ ์ถœ๋ ฅ๊ฐ’์ด ์ฝ”์ธ๋ฒ ์ด์Šค ์ถœ๋ ฅ์ด๋ผ๋ฉด ์ตœ์†Œ COINBASE_MATURITY(100) ์Šน์ธ์„ ๋ฐ›์•„์•ผํ•œ๋‹ค. ๏‚— ๊ฐ๊ฐ์˜ ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•œ ์ฐธ์กฐ ์ถœ๋ ฅ๊ฐ’์ด ์กด์žฌํ•ด์•ผ ํ•˜๊ณ , ์ด๋ฏธ ์†Œ๋น„๋˜์—ˆ์œผ๋ฉด ์•ˆ๋œ๋‹ค. ๏‚— ์ฐธ์กฐ์ถœ๋ ฅ ๊ฑฐ๋ž˜์—์„œ ์ž…๋ ฅ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ๋•Œ ์ž…๋ ฅ๊ฐ’ ๊ธˆ์•ก๊ณผ ์ž…๋ ฅ๊ฐ’ ์ด์•ก์ด ํ—ˆ์šฉ๋œ ๊ฐ€์น˜๋ฒ”์œ„๋‚ด์— ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๏‚— ์ž…๋ ฅ๊ฐ’ ๊ธˆ์•ก์ด ์ถœ๋ ฅ๊ฐ’ ์ด์•ก๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ ํ•ด๋‹น ๊ฑฐ๋ž˜๋ฅผ ๊ฑฐ์ ˆํ•˜๋ผ. ๏‚— ๊ฑฐ๋ž˜ ์ˆ˜์ˆ˜๋ฃŒ๊ฐ€ ๋น„์–ด์žˆ๋Š” ๋ธ”๋ก์— ๋“ค์–ด๊ฐ€๊ธฐ์— ๋„ˆ๋ฌด ์ž‘์„๋•Œ๋Š” ํ•ด๋‹น ๊ฑฐ๋ž˜๋ฅผ ๊ฑฐ์ ˆํ•˜๋ผ. ๏‚— ๊ฐ ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•œ ํ•ด์ œ ์Šคํฌ๋ฆฝํŠธ๋Š” ๊ทธ์— ํ•ด๋‹นํ•˜๋Š” ์ถœ๋ ฅ๊ฐ’ ์ž ๊ธˆ ์Šคํฌ๋ฆฝํŠธ์— ๋Œ€ํ•ด ๊ฒ€์ฆํ•ด์•ผ ํ•œ๋‹ค.
  • 83.
    ๋ธ”๋ก์— ๊ฑฐ๋ž˜ ์ถ”๊ฐ€ํ•˜๊ธฐ ๏‚—์ฑ„๊ตด๋…ธ๋“œ๋Š” ๋จผ์ € ๊ฒ€์ฆ๋œ ๊ฑฐ๋ž˜๊ฐ€ ๋“ค์–ด์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌํ’€(Memory pool) ๋˜๋Š” ๊ฑฐ๋ž˜ํ’€(Transaction pool)์—์„œ ์กฐ๊ฑด์— ๋งž ๋Š” ๊ฑฐ๋ž˜๋“ค์„ ์„ ๋ณ„ํ•˜์—ฌ ๋ธ”๋ก์„ ๊ตฌ์„ฑ ๏‚— ๊ฑฐ๋ž˜ํ’€์€ ๊ฑฐ๋ž˜๋“ค์ด ๋ธ”๋ก๋‚ด์— ํฌํ•จ๋ ์ˆ˜ ์žˆ์„๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์žฅ์†Œ ๏‚— ์ˆ˜์ˆ˜๋ฃŒ์™€ ์šฐ์„ ์ˆœ์œ„๋กœ ๋ฉ”๋ชจ๋ฆฌํ’€์—์„œ ๊ฑฐ๋ž˜๊ฐ€ ์„ ํƒ๋˜์–ด์ง : ์šฐ์„ ์ˆœ์œ„ = sum(๊ฑฐ๋ž˜์ˆ˜์ˆ˜๋ฃŒ * ๊ฑฐ๋ž˜๋‚˜์ด) / ๊ฑฐ๋ž˜ํฌ๊ธฐ ๏‚— ๋ธ”๋ก๋‚ด๋ถ€์˜ ๊ฑฐ๋ž˜๊ณต๊ฐ„์ค‘ ์ฒซ 50kbyte๋Š” ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ๊ฑฐ๋ž˜๋“ค์—๊ฒŒ ํ• ๋‹น๋จ
  • 84.
    ๋ธ”๋ก์˜ ํ—ค๋” ๊ตฌ์„ฑํ•˜๊ธฐ ํฌ๊ธฐํ•„๋“œ ์„ค๋ช… 4 ๋ฐ”์ดํŠธ ๋ฒ„์ „ ๋ฒ„์ „ ๋ฒˆํ˜ธ 32 ๋ฐ”์ดํŠธ ์ด์ „๋ธ”๋ก ํ•ด์‹œ ์ฒด์ธ๋‚ด ์ด์ „๋ธ”๋ก์˜ ํ•ด์‹œ์— ๋Œ€ํ•œ ์ฐธ์กฐ 32 ๋ฐ”์ดํŠธ ๋จธํด ๋ฃจํŠธ ๊ฑฐ๋ž˜์˜ ๋จธํดํŠธ๋ฆฌ์˜ ๋ฃจํŠธ์— ๋Œ€ํ•œ ํ•ด์‹œ 4 ๋ฐ”์ดํŠธ ํƒ€์ž„์Šคํƒฌํ”„ ๋ธ”๋ก์˜ ๋Œ€๋žต์ ์ธ ์ƒ์„ฑ์‹œ๊ฐ„ 4 ๋ฐ”์ดํŠธ ๋‚œ์ด๋„ ๋ชฉํ‘œ ๋ธ”๋ก์˜ ์ž‘์—…์ฆ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•œ ๋‚œ์ด๋„ ๋ชฉํ‘œ 4 ๋ฐ”์ดํŠธ ๋…ผ์Šค ์ž‘์—…์ฆ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์‚ฌ์šฉ๋˜๋Š” ์นด์šดํ„ฐ
  • 85.
    ์ž‘์—…์ฆ๋ช…(PoW:Proof of Work)์•Œ๊ณ ๋ฆฌ์ฆ˜ ๏‚— ํ•ด์‹œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ž„์˜์˜ ๊ธธ์ด๋ฅผ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ ์ž…๋ ฅ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ๊ณ ์ •๋œ ๊ธธ์ด์˜ ๊ฒฐ์ •์  ๊ฒฐ๊ณผ๊ฐ’์„ ์ƒ์‚ฐ ๏‚— ํŠน์ • ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•œ ํ•ด์‹œ ๊ฒฐ๊ณผ๊ฐ’์€ ํ•ญ์ƒ ๋™์ผํ•˜๊ณ  ์‰ฝ๊ฒŒ ๊ณ„์‚ฐ๊ฐ€๋Šฅํ•˜๋ฉฐ ์–ด๋–ค ๋…ธ๋“œ์—์„œ๋„ ๊ฒ€์ฆ๊ฐ€๋Šฅ ๏‚— ํŠน์ • ์ถœ๋ ฅ๊ฐ’์— ๋Œ€ํ•œ ์ž…๋ ฅ๊ฐ’์˜ ์ถ”์ธก์ด ๋ถˆ๊ฐ€๋Šฅํ•˜์—ฌ, ๋ฌด์ž‘์œ„ ๋Œ€์ž…์„ ํ†ตํ•ด์„œ๋งŒ ์›ํ•˜๋Š” ์ถœ๋ ฅ๊ฐ’์„ ์–ป์„์ˆ˜ ์žˆ์Œ ๏‚— SHA256 ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ถœ๋ ฅ๊ฐ’์€ 256๋น„ํŠธ ๊ธธ์ด์˜ ์ถœ๋ ฅ๊ฐ’ ์ƒ์„ฑ ๏‚— Nonce๋ฅผ ๋ณ€ํ™”์‹œ์ผœ๊ฐ€๋ฉฐ ๋‚œ์ด๋„ ๋ชฉํ‘œ๊ฐ’๋ณด๋‹ค ์ž‘์€ ์ถœ๋ ฅ๊ฐ’์ด ์ƒ์„ฑ๋ ๋•Œ๊นŒ์ง€ SHA256 ์—ฐ์‚ฐ์„ ๋ฐ˜๋ณต ๏‚— ๋‚œ์ด๋„ ๋ชฉํ‘œ๊ฐ’๋ณด๋‹ค ์ž‘์€๊ฐ’์ด ๋ฐœ๊ฒฌ๋œ๊ฒฝ์šฐ ๋ธ”๋ก์ฑ„๊ตด์— ์„ฑ๊ณตํ•˜์—ฌ ์ฑ„๊ตด๋œ ๋ธ”๋ก์„ ์ „ํŒŒ
  • 86.
    ์ž‘์—…์ฆ๋ช…(PoW:Proof of Work)์•Œ๊ณ ๋ฆฌ์ฆ˜ ๏‚— Nonce ๊ฐ’์˜ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๋Š” 4๋ฐ”์ดํŠธ ๏‚— nonce๋กœ ํ‘œํ˜„๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€๊ฐ’์€ 42์–ต ๏‚— nonce๋ฅผ ์ฐพ๊ธฐ์œ„ํ•ด ๋ธ”๋กํ—ค๋”๋ฅผ hash ์—ฐ์‚ฐ์‹œ 42์–ต๋ฒˆ์˜ ์—ฐ์‚ฐ์ด ์ˆ˜ํ–‰๋˜๋ฉด 0์œผ๋กœ ์ดˆ๊ธฐํ™”๊ฐ€ ๋จ ๏‚— ์ฆ‰, 42์–ต๋ฒˆ์˜ ์—ฐ์‚ฐํ›„์—๋Š” hash ์—ฐ์‚ฐ์˜ ์ดˆ๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•จ ๏‚— merkle root ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์—ฌ ๋‹ค์‹œ nonce๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ›„ PoW ์—ฐ์‚ฐ ์ˆ˜ํ–‰ ๏‚— Coinbase ๊ฑฐ๋ž˜์˜ ์ฒ˜์Œ 8๋ฐ”์ดํŠธ(Extra nonce)๋ฅผ ์ถ”๊ฐ€๋กœ ์‚ฌ์šฉ ๏‚— 1์ดˆ์— 296 ๊ฐœ์˜ ํšŸ์ˆ˜๊นŒ์ง€ ๊ณ„์‚ฐ๊ฐ€๋Šฅ
  • 87.
    ๋ธ”๋ก์˜ ์ž‘์—…์ฆ๋ช… ๋‚œ์ด๋„๋ชฉํ‘œ๊ฐ’ ๏‚— target = coefficient * 2(8 โˆ— ๐‘’๐‘ฅ๐‘๐‘œ๐‘›๐‘’๐‘›๐‘ก โˆ’3 ) ๏‚— Bits : 419668748 = 0x1903a30c : => exponent = 0x19, coefficient = 0x03a30c ๏‚— target = 0x03a30c * 2**(0x08 * (0x19 - 0x03)) => target = 0x03a30c * 2**(0x08 * 0x16) => target = 0x03a30c * 2**0xB0 => target = 238348 * 2176 ๏‚— target = 22,829,202,948,393,929,850,749,706,076,701,368,331,0 72,452,018,388,575,715,328 ๏‚— target = 0x0000000000000003A30C0000000000000000000000 0000000000000000000000 ๏‚— 2์ฃผ๋งˆ๋‹ค(2016๋ธ”๋ก) ์ƒˆ๋กญ๊ฒŒ ๊ณ„์‚ฐ
  • 88.
    ๋ธ”๋กํ•ด์‰ฌ ๊ตฌํ•˜๊ธฐ https://blockchain.info/block-height/277316?format=json import hashlib importstruct little_endian = lambda value: struct.pack('<L', value).hex() reverse_order_pair = lambda value: ''.join([value[i - 2:i] for i in range(len(value), 0, -2)]) # https://blockchain.info/block-height/277316?format=json block_info = { 'version' : 2, 'prev_hash' : '0000000000000002a7bbd25a417c0374cc55261021e8a9ca74442b01284f0569', 'merkle_root' : 'c91c008c26e50763e9f548bb8b2fc323735f73577effbc55502c51eb4cc7cf2e', 'time' : 1388185914, 'bits' : 419668748, 'nonce' : 924591752, } convert_block_info = {} # convert version, time, bits, nonce to little endian format convert_block_info['version'] = little_endian(block_info['version']) convert_block_info['time'] = little_endian(block_info['time']) convert_block_info['bits'] = little_endian(block_info['bits']) convert_block_info['nonce'] = little_endian(block_info['nonce']) # reverse order of prev block hash, merkle root convert_block_info['prev_hash'] = reverse_order_pair(block_info['prev_hash']) convert_block_info['merkle_root'] = reverse_order_pair(block_info['merkle_root']) # mix 6 block header info to one hex value header_hex = convert_block_info['version'] + convert_block_info['prev_hash'] + convert_block_info['merkle_root'] + convert_block_info['time'] + convert_block_info['bits'] + convert_block_info['nonce'] # convert hex value to bin header_bin = bytes.fromhex(header_hex) # double hash hash = hashlib.sha256(hashlib.sha256(header_bin).digest()).digest() # reverse order and convert to hex result_header_hex = hash[::-1].hex() print(result_header_hex)
  • 89.
    ์ฑ„๊ตด ๋ธ”๋ก์˜ ์œ ํšจ์„ฑ๊ฒ€์ฆ ๏‚— ํ•ด๋‹น ๋ธ”๋ก์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋Š” ๋ฌธ๋ฒ•์ ์œผ๋กœ ์œ ํšจํ•˜๋‹ค. ๏‚— ํ•ด๋‹น ๋ธ”๋ก ํ—ค๋” ํ•ด์‹œ๋Š” ์ž‘์—…์ฆ๋ช…์„ ์‹œํ–‰ํ•˜๋Š” ๋ชฉํ‘œ ๋‚œ์ด๋„๋ณด๋‹ค ์ž‘๋‹ค. ๏‚— ํ•ด๋‹น ๋ธ”๋ก์˜ ํƒ€์ž„์Šคํƒฌํ”„๋Š” (์‹œ๊ฐ„์˜ค๋ฅ˜๋ฅผ ๊ณ ๋ คํ•ด์„œ) ํ–ฅํ›„ 2์‹œ๊ฐ„ ์ด๋‚ด๋‹ค. ๏‚— ํ•ด๋‹น ๋ธ”๋ก์˜ ํฌ๊ธฐ๋Š” ํ—ˆ์šฉํ• ์ˆ˜ ์žˆ๋Š” ํ•œ๋„๋‚ด์— ์žˆ๋‹ค. ๏‚— ์ œ์ผ ์ฒซ ๊ฑฐ๋ž˜๋Š” ์ฝ”์ธ๋ฒ ์ด์Šค ์ƒ์„ฑ๊ฑฐ๋ž˜์ด๋‹ค. ๏‚— ๋ธ”๋ก๋‚ด์˜ ๋ชจ๋“  ๊ฑฐ๋ž˜๋Š” ๊ฑฐ๋ž˜ ์œ ํšจ์„ฑ ๊ฒ€์ฆ๊ณผ์ •์— ์ด์ƒ์ด ์—†๋Š” ์œ ํšจํ•œ ๊ฑฐ๋ž˜์ด์–ด์•ผ ํ•œ๋‹ค.
  • 90.
    ๋ธ”๋ก์ฒด์ธ์˜ ๋ถ„๊ธฐ -1 ๏‚— ํŒŒ๋ž€์ƒ‰ ๋ธ”๋ก์„ ๊ฐ€์žฅ ์ตœ์ƒ์œ„ ๋ธ”๋ก์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ธ”๋ก์ฒด์ธ์„ ๋‚˜ํƒ€๋‚ด๊ณ  ์žˆ์œผ๋ฉฐ, ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ๋™์ผํ•œ ํŒŒ๋ž€๋ธ”๋ก์„ ๋ถ€ ๋ชจ๋ธ”๋ก์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์Œ
  • 91.
    ๋ธ”๋ก์ฒด์ธ์˜ ๋ถ„๊ธฐ -2 ๏‚— ์บ๋‚˜๋‹ค์—์„œ ๋นจ๊ฐ„์ƒ‰ ๋ธ”๋ก์ด ์ƒ์„ฑ๋˜์–ด ์ „ํŒŒ๊ฐ€ ๋˜๊ณ , ํ˜ธ์ฃผ์—์„œ ์ดˆ๋ก์ƒ‰ ๋ธ”๋ก์ด ์ƒ์„ฑ๋˜์–ด ์ „ํŒŒ๊ฐ€ ๋˜๊ณ  ์žˆ์œผ๋ฉฐ ๋‘๊ฐœ ๋ธ”๋ก ์€ ๋ชจ๋‘ ๋™์ผํ•œ ํŒŒ๋ž€์ƒ‰ ๋ธ”๋ก์„ ๋ถ€๋ชจ๋ธ”๋ก์œผ๋กœ ํ•˜์—ฌ ์ „ํŒŒ
  • 92.
    ๋ธ”๋ก์ฒด์ธ์˜ ๋ถ„๊ธฐ -3 ๏‚— ๊ฐ์ž ์ƒ์„ฑ๋œ ๋ธ”๋ก์ด ๋ชจ๋“ ๋…ธ๋“œ์— ์ „ํŒŒ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋‹ค์Œ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋นจ๊ฐ„์ƒ‰ ๋ธ”๋ก๊ณผ ์ดˆ๋ก์ƒ‰ ๋ธ”๋ก์ด ๋งˆ์ง€๋ง‰ ๋ธ”๋ก์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๋‘๊ฐœ์˜ ๋ธ”๋ก์ฒด์ธ์œผ๋กœ ๋ถ„๊ธฐ๊ฐ€ ๋ฐœ์ƒ ๏‚— ์ดˆ๋ก์ƒ‰ ๋ธ”๋ก์œผ๋กœ ํ™•์žฅ๋œ ๋…ธ๋“œ์—์„œ๋Š” ๋’ค๋Šฆ๊ฒŒ ๋„์ฐฉํ•œ ๋นจ๊ฐ„์ƒ‰ ๋ธ”๋ก์€ ๋ฌด์‹œํ•˜๊ฒŒ ๋˜๊ณ , ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋นจ๊ฐ„์ƒ‰ ๋ธ”๋ก์œผ๋กœ ํ™•์žฅ ๋œ ๋…ธ๋“œ๋Š” ๋’ค๋Šฆ๊ฒŒ ๋„์ฐฉํ•œ ์ดˆ๋ก์ƒ‰ ๋ธ”๋ก์€ ๋ฌด์‹œํ•˜๊ฒŒ ๋จ
  • 93.
    ๋ธ”๋ก์ฒด์ธ์˜ ๋ถ„๊ธฐ -4 ๏‚— ์ดˆ๋ก์ƒ‰ ๋ธ”๋ก์„ ๋ถ€๋ชจ๋ธ”๋ก์œผ๋กœ ๊ฐ€์ง€๋Š” ๋…ธ๋“œ์—์„œ ์ƒˆ๋กญ๊ฒŒ ๋ถ„ํ™์ƒ‰ ๋ธ”๋ก์„ ์ƒ์„ฑํ•˜์—ฌ ์ „ํŒŒ๋ฅผ ์‹œ์ž‘
  • 94.
    ๋ธ”๋ก์ฒด์ธ์˜ ๋ถ„๊ธฐ -5 ๏‚— ์ดˆ๋ก์ƒ‰ ๋ธ”๋ก์„ ๋ถ€๋ชจ๋ธ”๋ก์œผ๋กœ ๊ฐ€์ง€๋Š” ๋…ธ๋“œ๋Š” ์ •์ƒ์ ์œผ๋กœ ํ™•์žฅ์ด ์ง„ํ–‰๋˜์ง€๋งŒ, ๋นจ๊ฐ„์ƒ‰ ๋ธ”๋ก์„ ๋ถ€๋ชจ๋กœ ๊ฐ€์ง€๋Š” ๋…ธ๋“œ๋Š” 2๊ฐœ ์˜ ๋ธ”๋ก์ฒด์ธ์œผ๋กœ ๋ถ„๊ธฐ ๏‚— ํŒŒ๋ž€๋ธ”๋ก->๋นจ๊ฐ„๋ธ”๋ก์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ธ”๋ก์ฒด์ธ๊ณผ, ํŒŒ๋ž€๋ธ”๋ก->์ดˆ๋ก๋ธ”๋ก->๋ถ„ํ™๋ธ”๋ก ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ 2๊ฐœ์˜ ๋ธ”๋ก์œผ๋กœ ๋ถ„๊ธฐ ๏‚— ๋ถ„๊ธฐ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ ๊ฐ€์žฅ๋งŽ์€์ˆ˜์˜ ๋ธ”๋ก์œผ๋กœ ๊ตฌ์„ฑ๋œ ์ฒด์ธ์ด ๊ทธ๋งŒํผ ์œ ํšจํ•œ ์ž‘์—…์ฆ๋ช…์ด ์ด๋ฃจ์–ด์กŒ๋‹ค๊ณ  ํŒ๋‹จํ•˜์—ฌ ํ•˜๊ธฐ ์˜ˆ์—์„œ๋Š” ํŒŒ๋ž€์ƒ‰->์ดˆ๋ก์ƒ‰->๋ถ„ํ™์ƒ‰ ๋ธ”๋ก์œผ๋กœ ๊ตฌ์„ฑ๋œ ์ฒด์ธ์„ ๋ฉ”์ธ์ฒด์ธ์œผ๋กœ ์„ ํƒํ•˜๊ฒŒ ๋˜๊ณ , ๋นจ๊ฐ„์ƒ‰ ๋ธ”๋ก์— ํฌํ•จ๋˜ ์–ด ์žˆ๋˜ ๊ฑฐ๋ž˜๋Š” ๋‹ค์‹œ ๊ฑฐ๋ž˜ํ’€์— ๋“ค์–ด๊ฐ€ ์ƒˆ๋กœ์šด ๋ธ”๋ก์ƒ์„ฑ์„ ์œ„ํ•ด ๋Œ€๊ธฐ