Recommended
PDF
ไบๅๆข็ดขใใฏใใใใใฆใใญใใซ
PDF
AtCoder Regular Contest 037 ่งฃ่ชฌ
PPTX
Sรบฤasnรฉ premeny ลกkolskรฉho kurikula na Slovensku prezentรกcia I.ฤasลฅ.pptx
PDF
AtCoder Regular Contest 021 ่งฃ่ชฌ
PDF
PDF
AtCoder Regular Contest 022 ่งฃ่ชฌ
PDF
AtCoder Beginner Contest 011 ่งฃ่ชฌ
PDF
AtCoder Beginner Contest 035 ่งฃ่ชฌ
PPTX
AtCoder Beginner Contest 002 ่งฃ่ชฌ
PDF
ใๅญฆ็ฟใกใข#11thใ12ในใใใใงไฝใ็ต่พผใฟOS่ชไฝๅ
ฅ้
PDF
PDF
AtCoder Beginner Contest 021 ่งฃ่ชฌ
PPTX
PDF
0็ซ Linuxใซใผใใซใ่ชญใๅใซๆไฝ้็ฅใฃใฆใใในใใใจ
PDF
AtCoder Beginner Contest 010 ่งฃ่ชฌ
PDF
20230215 - ๅ่ๅ้ๅ
ฑ่ญ็ๆบ้ๆนๆณ (Effective Team Communication)
PDF
Laser scanner-mobile mapping-white-paper
PDF
AtCoder Regular Contest 018 ่งฃ่ชฌ
PDF
AtCoder Regular Contest 042 ่งฃ่ชฌ
PDF
AtCoder Beginner Contest 007 ่งฃ่ชฌ
PPTX
ใใคใใณใฐใใผใซใฎๅ็้
ๅใจๆปๆๆๆณ
PDF
็ทๅฝขๅๅธฐใจ้ๅฑค็ใฏใฉในใฟใชใณใฐใฎๅฎ่ฃ
PDF
ใๅญฆ็ฟใกใข#7thใ12ในใใใใงไฝใ็ต่พผใฟOS่ชไฝๅ
ฅ้
PDF
PDF
CODE FESTIVAL 2014 ไบ้ธA ่งฃ่ชฌ
PDF
PDF
AtCoder Beginner Contest 029 ่งฃ่ชฌ
PPTX
๋นํธ์ฝ์ธ์ผ๋ก ์ดํดํ๋ ๋ธ๋ก์ฒด์ธ ๊ธฐ์
PDF
How Blockchain Works - ๋ธ๋ก์ฒด์ธ์ ์๋ฆฌ
PPTX
Block chain introduction slideshare
More Related Content
PDF
ไบๅๆข็ดขใใฏใใใใใฆใใญใใซ
PDF
AtCoder Regular Contest 037 ่งฃ่ชฌ
PPTX
Sรบฤasnรฉ premeny ลกkolskรฉho kurikula na Slovensku prezentรกcia I.ฤasลฅ.pptx
PDF
AtCoder Regular Contest 021 ่งฃ่ชฌ
PDF
PDF
AtCoder Regular Contest 022 ่งฃ่ชฌ
PDF
AtCoder Beginner Contest 011 ่งฃ่ชฌ
PDF
AtCoder Beginner Contest 035 ่งฃ่ชฌ
What's hot
PPTX
AtCoder Beginner Contest 002 ่งฃ่ชฌ
PDF
ใๅญฆ็ฟใกใข#11thใ12ในใใใใงไฝใ็ต่พผใฟOS่ชไฝๅ
ฅ้
PDF
PDF
AtCoder Beginner Contest 021 ่งฃ่ชฌ
PPTX
PDF
0็ซ Linuxใซใผใใซใ่ชญใๅใซๆไฝ้็ฅใฃใฆใใในใใใจ
PDF
AtCoder Beginner Contest 010 ่งฃ่ชฌ
PDF
20230215 - ๅ่ๅ้ๅ
ฑ่ญ็ๆบ้ๆนๆณ (Effective Team Communication)
PDF
Laser scanner-mobile mapping-white-paper
PDF
AtCoder Regular Contest 018 ่งฃ่ชฌ
PDF
AtCoder Regular Contest 042 ่งฃ่ชฌ
PDF
AtCoder Beginner Contest 007 ่งฃ่ชฌ
PPTX
ใใคใใณใฐใใผใซใฎๅ็้
ๅใจๆปๆๆๆณ
PDF
็ทๅฝขๅๅธฐใจ้ๅฑค็ใฏใฉในใฟใชใณใฐใฎๅฎ่ฃ
PDF
ใๅญฆ็ฟใกใข#7thใ12ในใใใใงไฝใ็ต่พผใฟOS่ชไฝๅ
ฅ้
PDF
PDF
CODE FESTIVAL 2014 ไบ้ธA ่งฃ่ชฌ
PDF
PDF
AtCoder Beginner Contest 029 ่งฃ่ชฌ
Similar to Blockchain 1st bitcoin_core
PPTX
๋นํธ์ฝ์ธ์ผ๋ก ์ดํดํ๋ ๋ธ๋ก์ฒด์ธ ๊ธฐ์
PDF
How Blockchain Works - ๋ธ๋ก์ฒด์ธ์ ์๋ฆฌ
PPTX
Block chain introduction slideshare
PDF
๋ธ๋ก์ฒด์ธ(Block Chain)์ด๋? - ๋ธ๋ก์ฒด์ธ์ ๊ตฌ์ฑ์์, ์๋์๋ฆฌ, ๋ฉ์ปค๋์ฆ์ ์ดํด
PDF
๋นํธ์ฝ์ธ๊ณผ ๋ธ๋ก์ฒด์ธ ํต์ฌ๊ฐ๋
์ ๋ฆฌ
PDF
๋นํธ์ฝ์ธ ๊ฐ์ธ๊ฐ ์ ์ํํ์์คํ
์์ฝ ์ค๋ช
PDF
แแ
ณแฏแ
แ
ฉแจแแ
ฆแแ
ตแซแแ
ช แแ
กแทแแ
ฉแแ
ชแแ
จ แแ
ณแ
แ
ตแแ
ฉ แแ
กแจแแ
ฅแผแแ
ฉแแ
ณ
PPTX
Blockchain Basic Concept Theory (Beginner Version) / ์ด๋ณด์๋ฅผ ์ํ ๋ธ๋ก์ฒด์ธ ๊ธฐ์ด ๊ฐ๋
์ด๋ก
PDF
๊ฐ์ํํ์ ๋ธ๋ก์ฒด์ธ ๊ธฐ์ Cryptocurrency & Blockchain Technology (KOR ver.)
PDF
[Blockchain and Cryptocurrency] 04. Bitcoin and Nakamoto Blockchain
PPTX
PDF
[Blockchain and Cryptocurrency] 02. Blockchain Overview and Introduction - Te...
PDF
Blockchain Study(2) - POW&POS
PDF
PPTX
๋ธ๋ก์ฒด์ธ ์ด์์ ์ ๋ง New db
PDF
๋นํธ์ฝ์ธ ์ฑ๊ตด๊ณผ์
PDF
PDF
Blockchain 2nd ethereum_core
PDF
PDF
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. 9. ๋นํธ์ฝ์ธ์์ Hash ํจ์ ์ฌ์ฉ
๏ RIPEMD160(SHA256(x))
๏ ๋นํธ์ฝ์ธ ์ฃผ์ ์์ฑ
๏ SHA256(SHA256(x))
๏ ๋จธํดํธ๋ฆฌ์์ ํธ๋์ญ์
์ ํด์ฌ ์ฐ์ฐ
๏ ํธ๋์ญ์
ID ์์ฑ
๏ ๋ธ๋กํค๋์ ํด์ฌ ์ฐ์ฐ
๏ Double hash ์ฐ์ฐ์ ํ๋ ์ด์
๏ length-extension attacks ๋ฐฉ์ง
๏ A๊ฐ์ ๋ชฐ๋ผ๋ hash(A)์ length(A)๋ฅผ ์๋ฉด hash(A||B)์ ์์ ์์
10. 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. 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. 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. 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
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$
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. 56. 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. 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 ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก 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
70. 71. 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
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)
89. ์ฑ๊ตด ๋ธ๋ก์ ์ ํจ์ฑ ๊ฒ์ฆ
๏ ํด๋น ๋ธ๋ก์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ๋ฌธ๋ฒ์ ์ผ๋ก ์ ํจํ๋ค.
๏ ํด๋น ๋ธ๋ก ํค๋ ํด์๋ ์์
์ฆ๋ช
์ ์ํํ๋ ๋ชฉํ ๋์ด๋๋ณด๋ค ์๋ค.
๏ ํด๋น ๋ธ๋ก์ ํ์์คํฌํ๋ (์๊ฐ์ค๋ฅ๋ฅผ ๊ณ ๋ คํด์) ํฅํ 2์๊ฐ ์ด๋ด๋ค.
๏ ํด๋น ๋ธ๋ก์ ํฌ๊ธฐ๋ ํ์ฉํ ์ ์๋ ํ๋๋ด์ ์๋ค.
๏ ์ ์ผ ์ฒซ ๊ฑฐ๋๋ ์ฝ์ธ๋ฒ ์ด์ค ์์ฑ๊ฑฐ๋์ด๋ค.
๏ ๋ธ๋ก๋ด์ ๋ชจ๋ ๊ฑฐ๋๋ ๊ฑฐ๋ ์ ํจ์ฑ ๊ฒ์ฆ๊ณผ์ ์ ์ด์์ด ์๋ ์ ํจํ ๊ฑฐ๋์ด์ด์ผ ํ๋ค.
90. ๋ธ๋ก์ฒด์ธ์ ๋ถ๊ธฐ - 1
๏ ํ๋์ ๋ธ๋ก์ ๊ฐ์ฅ ์ต์์ ๋ธ๋ก์ผ๋ก ๊ฐ์ง๊ณ ์๋ ๋ธ๋ก์ฒด์ธ์ ๋ํ๋ด๊ณ ์์ผ๋ฉฐ, ๋ชจ๋ ๋
ธ๋๊ฐ ๋์ผํ ํ๋๋ธ๋ก์ ๋ถ
๋ชจ๋ธ๋ก์ผ๋ก ๊ฐ์ง๊ณ ์์
91. ๋ธ๋ก์ฒด์ธ์ ๋ถ๊ธฐ - 2
๏ ์บ๋๋ค์์ ๋นจ๊ฐ์ ๋ธ๋ก์ด ์์ฑ๋์ด ์ ํ๊ฐ ๋๊ณ , ํธ์ฃผ์์ ์ด๋ก์ ๋ธ๋ก์ด ์์ฑ๋์ด ์ ํ๊ฐ ๋๊ณ ์์ผ๋ฉฐ ๋๊ฐ ๋ธ๋ก
์ ๋ชจ๋ ๋์ผํ ํ๋์ ๋ธ๋ก์ ๋ถ๋ชจ๋ธ๋ก์ผ๋ก ํ์ฌ ์ ํ
92. ๋ธ๋ก์ฒด์ธ์ ๋ถ๊ธฐ - 3
๏ ๊ฐ์ ์์ฑ๋ ๋ธ๋ก์ด ๋ชจ๋ ๋
ธ๋์ ์ ํ๊ฐ ์๋ฃ๋๋ฉด ๋ค์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋นจ๊ฐ์ ๋ธ๋ก๊ณผ ์ด๋ก์ ๋ธ๋ก์ด ๋ง์ง๋ง ๋ธ๋ก์ผ๋ก
์ด๋ฃจ์ด์ง ๋๊ฐ์ ๋ธ๋ก์ฒด์ธ์ผ๋ก ๋ถ๊ธฐ๊ฐ ๋ฐ์
๏ ์ด๋ก์ ๋ธ๋ก์ผ๋ก ํ์ฅ๋ ๋
ธ๋์์๋ ๋ค๋ฆ๊ฒ ๋์ฐฉํ ๋นจ๊ฐ์ ๋ธ๋ก์ ๋ฌด์ํ๊ฒ ๋๊ณ , ๋ง์ฐฌ๊ฐ์ง๋ก ๋นจ๊ฐ์ ๋ธ๋ก์ผ๋ก ํ์ฅ
๋ ๋
ธ๋๋ ๋ค๋ฆ๊ฒ ๋์ฐฉํ ์ด๋ก์ ๋ธ๋ก์ ๋ฌด์ํ๊ฒ ๋จ
93. ๋ธ๋ก์ฒด์ธ์ ๋ถ๊ธฐ - 4
๏ ์ด๋ก์ ๋ธ๋ก์ ๋ถ๋ชจ๋ธ๋ก์ผ๋ก ๊ฐ์ง๋ ๋
ธ๋์์ ์๋กญ๊ฒ ๋ถํ์ ๋ธ๋ก์ ์์ฑํ์ฌ ์ ํ๋ฅผ ์์
94. ๋ธ๋ก์ฒด์ธ์ ๋ถ๊ธฐ - 5
๏ ์ด๋ก์ ๋ธ๋ก์ ๋ถ๋ชจ๋ธ๋ก์ผ๋ก ๊ฐ์ง๋ ๋
ธ๋๋ ์ ์์ ์ผ๋ก ํ์ฅ์ด ์งํ๋์ง๋ง, ๋นจ๊ฐ์ ๋ธ๋ก์ ๋ถ๋ชจ๋ก ๊ฐ์ง๋ ๋
ธ๋๋ 2๊ฐ
์ ๋ธ๋ก์ฒด์ธ์ผ๋ก ๋ถ๊ธฐ
๏ ํ๋๋ธ๋ก->๋นจ๊ฐ๋ธ๋ก์ผ๋ก ์ด๋ฃจ์ด์ง ๋ธ๋ก์ฒด์ธ๊ณผ, ํ๋๋ธ๋ก->์ด๋ก๋ธ๋ก->๋ถํ๋ธ๋ก ์ผ๋ก ์ด๋ฃจ์ด์ง 2๊ฐ์ ๋ธ๋ก์ผ๋ก ๋ถ๊ธฐ
๏ ๋ถ๊ธฐ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ ๊ฒฝ์ฐ ๊ฐ์ฅ๋ง์์์ ๋ธ๋ก์ผ๋ก ๊ตฌ์ฑ๋ ์ฒด์ธ์ด ๊ทธ๋งํผ ์ ํจํ ์์
์ฆ๋ช
์ด ์ด๋ฃจ์ด์ก๋ค๊ณ ํ๋จํ์ฌ
ํ๊ธฐ ์์์๋ ํ๋์->์ด๋ก์->๋ถํ์ ๋ธ๋ก์ผ๋ก ๊ตฌ์ฑ๋ ์ฒด์ธ์ ๋ฉ์ธ์ฒด์ธ์ผ๋ก ์ ํํ๊ฒ ๋๊ณ , ๋นจ๊ฐ์ ๋ธ๋ก์ ํฌํจ๋
์ด ์๋ ๊ฑฐ๋๋ ๋ค์ ๊ฑฐ๋ํ์ ๋ค์ด๊ฐ ์๋ก์ด ๋ธ๋ก์์ฑ์ ์ํด ๋๊ธฐ