cchaining / qna

0 stars 0 forks source link

비트코인 트랜잭션에 대한 시그니처에 대한 부분 #3

Open gloryan0829 opened 6 years ago

gloryan0829 commented 6 years ago

우선 일반적으로 비트코인은 UTXOs ( Unspent Transaction Ouputs ) 에 대한 개념을 가지고 있다는 것은 알고 계실 겁니다. UTXOs 는 모든 트랜잭션에서 Input 을 통해 다른사람에게 보낼돈하고 Output을 통해 나에게 들어온돈을 Aggregation 해서 잔고가 얼마 남았는지 블록체인 상에서 트랜잭션을 탐색해서 하는 방법인데요.

이 때 트랜잭션에 대한 Private/Public Key 에 대한 시그니처로 Verification 하는 부분에 대해 질문이 있어 올려봅니다.

일반적으로 A가 B에게 3BTC 를 보낸다고 했을 때 A는 B의 Address를 기준으로 메시지를 Encryption 하고 B는 A에게 받았다는 것을 본인이 가지고 있는 Private Key로 풀게 되어있습니다.

이때 과정을 수식으로 표현하자면,

Pubkey(tx) ---------> B's PrivKey(PubKey(tx)) ----> Verification ----YES-----> 3BTC는 B의 UTXO임

위와 같이 되는데요..... public key와 address는 다른 해시값이고 비트코인의 경우 Address 생성 방식이 Private Key를 SHA256으로 두 번 Hash 하여 Address를 만든다고 하는데요... 저위의 수식은 public key로 tx를 encryption 하는 데 저걸 풀 때 Private Key로 두 번을 풀어줘야하는지...;; 저 위의 시그니처를 실제로 Transaction UTXO의 개념으로 예를 들어 명확한 설명이 좀 필요해 보일듯해서 질문을 올려봅니다....;;;

ParkDongJo commented 6 years ago

죄송하지만, 이해가 잘 안되어서, 재질문을 드리고자 합니다. 전자 서명부분이라면 tx을 보내는 쪽에서 private key로 encryption 하고 시그니처를 넣어서 보내고, 받는 쪽에서 함께보내진 public key를 가지고 tx에 포함된 시그니처를 decryption 하여 Verification 하는것 아니였나요?? 간단하게 수식으로 해보자면,

[보내는 측 : A] Sign (Message, Private Key) -> Signature [받는 측 : B] Verify (Message, Public Key, Signature) -> True/False

헌데, 위의 질문에 내용을 보면 반대로 되어 있어서, 다른 시그니처 검증부분이 있는건가, 그럼 어떤 검증부분인건가. 조금만 더 보충 설명을 해주시면 감사하겠습니다.

gloryan0829 commented 6 years ago

일반적인 메시지 시그니처의 경우 동조님께서 말씀해주신 사항과 같이 프라이빗 키로 잠궈서 상대방이 내 퍼블릭키로 열어서 메시지를 확인하지만 크립토 송금의 경우에는 반대라고 생각 되어지는 데요,...

image

밥이 엘리스에게 3BTC를 보냈을 때 앨리스의 Public Key로 Encryption 한 후 보내게 되고 이때 앨리스의 주소가 유효한 주소라면 앨리스 이름으로 UTXO가 생성되게 되지요.. Unspent Tx를 사용하기 위해선 앨리스의 Private Key로 해제해 줘야 소비를 할 수 있게 되는데 제가 말했던 질문은 이거에요~

밥이 알고있는건 분명 앨리스의 Address 일텐데 Address는 Public key와 다르다... 이때 위의 수식과정에서 어떠한 수식이 포함되어야 할까 라는 생각을 가지게 되서 쓰레드를 올리게되었네요 :)

modolee commented 6 years ago

"Alice는 Bob의 Public Key를 어디에서, 어떻게 획득할 수 있을까?" 로 요약할 수 있을까요?

gloryan0829 commented 6 years ago

"Alice는 Bob의 Public Key를 어디에서, 어떻게 획득할 수 있을까?" 로 요약할 수 있을까요?

주저리 떠들었지만 요약하자면 그렇네요... 질문이 너무 장황했어..;;

ParkDongJo commented 6 years ago

바로잡아 주셔서 감사합니다. 질문하길 잘했네요.

말씀하신 public key는 최초로 노드가 참여할 때, 네트워크에 자신의 public key를 address와 함께 broadcast 하지 않을까요? 그리고 각 노드마다 다른 노드들의 public key 데이터를 저장하고 있는 Pool이 있지 않을까요?

저도 확실히 하기 위해 찾아봐야겠습니다.

modolee commented 6 years ago

비트코인 스크립트 부분을 자세히 봐야 될 것 같습니다. scriptSig, scriptPubKey 이 부분을 조금 더 집중적으로 보면 답이 나올 것 같고, 일단은 트랜잭션을 보내는 상대방을 받는쪽의 Public Key를 그대로 사용하지 않고 Public Key Hash를 이용해서 스크립트를 만들고 그것을 Tx의 output에 포함해서 전송합니다.

문송합니다 - 에피소드5.5: 비트코인과 이더리움 언어는 뭐가 다를까 6장 Mastering Bitcoin 6장 - Transactions : P2PKH - Public Key에 지불하는게 아니라 Public Key Hash에 지불한다는 컨셉이며 Public Key Hash는 Address에서 추출할 수 있습니다.

Public Key Hash -> Address 만드는 과정이 있고, 그 반대 과정 복원이 가능합니다. https://github.com/modolee/blockchain/wiki/Wallet#%EA%B3%B5%EA%B0%9C%ED%82%A4%EC%99%80-%EC%A3%BC%EC%86%8C

ParkDongJo commented 6 years ago

성일님이 말씀하신 내용은 **비트코인 블록체인과 금융의 혁신** 이라는 보라색 책에 표준거래 내용에 자세히 나옵니다. 해당 거래에 대한 연산을 Stack 구조에 담아서 하는데, 그에 대한 그림이 여기에 자세히 나오네요. 189p~ 부터 입니다.

스크립트 잠금 / 해제 에 대한 내용인데 저도 덕분에 다시 찾아봤습니다.

근데 성일님이 참조해주신 문송합니다에서는 public key hash 가 address와 동일한 것처럼 이야기 하고 있는데, 이더리움은 public key를 해쉬한 일부분을 address로 쓰지만 비트코인은 정확히 잘 모르겠네요. 그리고 성일님은 public key에서 address를 추출할 수 있다고 하시니, 문송에서 이해하기 쉽게 이야기 한 거 일까요?ㅋㅋ

gloryan0829 commented 6 years ago

와우 동조님 성일님 땡큐!!! 일단 찾아볼게요.... 동조님이 솔루션 주신부분은 교보문고 갔을때 한번 찾아볼게요....!!! 이렇게 이슈를 올려서 토론하니 좋은거같음! 굿

modolee commented 6 years ago

https://bitcoin.org/en/developer-guide#transactions 여기도 참고하면 좋을 듯 합니다.

ParkDongJo commented 6 years ago

저도 이전에 요거 타이틀따라 봤었는데, 결국 정주님이 원하는 답은 없어 보이더라구요. 그래도 sig에 대해서는 상세히 나와있으니 굳굳!!

modolee commented 6 years ago

정주님이 원하는 답을 얻으신거 아닌가요? Public Key를 얻어서 Encryption 할 필요 없이 Public Key Hash로 Encryption 하면 되는데, 이 것은 Address에서 앞의 버전과 뒤의 체크섬을 빼면 구할 수 있다. 이런 결론이 나온 것 같은데...