블록체인에서 주소별 비트코인 ​​증감 확인

이 기사에서는 Mac OS Sierra 10.12.4를 사용합니다.
bitcoin 관련 기사의 세 번째입니다.

제1회:bitcoind를 docker로 환경 구축
제 2 회 : bitcoind에 파이썬에서 액세스

거래에서 비트코인 ​​증가 또는 감소 확인



지난번은 파이썬에서 비트 코인 블록을 가져 와서 내부를 보는 곳까지 실시했습니다.
비트 코인 데이터는 블록이 쌓여 있으며, 그 안에 트랜잭션이 기록됩니다.
어떤 주소에서 어떤 주소로 비트 코인이 이동했는지가 트랜잭션에 기록되어 있기 때문에 이론적으로는 그것의 적층으로부터 주소의 잔액을 계산할 수 있게 됩니다.

블록의 내용을 살펴보기



우선 블록의 내용을 살펴 보겠습니다.

연결 만들기
from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException
rpc_user="bitcoinrpc"
rpc_password="passwordxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
rpc_connection = AuthServiceProxy("http://%s:%[email protected]:8332"%(rpc_user, rpc_password))

블록 높이 110000의 블록을 얻는다.
blhash = rpc_connection.getblockhash(110000) #blhashはブロックのhash文字列
rpc_connection.getblock(blhash) #ブロック情報を取得する

결과
{'bits': '1b01cc26',
 'chainwork': '000000000000000000000000000000000000000000000000135fae65c9d5f919',
 'confirmations': 219401,
 'difficulty': Decimal('36459.88692507513'),
 'hash': '000000000001bbda3f22ef8e476b470a2d3ae16821c23a6d22db77318d0799a9',
 'height': 110000,
 'mediantime': 1298490035,
 'merkleroot': 'bb988af992654871e8cefe8bbe05e9f9679611eadcfa53980ee515978eebcd52',
 'nextblockhash': '0000000000018d067c617c2e262e544bae4807e413122b1f4814077a15ac57c6',
 'nonce': 3052574605,
 'previousblockhash': '0000000000017947e1ea1c4f011b5bf712a9edd5e35d2c4db331f2d1764c593a',
 'size': 3202,
 'strippedsize': 3202,
 'time': 1298491791,
 'tx': ['4e10436ca8206a2dd760dd351210a5120a3824d4eb53011be0a7b9a33b368208',
  '76dc5788be4a8cf6925aff15fd8c8fbf6417b4ad6c30a1ac12cd117e95c5820b',
  '7452bfa629b104985f7c937e0f7836206935d83872882c88ae183234fe9bcf97',
  'e325a8a968368aeb6d89bcdb362d311833f5a9fe5a80f3f0730b684922439a68',
  '8510c531b585e77a66a986cb0dfdd0ca280ff0747d2dca0d6fa87b0f8af4810a',
  'f9a5d31e7894c3983d38215060c55665db0024ad7fb373fa58db7316dd223ea9',
  '83e74406b0876fed2db187444dd0a4f3eedad42e9adb32ce82b3ff729fe77b58',
  '0f3e5f5b833dfad8ff19115ecd29fa40566aace67f2880da0ab4fa1acac00bcc',
  'a1743f0803926ef4343e217c78324ec3e3ebc4cfc7c96739f3696b3c510cc7d1',
  '5015ed6455e7d3fb50ce5ef1f63888fe7d4c37042f17f5f89bea176dce4ca0bd',
  '7b14b05552f053a862df22824f92e94f155722f9e5d91341b934a6de010b6560',
  '2564b40ef226c73eb63409f9dbdcc64aeacca6e3a7136e86156a64573ba3f6d1'],
 'version': 1,
 'versionHex': '00000001',
 'weight': 12808}

다양한 글을 쓰고 있지만 tx가 블록에 기록되는 트랜잭션입니다.
이 블록 안에는 12개 저장되어 있네요.

거래 내용을 살펴보기



방금 전 블록의 트랜잭션을 살펴 보겠습니다.
거래 내용 확인에는 getrawtransaction을 이용합니다.

