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 진수 인 코딩 으로 각각 표시 합 니 다.
OP_DUP OP_HASH160 0x14 A OP_EQUALVERIFY OP_CHECKSIG
비트 코 인 스 크 립 트 의 운영 체 제 를 알 고 있다 면 낯 이 익 을 것 입 니 다.맞습니다. 이것 이 비트 코 인 UTXO 의 잠 금 스 크 립 트 입 니 다.잠 금 스 크 립 트 의 기준 에 따라 A 의 위 치 는 16 진수 비트 코 인 주소, 즉 base 58 인 코딩 전의 값 을 넣 었 습 니 다.
실제 운행 결 과 를 보다.예 를 들 어 여기 의 예제 에서 전달 하 는 매개 변 수 는:
1Lqgj1ThNfwLgHMp5qJUerYsuUEm8vHmVG
address_to_script 출력:
76a914d99f84267d1f90f3e870a5e9d2399918140be61d88ac
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.