- Cryptography & Cryptocurrencies(암호화, 암호화폐)
- 암호화는 Search puzzle이다.
- H(id + x) <= Y의 조건을 만족해야 한다.
- H
- hash function이다.
- 비트코인에서 H는 SHA-256을 사용한다.
- value x
- 채굴자가 바꾸는 값
- id
- transaction
- a target set Y
- 결과가 Y보다 작아야함
- H
- H(id + x) <= Y의 조건을 만족해야 한다.
- Hash pointer
- hash pointer는 특정 정보를 가리키는 포인터이다.
- 즉 이전 block의 hash값이다.
- 즉 정보를 찾아주며
- 그 정보가 바뀌지 않았는 지 확인해준다.
- x에는 이전 블럭의 hash값이 같이 들어간다.
- block-chain은 이렇게 pointer아닌 이전 블럭의 hash값으로 이전 블럭을 가리키는 linked list이다.
- 참고로 block에 있는 정보는 데이터와 해쉬값을 함께 해쉬한 것이 아닌, 그대로 저장한다.
- 암호화는 Search puzzle이다.
- Digital signature scheme(디지털 서명 계획)
- 이는 3개의 알고리즘으로 구성된다.
-
- (sk, pk) := generateKeys( keysize)
- sk는 private key
- pk는 public key
- keysize는 이 private key, public key 세트를 얼마나 만들 것인지
- 이를 통해서 sk, pk를 만들 수 있다.
- (sk, pk) := generateKeys( keysize)
-
- sig := sign( sk, message)
- 비밀키와 메세지로 서명을 하는 것
- sig := sign( sk, message)
-
- isValid := verify(pk, message, sig)
- public key와 메세지, sig를 이용하여 sig가 타당하면 true, 아니면 false를 리턴
- public key가 왜 필요하냐면, 목적지에는 public key를 해쉬한 값을 넣기에 우리 이를 사용하려면 내 퍼블릭 키를 해쉬해 같은 지 확인하고,
- 서명이 같은지 확인해야하므로
- isValid := verify(pk, message, sig)
-
- 이는 3개의 알고리즘으로 구성된다.
- ECDSA(Elliptic Curve Digital Signature Algorithm)
- 이는 대략 128 bit 대칭 키 보안 정도의 성능을 갖는다(AES 128정도)
- private key: 256bit
- public key: 512bit
- 실은 public key를 해쉬한 값
- 블록체인은 분산 원장이며, 트랜잭션 정보가 공개적으로 저장됩니다. Public key를 직접 노출시키지 않고 해시값을 사용함으로써 사용자의 개인 정보를 보호할 수 있습니다. Public key를 직접 노출시키면 해당 주소의 모든 거래 내역과 잔고가 공개적으로 확인 가능하므로, Public key의 노출을 방지합니다.
- 또한 해시한 public key를 사용하기에 주소의 길이를 줄일 수 있다.
- 실은 public key를 해쉬한 값
- Message to be signed: 256bit(이는 message를 SHA256을 통해 해쉬한 값)
- Signature: 512bit
- 서명이 굉장히 길기에 공동서명같은 경우에는 많은 메모리를 차지하게 된다.
- coin base transaction
- 이는 채굴하면서 받게 되는 코인, 즉 input이 필요가 없다. 주는 사람이 없기에
- 이를 보면 오른쪽에서 1번은 input이 존재하지 않는다. 채굴한 것이기에
- 4번을 보면, Inputs: 2[1] 이라고 적혀 있는데, 이는 2번 거래에서 1번 인덱스를 사용한다는 것.
- 참고로 transaction을 할때에는 input의 모든 금액을 소모해야한다. 즉 쓰고 남은 돈은 나한테 보내야한다.
-
transaction fee = inputs - outputs
- Transaction의 형태
- 다른 한 사람한테 보내고 나머지는 내가 받는 것
- 여러 계좌를 합쳐서 지불하는 것
- 여러 사람한테 지불하는 것
- a full node 클라이언트를 사용하는 wallet Application은 블록체인내의 모든 transaction에서 사용되지 않은 output을 저정해놔야한다.
- 허나 개인 wallet은 이를 모두 저장하지 않고 user에 관한 output만 저장한다.
- 비트코인으로 커피값을 계산하는 데에는 분명, double spend 위험이 있다. 즉 점원에게 돈을 지불하는 bob이 사기를 칠 수 도 있다. 허나 이건 매우 작은 돈이므로, 굳이 사기를 치지 않는다.
- 즉 액수가 크면, transaction을 채결해도 바로 가게 할 수없다. 즉 6블럭정도는 기다리게 해야한다.
- Transaction Outputs and Inputs
- UTXO
- unspent transaction outputs
- 이런 UTXO들의 집합을 UTXO set이라 한다.
- miner들은 stxo는 관리 안하고 utxo만 관리한다. 즉 utxo는 모두 가지고 있다.
- STXO
- spent transaction outputs
- UTXO
- 1 BTC = 10^8 satoshis 이다.
- 즉 비트코인은 작게 쪼갤 수 있고,
- 가장 작은 단위는 satoshis이다.
- 맨 위의 "vin"은 transaction input을 의미
- txid(transaction id)는 해당 UTXO가 있는 transaction의 포인터
- vout은 해당 UTXO가 몇번쨰에 있는지(한 transaction안에 여러 목적지가 있음)
- scriptSig는 unlocking script이고, 즉 이게 서명이다.
- sequence는 replace-by-fee로 transaction이 수용안될 때, 더 높은 가격으로 재전송을 허락하는 시그널이나 현재는 사용안한다. 왜냐면 요즘은 walley이 알아서 transaction fee를 맞춰주기에.
- 밑의 "vout"은 transaction output을 의미
- scriptPubKey는 상대방이 BTC를 받기 위해 풀어야 하는 조건.
- 과정
- txid에 적힌 주소에서 scriptPubKey를 가져오고, 이를 scriptSig를 사용하여 푼다.
- 튜링 불완전
- 비트코인 script languege를 사용하며, 이는 튜링 불완전하다.
- 튜링 불완전하다는 것은 for, if문등을 사용할 수 없다는 것.
- 즉 매우 가벼운언어라는 것
- 비트코인이 튜링불완전을 채택한 이유는 누군가 무한루프를 만들어, 시스템을 과부하 시킬 수 도 있기에
- 따라서 스크립트언어는 매우 단순하다.
- 스크립트 언어
- 튜링 불완전, 즉 복잡하지 않아 시간 예측이 가능하다.
- 실행할 때 가져올 상태가 존재하거나, 상태를 저장하지 않는다. 즉 단순 처리만 한다.
- 스택기반이다.
- 종류: Locking script, Unlocking script
- locking script
- 이는 scriptPubKey와 같은 의미이며 output에 들어있는 spending condition입니다. 즉, 누군가 보낸 BTC를 받기위해 풀어야 하는 조건으로 볼 수 있습니다. scriptPubKey로 불리는 이유는 주로 public key 또는 비트코인 주소를 포함하기 때문입니다.
- 주소는 publick key를 해쉬한 값이므로, publickey를 해쉬하고 이와 같은 지 확인후, 내 서명확
- unlocking script(=witness)
- 이를 witness라고도 한다.
- 이는 scriptSig와 같은 의미이며, vin에서 누군가가 준 비트코인을 사용하기 위해, locking script를 풀기 위한 것.
- 왜 scriptSig냐면 이는 디지털 서명을 포함하고 있기 떄문이다.
- locking script
- P2PKH(pay to public key hash)
- 이는 돈을 public key hash한 곳에 보낸다는 것.
- lockingscript를 unlockingscript가 푸는 방법
- 즉 signature랑 public key가 차례대로 스택에 들어간 상태에서 lockingscript를 시작한다.
- DUP는 스택에서 하나 꺼내 복제하고 둘 다 스택에 넣는다.
- publickey가 복제된다.
- HASH160은 스택에서 하나 꺼내 해쉬하고 다시 스택에 넣는다.
- 이를 통해 public key가 해쉬된다.
- 다만 HASH160은 해쉬를 두번 한 것이다. 왜냐하면 주소도 해쉬를 두번한 값을 사용하기에
- PubKHash는 <>로 둘러쌓여져 있는데, 이는 변수라는 뜻, 즉 스택에 들어간다.
- EQUALVERIFY는 스택에서 두개를 뽑아 같은 지 확인한다.
- 참고로 VERIFY가 안붙으면 스택에 true,false를 저장한다.
- 주어진PUbKHash와 PubK를 해쉬한 값이 같은 지 확인한다.
- 이건 true, false가 스택에 저장되지 않고,
- 맞으면 계속 진행, 틀리면 멈춘다.
- CHECKSIG는 두개를 꺼내서(publickey, sig)를 가지고 signature를 검증한다.
- 결과를 스택에 넣는다.
- signature는 public key를 통해서 옳은 지 확인할 수 있기에
- ECDSA 즉 디지털 서명
- 디지털 서명은 private key의 주인이 누구인지 알 수 있게 해준다.
- 이는 4가지 함수를 사용한다
- OP_CHECKSIG
- OP_CHECKSIGVERIFY
- OP_CHECKMULTISIG
- OP_CHECKMULTISIGVERIFY
- 디지털 서명은
- 개인 키로 그들의 자금 사용을 서명하며
- 부인 봉쇄 해주며
- 서명된 후는 누구도 바꿀 수 없으며
- 다른 서명과는 무관하다.
- 디지털 서명 작동원리
- Sig = (r,s) 즉 메세지와 개인키를 통해 sig를 만들어 낸다.
- 확인은 Sig와 transaction, public key를 통해 가능
- SIGHASH
- 시그니처는 모든 transaction에 적용하나
- SIGHASH flag를 통해, transaction 부분에만 시그니처를 적용할 수 있다.
- All
- 가장 기본적인 모습
- None
- 돈을 뿌린 것
- 즉 마음대로 목적지를 바꿔도 무관
- 왜냐하면 목적지에는 서명을 안했으므
- 즉 outputlocking scripi를 바꿔도 된다.
- SINGLE
- 돈을 조금 뿌린것
- ALL ANYONECANPAY
- 후원 받는 것
- NONE/ALLONECANPAY
- dust collector(잔돈 털고 싶을 때 이렇게 하면 dust collector가 가져간다)
- 왜냐하면 이는 잔돈이 transaction fee보다 작으면 굳이 거래하고싶지 않으니까, 채굴자가 가져가라~
- 누구든 자신 계좌랑 합칠 수 있다.
- SINGLE/ANYONECNAPA
- 이는 transaction fee가 부담스러울 때, 누군가와 같이 한 transaciton을 이용하여 거래할 수 있다.
- 왜냐하면 내가 가져올 locking script와 목적지는 정해졋으므로
- public key는 두번 해쉬해서 주소로만든다.
- 첫번째로 sha256을 통해 해쉬한다.
- 이 해쉬한 값을 RIPEMD을 통해 160bit로 해쉬한다.
- 이를 fingerprint에 넣고, 앞에 00 붙이고, 뒤에 손상방지용으로 fingerprint를 sha256으로 두번해쉬한 checksum 필드를 합친다.
- 이 합친 것을 Base58을 사용하여 사용자에게 친숙하게 만들어준다.
- 이 결과가 주소이다.
- Base64
- 영어 대문자(26) + 영어 소문자(26) + 숫자(10) + (=, +) 총 64개
- Base58
- 위와 유사하나 햇갈릴 수 있는 0(숫자), O(대문자 오), I(대문자 아이), l(소문자 엘)을 제거
- public key는 두번 해쉬해서 주소로만든다.
- All
'블록체인' 카테고리의 다른 글
[블록체인] 비트코인 메커니즘-난도조절, coinbase트랜잭션,hard fork, soft fork (0) | 2023.12.17 |
---|---|
[블록체인] 비트코인-머클트리(Merkle tree) (1) | 2023.12.17 |
[블록체인] 이더리움이란? (0) | 2023.11.24 |
[블록체인] 정리2 (3) | 2023.10.26 |
블록체인 정리1 (1) | 2023.10.26 |