비트코인(11)
-
[밑바닥비트코인] 9. p2sh 스크립트
Multi-signature (multisig) refers to requiring multiple keys to authorize a Bitcoin transaction, rather than a single signature from one key. It has a number of applications. 1. Dividing up responsibility for possession of bitcoins among multiple people. 2. Avoiding a single-point of failure, making it substantially more difficult for the wallet to be compromised. 3. m-of-n backup where loss of ..
2021.08.16 -
[밑바닥비트코인] 8. 트랜잭션 검증과 생성
저번 장까지 트랜잭션을 직렬화하고 파싱하는 방법과 트랜잭션을 검증할 수 있는 방법인 스크립트에 대해서 살펴봤으니 이번 장에서는 스크립트를 이용하여 트랜잭션을 검증하고 생성하는 방법에 대해서 알아보자. 트랜잭션 검증 비트코인을 소비하고자 하는 사람 A는 트랜잭션을 생성하고, 이 트랜잭션을 다른 노드에 전파하면 다른 노드들은 이 트랜잭션이 타당한지 검증하는 절차를 수행한다. 다른 노드들에 의해 받아들여지려면 다음 조건을 만족해야한다. 1. 트랜잭션 입력이 가리키는 비트코인이 존재하고 사용가능한가? 2. 입력 비트코인의 합은 출력 비트코인의 합보다 크거나 같은가? 3. 입력의 해제 스크립트는 이전 트랜잭션 출력의 잠금 스크립트를 올바르게 해제하는가? 1번 항목은 이중지불 방지를 위함이고 2번 항목은 새로운 비..
2021.08.09 -
[밑바닥비트코인] 7. 스크립트
'스크립트(Script)'는 비트코인 네트워크 내에서 비트코인이 어떠한 조건에서 소비되는지를 기술한 프로그래밍 언어이다. 비트코인 스크립트의 특징은 다음과 같다. 1. 반복 작업을 위한 루프 기능이 존재하지 않는다. (튜링 완전하지 않다) 2. 원소와 연산자 두가지의 요소로 이루어져있다. 반복문이 존재하지 않는 이유는 무한 반복문을 만들어서 네트워크에 부정적 영향을 미칠 수 있기 때문이다. 원소는 고정된 상수라고 생각할 수 있고, 연산자는 원소에 대해서 특정 연산을 수행한다. class Script: def __init__(self, cmds=None): if cmds is None: self.cmds = [] else: self.cmds = cmds 스크립트는 원소와 연산자를 담고 있는 cmds라는 리..
2021.08.01 -
[밑바닥비트코인] 6. 트랜잭션(Transaction)
이번 장에서는 실제로 트랜잭션이 어떻게 구성되는지 살펴보고 트랜잭션을 파싱하고, 직렬화하는 방법에 대해서 알아보도록 하겠다. 트랜잭션의 구조 from lib.helper import hash256 from lib.helper import little_endian_to_int, int_to_little_endian, read_varint, encode_varint from transaction.TxIn import TxIn from transaction.TxOut import TxOut class Tx: def __init__(self, version, tx_ins, tx_outs, locktime, testnet=False, segwit=False): self.version = version self.t..
2021.07.20 -
[밑바닥비트코인] 5. 직렬화
지금까지 구현한 클래스들의 객체(인스턴스)들을 네트워크 상에서 전파하거나 주고받기 위해서는 직렬화 과정이 필요하다. S256Point, Signature 등의 객체들을 직렬화하는 방법을 알아보자. SEC 형식 먼저 S256Point 객체의 직렬화 과정을 추가해보자. def sec(self, compressed=True): if compressed: if self.y.num%2 == 0: return b'\x02'+self.x.num.to_bytes(32,'big') else: return b'\x03'+self.x.num.to_bytes(32,'big') return b'\x04'+self.x.num.to_bytes(32, 'big') \ + self.y.num.to_bytes(32,'big') 먼저 비..
2021.07.15 -
[밑바닥비트코인] 4. 유한체와 타원곡선
이전 장에서 유한체와 타원곡선이 무엇인지 각각 살펴보았다. 유한체라 함은 여러 조건(덧셈에 닫힘, 항등원, 역원의 존재... 등)을 만족하는 유한개의 원소를 가진 집합이고, 타원 곡선에서는 점 덧셈이라는 것을 하는데, 우리가 익히 알고있는 실수 간의 덧셈의 방식이 아니라 특이하게 수행되는 연산방식을 말한다. 놀랍게도, 실수체 뿐만 아니라 유한체 위에서 타원곡선이 정의될 수 있다. 다시말해 유한체끼리의 점덧셈이 가능하다는 의미이다. 유한체와 타원곡선 유한체 위에서 정의된 타원곡선은 조금 특이하게 생겼다. 출처 : https://cse.unl.edu/~ssamal/crypto/EEECC.php '곡선'이라는 말이 무색하게도 점들이 여러군데 산재해있음을 확인할 수 있다. 하지만 이러한 유한체의 타원곡선의 특성..
2021.07.12