从给定 'name' 操作的名称币交易中提取输入地址
Extract input address from a namecoin transaction given a 'name' operation
我一直在尝试使用一些 python 代码从 Namecoin 交易中提取输入地址。此代码适用于常规交易(其中一些名称币从一个地址转移到另一个地址);但是,这不适用于具有 name 操作的交易,例如 name_new。这是一些代码:
raw = namecoind.getrawtransaction(tx_hash)
data = namecoind.decoderawtransaction(raw)
if 'vin' in data:
inputs = data['vin']
for input in inputs:
input_value = input.get('value')
if 'scriptSig' in input:
script_sig_asm = str(input['scriptSig'].get('asm'))
script_sig_parts = script_sig_asm.split(' ')
if len(script_sig_parts) > 1 and (len(script_sig_parts[-1]) == 130
or len(script_sig_parts[-1]) == 66):
public_key_string = script_sig_parts[-1]
try:
recipient_address = NamecoinPublicKey(public_key_string, verify=False).address()
print recipient_address
except Exception, e:
print str(e)
return
elif len(script_sig_parts) == 1:
print "coinbase transaction input"
return
#print "Inputs:"
运行 此代码在常规交易中有效,即,我们获得收件人地址。但是 运行 这个名称操作的代码,例如 this 表明它是一个 coinbase 交易,即
len(script_sig_parts) == 1
为真,因此 recipient_address 为空。
谁能告诉我如何在涉及名称操作的 Namecoin 交易中获取收件人地址(在上述交易中为:NCAzVGKq8JrsETxAkgw3MsDPinAEPwsTfn)?
您的代码在大多数名称交易中应该可以正常工作(但我还没有测试过)。例如,如果您使用 499a1e4c7bb1388347e1bd1142425949971eaf1fa2521af625006f4f49ce85c5
(这是 d/domob
的最新更新),则输入的相关脚本签名是这样的:
"scriptSig" : {
"asm" : "3045022100c489ac648d08416d83d5e561d222049242242ded5f1c2bfd35ea48bb78b6a90f02203a28dee3d9473755fc2288bcaec9105e973e306071d28e69e593668c94b19fc101 04a85b7360b6b95459f7286111220f7a1eaef23bc9ced8a3b56cd57360374381bcabf7182941be400ccdfb761e26fa62d50b8911358aceb6aa30de9e8df5c46742",
"hex" : "483045022100c489ac648d08416d83d5e561d222049242242ded5f1c2bfd35ea48bb78b6a90f02203a28dee3d9473755fc2288bcaec9105e973e306071d28e69e593668c94b19fc1014104a85b7360b6b95459f7286111220f7a1eaef23bc9ced8a3b56cd57360374381bcabf7182941be400ccdfb761e26fa62d50b8911358aceb6aa30de9e8df5c46742"
},
如您所见,在 scriptsig 中 有两部分。 (公钥和签名。)但是,对于您的交易,之前的输出不是 pay-to-pubkeyhash,而是 pay-to-pubkey。这是之前92457dfc2831bdb6439fc03e72dbe3908140d43ec410f4a7396e3d65f5ab605b
的相关输出:
"scriptPubKey" : {
"asm" : "046a77fa46493d61985c1157a6e3e498b3b97c878c9c23e5b4729d354b574eb33a20c0483551308e2bd08295ce238e8ad09a7a2477732eb2e995a3e20455e9d137 OP_CHECKSIG",
"hex" : "41046a77fa46493d61985c1157a6e3e498b3b97c878c9c23e5b4729d354b574eb33a20c0483551308e2bd08295ce238e8ad09a7a2477732eb2e995a3e20455e9d137ac",
"reqSigs" : 1,
"type" : "pubkey",
"addresses" : [
"NCAzVGKq8JrsETxAkgw3MsDPinAEPwsTfn"
]
}
由于 pay-to-pubkey 脚本的性质,脚本 sig 不再包含公钥(仅包含签名)。我看不到仅从脚本 sig 中找到输入地址的方法。如果你想处理这些(罕见的)情况,你必须获取以前的输出并在那里查看。 (我对 ECDSA 的了解有限——也许有一种方法可以从签名中提取公钥。)
我一直在尝试使用一些 python 代码从 Namecoin 交易中提取输入地址。此代码适用于常规交易(其中一些名称币从一个地址转移到另一个地址);但是,这不适用于具有 name 操作的交易,例如 name_new。这是一些代码:
raw = namecoind.getrawtransaction(tx_hash)
data = namecoind.decoderawtransaction(raw)
if 'vin' in data:
inputs = data['vin']
for input in inputs:
input_value = input.get('value')
if 'scriptSig' in input:
script_sig_asm = str(input['scriptSig'].get('asm'))
script_sig_parts = script_sig_asm.split(' ')
if len(script_sig_parts) > 1 and (len(script_sig_parts[-1]) == 130
or len(script_sig_parts[-1]) == 66):
public_key_string = script_sig_parts[-1]
try:
recipient_address = NamecoinPublicKey(public_key_string, verify=False).address()
print recipient_address
except Exception, e:
print str(e)
return
elif len(script_sig_parts) == 1:
print "coinbase transaction input"
return
#print "Inputs:"
运行 此代码在常规交易中有效,即,我们获得收件人地址。但是 运行 这个名称操作的代码,例如 this 表明它是一个 coinbase 交易,即
len(script_sig_parts) == 1
为真,因此 recipient_address 为空。
谁能告诉我如何在涉及名称操作的 Namecoin 交易中获取收件人地址(在上述交易中为:NCAzVGKq8JrsETxAkgw3MsDPinAEPwsTfn)?
您的代码在大多数名称交易中应该可以正常工作(但我还没有测试过)。例如,如果您使用 499a1e4c7bb1388347e1bd1142425949971eaf1fa2521af625006f4f49ce85c5
(这是 d/domob
的最新更新),则输入的相关脚本签名是这样的:
"scriptSig" : {
"asm" : "3045022100c489ac648d08416d83d5e561d222049242242ded5f1c2bfd35ea48bb78b6a90f02203a28dee3d9473755fc2288bcaec9105e973e306071d28e69e593668c94b19fc101 04a85b7360b6b95459f7286111220f7a1eaef23bc9ced8a3b56cd57360374381bcabf7182941be400ccdfb761e26fa62d50b8911358aceb6aa30de9e8df5c46742",
"hex" : "483045022100c489ac648d08416d83d5e561d222049242242ded5f1c2bfd35ea48bb78b6a90f02203a28dee3d9473755fc2288bcaec9105e973e306071d28e69e593668c94b19fc1014104a85b7360b6b95459f7286111220f7a1eaef23bc9ced8a3b56cd57360374381bcabf7182941be400ccdfb761e26fa62d50b8911358aceb6aa30de9e8df5c46742"
},
如您所见,在 scriptsig 中 有两部分。 (公钥和签名。)但是,对于您的交易,之前的输出不是 pay-to-pubkeyhash,而是 pay-to-pubkey。这是之前92457dfc2831bdb6439fc03e72dbe3908140d43ec410f4a7396e3d65f5ab605b
的相关输出:
"scriptPubKey" : {
"asm" : "046a77fa46493d61985c1157a6e3e498b3b97c878c9c23e5b4729d354b574eb33a20c0483551308e2bd08295ce238e8ad09a7a2477732eb2e995a3e20455e9d137 OP_CHECKSIG",
"hex" : "41046a77fa46493d61985c1157a6e3e498b3b97c878c9c23e5b4729d354b574eb33a20c0483551308e2bd08295ce238e8ad09a7a2477732eb2e995a3e20455e9d137ac",
"reqSigs" : 1,
"type" : "pubkey",
"addresses" : [
"NCAzVGKq8JrsETxAkgw3MsDPinAEPwsTfn"
]
}
由于 pay-to-pubkey 脚本的性质,脚本 sig 不再包含公钥(仅包含签名)。我看不到仅从脚本 sig 中找到输入地址的方法。如果你想处理这些(罕见的)情况,你必须获取以前的输出并在那里查看。 (我对 ECDSA 的了解有限——也许有一种方法可以从签名中提取公钥。)