pybitcointools 소스 코드 분석의 비트 코 인 거래 데이터 구조

알 아야 할 배경 지식
먼저 비트 코 인의 두 가지 스 크 립 트 유형 을 알 아야 합 니 다.
P2PKH (pay - to - public key - hash) 와 P2SH (pay - to - scrip - hash)
이 부분 은 < > 책 에서 소 개 를 찾 을 수 있 습 니 다. 또한 P2SH 라 는 기준 은 비트 코 인 확장 프로 토 콜 BIP 16 에서 기원 되 었 습 니 다. 제 가 전에 이 협 의 를 번역 한 적 이 있 습 니 다. 관심 이 있 으 면 다음 과 같이 볼 수 있 습 니 다.
http://blog.csdn.net/pony_maggie/article/details/77577121
또한 비트 코 인 스 크 립 트 의 실행 원 리 를 알 아야 합 니 다. 제 가 예전 에 쓴 블 로 그 를 참고 할 수 있 습 니 다.
http://blog.csdn.net/pony_maggie/article/details/73656597
분석 코드 시작
#      
inputs = [{
            'output': 'cd6219ea108119dc62fce09698b649efde56eca7ce223a3315e8b431f6280ce7:0',
            'value': 158000
   }]

#      
outputs = [
            [{'address': addr0, 'value': 1000}, {'address': addr1, 'value': 2000}]
]

for outs in outputs:
    mktx(inputs, outs)
            

inputs 와 outputs 는 테스트 데이터 로 비트 코 인 거래 의 입 출력 에 사용 할 것 입 니 다.
mktx 함수 직접 보기.함수 가 비트 코 인 거래 의 데이터 구 조 를 만 듭 니 다.사전 으로 표시 하고 직렬 화 후 되 돌려 줍 니 다.돌아 오 는 결 과 를 먼저 보 세 요.
0100000001e70c28f631b4e815333a22cea7ec56deef49b69896e0fc62dc198110ea1962cd0000000000ffffffff02e8030000000000001976a914d99f84267d1f90f3e870a5e9d2399918140be61d88acd00700000000000017a9140136d001619faba572df2ef3d193a57ad29122d98700000000

보기 에는 잘 이해 되 지 않 습 니 다. 이것 은 직렬 화 된 값 이기 때문에 직렬 화 되 기 전에 문자열 형식의 사전 입 니 다. 가 독성 이 좋 습 니 다. 다음 과 같 습 니 다.
{'locktime': 0, 'version': 1, 'outs': [{'value': 1000, 'script': '76a914d99f84267d1f90f3e870a5e9d2399918140be61d88ac'}, {'value': 2000, 'script': 'a9140136d001619faba572df2ef3d193a57ad29122d987'}], 'ins': [{'sequence': 4294967295L, 'outpoint': {'index': 0, 'hash': 'cd6219ea108119dc62fce09698b649efde56eca7ce223a3315e8b431f6280ce7'}, 'script': ''}]}