거래 내용을 획득
rpc_connection.getrawtransaction("76dc5788be4a8cf6925aff15fd8c8fbf6417b4ad6c30a1ac12cd117e95c5820b")

결과
'0100000001601f2f0143aa441690c7a2e1c90ae3696ceabf977afad8e08905a1efa20adced010000008b483045022100c3a2945b4cf7b6346a7e5e479bd3a7a2ca828ae6db2be5207f2377c737f64887022059116e34fded0bf5df39e2862cff59489b7701d60fe52367b62ea650b6360faf0141042d4b24c0c1a54e86399cc32e2f4b8524bae9442e6890960b4b11fd511794ccc16bd085102efdea3bb0f1809d10103f54db9597908eaf4f47bee694f73c742992ffffffff02404b4c00000000001976a914ec0994cb53016845edb1e207323faca42884629288ac40162094040000001976a914cb186543ad2d7c1195351678f1e94488c2813a0588ac00000000'

이것이 무엇이 무엇인지 모르겠다.
decoderawtransaction을 호출하여 디코딩합니다.

트랜잭션 디코딩
rpc_connection.decoderawtransaction(rpc_connection.getrawtransaction(txid))

트랜잭션 디코딩 결과
{'hash': '76dc5788be4a8cf6925aff15fd8c8fbf6417b4ad6c30a1ac12cd117e95c5820b',
 'locktime': 0,
 'size': 258,
 'txid': '76dc5788be4a8cf6925aff15fd8c8fbf6417b4ad6c30a1ac12cd117e95c5820b',
 'version': 1,
 'vin': [{'scriptSig': {'asm': '3045022100c3a2945b4cf7b6346a7e5e479bd3a7a2ca828ae6db2be5207f2377c737f64887022059116e34fded0bf5df39e2862cff59489b7701d60fe52367b62ea650b6360faf[ALL] 042d4b24c0c1a54e86399cc32e2f4b8524bae9442e6890960b4b11fd511794ccc16bd085102efdea3bb0f1809d10103f54db9597908eaf4f47bee694f73c742992',
    'hex': '483045022100c3a2945b4cf7b6346a7e5e479bd3a7a2ca828ae6db2be5207f2377c737f64887022059116e34fded0bf5df39e2862cff59489b7701d60fe52367b62ea650b6360faf0141042d4b24c0c1a54e86399cc32e2f4b8524bae9442e6890960b4b11fd511794ccc16bd085102efdea3bb0f1809d10103f54db9597908eaf4f47bee694f73c742992'},
   'sequence': 4294967295,
   'txid': 'eddc0aa2efa10589e0d8fa7a97bfea6c69e30ac9e1a2c7901644aa43012f1f60', #宛先、送金金額はこのトランザクション参照
   'vout': 1 #参照するトランザクションの番号 }],
 'vout': [{'n': 0,
   'scriptPubKey': {'addresses': ['1NX3wzGPxFaMJotm2KcDjrqAYGwu3N7rXb'] #宛先アドレス,
    'asm': 'OP_DUP OP_HASH160 ec0994cb53016845edb1e207323faca428846292 OP_EQUALVERIFY OP_CHECKSIG',
    'hex': '76a914ec0994cb53016845edb1e207323faca42884629288ac',
    'reqSigs': 1,
    'type': 'pubkeyhash'},
   'value': Decimal('0.05000000') #送金金額 },
  {'n': 1,
   'scriptPubKey': {'addresses': ['1KWsPyZ9BYFq9izzRcQXeGffLunCAKx32d'] #宛先アドレス,
    'asm': 'OP_DUP OP_HASH160 cb186543ad2d7c1195351678f1e94488c2813a05 OP_EQUALVERIFY OP_CHECKSIG',
    'hex': '76a914cb186543ad2d7c1195351678f1e94488c2813a0588ac',
    'reqSigs': 1,
    'type': 'pubkeyhash'},
   'value': Decimal('196.65000000') #送金金額 }],
 'vsize': 258}

어쩐지 아는 형태가 되었어요.
다양한 항목이 있지만 vin과 vout에만 주목합니다. vout에는 목적지 주소와 금액이 적혀 있습니다.
value에 주목하면, 0.05와 196.65라고 써 있습니다.
주소 "1NX3wzGPxFaMJotm2KcDjrqAYGwu3N7rXb"에 0.05 비트 코인,
주소 「1KWsPyZ9BYFq9izzRcQXeGffLunCAKx32d」에 196.65 비트 코인에 합계, 196.70 비트 코인을 보냈다고 하는 것이군요.

vin은 다른 txid(트랜잭션 ID)와 "vout"의 번호가 적혀있네요.
이는 이 트랜잭션 ID의 vout의 목적지 주소와 금액이 얼마나 쓰여지는지를 나타냅니다.
조금 이해하기 어렵지만, 즉 vin에 쓰여진 다른 txid를 보러 가서 목적지와 송금 금액을 얻어야합니다.
코드로 하면 이런 느낌입니다.

vin의 거래 취득
txid = "76dc5788be4a8cf6925aff15fd8c8fbf6417b4ad6c30a1ac12cd117e95c5820b"
in_txid = rpc_connection.decoderawtransaction(rpc_connection.getrawtransaction(txid)).get("vin")[0].get("txid")
in_no = rpc_connection.decoderawtransaction(rpc_connection.getrawtransaction(txid)).get("vin")[0].get("vout")
rpc_connection.decoderawtransaction(rpc_connection.getrawtransaction(in_txid)).get("vout")[in_no]

결과
{'n': 1,
 'scriptPubKey': {'addresses': ['1LfAi3G7xYmZKjr823RHWTANnCYdZvmDhK'],
  'asm': 'OP_DUP OP_HASH160 d7a24cc6e59ca8a1e553bc5c42c5f6e4c1277bbf OP_EQUALVERIFY OP_CHECKSIG',
  'hex': '76a914d7a24cc6e59ca8a1e553bc5c42c5f6e4c1277bbf88ac',
  'reqSigs': 1,
  'type': 'pubkeyhash'},
 'value': Decimal('196.70000000')}

빈은 196.70비트 코인을 송금하고 있다는 것을 알았습니다. 이것은 vout의 합계와 같은 금액입니다.
즉, 이것은 주소 "1LfAi3G7xYmZKjr823RHWTANnCYdZvmDhK"에서
「1NX3wzGPxFaMJotm2KcDjrqAYGwu3N7rXb」에 0.05비트 코인,
「1KWsPyZ9BYFq9izzRcQXeGffLunCAKx32d」에 196.65비트 코인을 송금한 거래라고 합니다.

그림으로 하면 이런 느낌입니다.


주소별 비트코인 ​​증감 얻기



지금까지 거래 거래를 얻을 수있었습니다.
이것을 자꾸자꾸 과거의 이력에서 추적해 나가면, 주소의 비트코인 ​​증감을 확인하는 것도 가능합니다.

취득 결과 일부
    アドレス                             減算 加算   ブロック高    トランザクション
0   12c6DSiU4Rq3P4ZxziKxzrL5LmMBrzjrJX  0   50.0    1   0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68be...
1   coinbase                            0    0.0    1   0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68be...
2   1HLoD9E4SDFFPDiYfNYnkBLQ85Y51J3Zb1  0   50.0    2   9b0fc92260312ce44e74ef369f5c66bbb85848f2eddd5a...
3   coinbase                            0    0.0    2   9b0fc92260312ce44e74ef369f5c66bbb85848f2eddd5a...
4   1FvzCLoTPGANNjWoUo6jUGuAG3wg1w4YjR  0   50.0    3   999e1c837c76a1b7fbb7e57baf87b309960f5ffefbf2a9...

나오네요. 이번 대상으로 한 것은 초기의 블록이므로, 사토시나카모토가 마이닝하고 있었을 무렵의 기록입니다. coinbase는 마이닝한 기록으로, 형식상, 작성하고 있을 뿐입니다.
감산은 송금 기록, 가산은 수령 기록입니다. 이번 블록은 마이닝뿐이므로, coinbase로부터 50비트 코인을 수령하고 있을 뿐이군요.

이와 같이 블록체인에서는 거래기록을 제3자 대장으로 누구나 확인할 수 있는 상태로 되어 있는 것을 확인할 수 있었습니다.

좋은 웹페이지 즐겨찾기