비트 코 인의 협의 에 따라 비트 코 인의 거래 (tx) 구 조 는 이렇다.
tx 메시지 비트 코 인 거래 설명
필드 크기
묘사 하 다.
데이터 형식
설명 하 다.
4
version
uint32_t
거래 데이터 형식 버 전
1+
tx_in
var_int
거래 의 수입 수
41+
tx_in
tx_in[]
이전 출력 에 대한 참조
1+
tx_out count
var_int
거래 의 수출 수
8+
tx_out
tx_out[]
거래 출력 또는 비트 코 인 행방 목록
4
lock_time
uint32_t
거래 기한 이나 block 수 를 잠 금 합 니 다.0 이면 거래 가 계속 잠 겨 있 습 니 다.잠 겨 있 지 않 은 거래 는 block 에 포함 되 지 않 으 며 만 료 되 기 전에 수정 할 수 있 습 니 다. (현재 bitcon 에 서 는 거래 변경 이 허용 되 지 않 기 때문에 사용 되 지 않 습 니 다)
위의 결과 와 대응 하여 입력 수 와 출력 수 를 제외 하고 모두 대응 할 수 있 습 니 다. 두 숫자 가 없 는 이 유 는 list 길이 에 따라 자동 으로 계산 할 수 있 기 때 문 입 니 다.
mktxs 내부 에 들 어가 고 치 를 벗 기 고 실 을 뽑 아 거래 를 어떻게 조립 하 는 지 살 펴 보 자.
def mktx(*args):
    # [in0, in1...],[out0, out1...] or in0, in1 ... out0 out1 ...

    ins, outs = [], []
    for arg in args:
        if isinstance(arg, list):
            for a in arg:
                (ins if is_inp(a) else outs).append(a)
        else:
            (ins if is_inp(arg) else outs).append(arg)


    #         ,   locktime   
    txobj = {"locktime": 0, "version": 1, "ins": [], "outs": []}

    for i in ins:

        if isinstance(i, dict) and "outpoint" in i:
            txobj["ins"].append(i)
        else:
            if isinstance(i, dict) and "output" in i:
                i = i["output"]

            txobj["ins"].append({
                "outpoint": {"hash": i[:64], "index": int(i[65:])},
                "script": "",
                "sequence": 4294967295
            })


    for o in outs:
        if isinstance(o, string_or_bytes_types):
            addr = o[:o.find(':')]
            val = int(o[o.find(':')+1:])
            o = {}
            if re.match('^[0-9a-fA-F]*$', addr):
                o["script"] = addr
            else:
                o["address"] = addr
            o["value"] = val

        outobj = {}
        if "address" in o:
            outobj["script"] = address_to_script(o["address"])
        elif "script" in o:
            outobj["script"] = o["script"]
        else:
            raise Exception("Could not find 'address' or 'script' in output.")
        outobj["value"] = o["value"]
        txobj["outs"].append(outobj)

    return serialize(txobj);

함수 가 길지 않 습 니 다. 앞에서 언급 한 tx 에는 여러 tx 가 포함 되 어 있 습 니 다.in 과 txout, 함 수 는 먼저 tx 대상 을 초기 화 합 니 다.
txobj = {"locktime": 0, "version": 1, "ins": [], "outs": []}

그리고 주요 작업 은 tx 를 조립 하 는 것 입 니 다.in 과 tx아웃 이 야.내용 은 우리 의 테스트 데이터 에서 유래 하여 매개 변수 로 전달 된다.
tx_in 과 txout 데이터 구 조 는 다음 과 같 습 니 다.
tx_out 의 구성:
필드 크기
묘사 하 다.
데이터 형식
설명 하 다.
8
value
uint64_t
거래 하 는 비트 코 인 수량 (단 위 는 0.000000001)
1+
pk_script
var_int
pk_script 길이
?
pk_script
uchar[]
Usually contains the public key as a Bitcoin script setting up conditions to claim this output
tx_in 의 구성:
필드 크기
묘사 하 다.
데이터 형식
설명 하 다.
36
previous_output
outpoint
이전 출력 에 대한 참조
1+
script length
var_int
signature script 길이
?
signature script
uchar[]
거래 권한 을 확인 하 는 데 사용 되 는 계산 스 크 립 트
4
sequence
uint32_t
발송 자가 정의 한 거래 버 전 은 거래 가 block 에 기록 되 기 전에 거래 를 변경 하 는 데 사 용 됩 니 다.
outpoint 는 이전 출력 에 대한 참조 입 니 다.
OutPoint 구조의 구성:
필드 크기
묘사 하 다.
데이터 형식
설명 하 다.
32
hash
char[32]
인 용 된 거래 의 산열
4
index
uint32_t
출력 색인 을 지정 합 니 다. 첫 번 째 출력 색인 은 0 입 니 다.
내 가 인쇄 한 txobj ['ins'] 와 txobj [' outs'] 는 다음 과 같다.
txobj[ins]:[{'sequence': 4294967295L, 'outpoint': {'index': 0, 'hash': 'cd6219ea108119dc62fce09698b649efde56eca7ce223a3315e8b431f6280ce7'}, 'script': ''}]


txobj[outs]:[{'value': 1000, 'script': '76a914d99f84267d1f90f3e870a5e9d2399918140be61d88ac'}, {'value': 2000, 'script': 'a9140136d001619faba572df2ef3d193a57ad29122d987'}]

안에 함수 address 가 있 습 니 다.to_script, 설명 이 필요 합 니 다.
def address_to_script(addr):
    if addr[0] == '3' or addr[0] == '2': 
        return mk_scripthash_script(addr)
    else:
        return mk_pubkey_script(addr)

이름 에서 알 수 있 듯 이 이 함수 의 기능 을 할 때 주 소 를 스 크 립 트 로 바 꾸 는 것 은 도대체 무슨 뜻 입 니까?우 리 는 한 걸음 한 걸음 분석 했다.if 판단 부분 에서 비트 코 인 주소 의 '3' 또는 '2' 는 P2SH 주소 (Pay - to - Script - Hush) 로 시작 하고 다른 주 소 는 P2PKH (Pay - to - Public - Key - Hush) 방식 으로 처리 합 니 다.
P2PKH 는 비트 코 인 네트워크 에서 가장 자주 사용 하 는 스 크 립 트 형식 으로 우 리 는 이 를 예 로 들 어 mk 에 들 어 갑 니 다.pubkey_script 함수 에서 보기:
def mk_pubkey_script(addr):
    # Keep the auxiliary functions around for altcoins' sake
    return '76a914' + b58check_to_hex(addr) + '88ac'

한 줄 로 이 루어 져.b58check_to_hex 는 base 58 디 코딩 작업 입 니 다.우 리 는 비트 코 인 주소 가 이렇게 계산 되 는 것 을 안다.
A = RIPEMD160(SHA256(K))

A 는 비트 코 인 주소 이지 만 A 는 우리 가 흔히 보 는 비트 코 인 주소 가 아니다. 우 리 는 평소에 그것 을 보 는 것 은 가 독성 을 높이 기 위해 base 58 인 코딩 을 거 친 것 이다.
함수 중의 b58checkto_hex (addr) 는 사실 디 코딩 을 A 로 되 돌려 주 는 것 이다.왜 A 로 바 꿔 요?이어서 보다.
76 a9 88 ac 는 비트 코 인 스 크 립 트 의 네 가지 명령 에 대응 하 는 16 진수 인 코딩 으로 각각 표시 합 니 다.
  • 0x76:OP_DUP (스 택 상단 요소 복사)
  • 0xa9:OP_HASH 160 (스 택 상단 에 HASH 를 두 번 진행 하고 SHA - 256 을 먼저 사용 한 다음 에 RIPEMD - 160)
  • 0x88:OP_EQUALVERIFY (OP EQUAL 과 마찬가지 로 결과 가 0 이면 OP VERIFY 를 실행)
  • 0xac:OP_CHECKSIG (거래소 에서 사용 하 는 서명 은 해시 값 과 공개 키 의 유효한 서명 이 어야 합 니 다. 사실 이 라면 1)
  • 그래서 mkpubkey_script 에서 돌아 오 는 스 크 립 트 는:
    OP_DUP OP_HASH160 0x14 A OP_EQUALVERIFY  OP_CHECKSIG
    

    비트 코 인 스 크 립 트 의 운영 체 제 를 알 고 있다 면 낯 이 익 을 것 입 니 다.맞습니다. 이것 이 비트 코 인 UTXO 의 잠 금 스 크 립 트 입 니 다.잠 금 스 크 립 트 의 기준 에 따라 A 의 위 치 는 16 진수 비트 코 인 주소, 즉 base 58 인 코딩 전의 값 을 넣 었 습 니 다.
    실제 운행 결 과 를 보다.예 를 들 어 여기 의 예제 에서 전달 하 는 매개 변 수 는:
    1Lqgj1ThNfwLgHMp5qJUerYsuUEm8vHmVG
    

    address_to_script 출력:
    76a914d99f84267d1f90f3e870a5e9d2399918140be61d88ac
    

    좋은 웹페이지 즐겨찾기