tl;dr 如何使用最基本的python工具执行Hash160?在
=======================================================
嗨
我想弄清楚比特币交易是如何运作的。在
当我为一个新的发送选择输入时,我要确保它们属于一个特定的地址。但是,现有的txs不指定以前输出的地址,而是指定包含地址的哈希。在
例如:
>> bx fetch-tx 11a1b7ac0a65bd50b7094c720aecd77cfd83d84b1707960fd00dd82a888aab5c --config /home/theo/Desktop/bx-testnet.cfg
{
hash 11a1b7ac0a65bd50b7094c720aecd77cfd83d84b1707960fd00dd82a888aab5c
inputs
{
input
{
address_hash f3b7278583827a049d6be894bf7f516178a0c8e6
previous_output
{
hash 4a3532061d43086299ae9b2409a456bb9638dff32e0858c4ccda27203fb2e4f6
index 1
}
script "[30440220146b8b5b014245a9e27e21122d4dded04c3f39c3a49ac2494743d6f6ae8efff602206d417a4be9c7431ea69699132438510ade1cf8d746607f77d114907762ed1eb301] [023dd2e892290e41bb78efce6ea30a97015ef13eaaa9ebb7b0514485fc365cc391]"
sequence 4294967295
}
}
lock_time 0
outputs
{
output
{
address_hash a73706385fffbf18855f2aee2a6168f29dbb597e
script "dup hash160 [a73706385fffbf18855f2aee2a6168f29dbb597e] equalverify checksig"
value 130000000
}
output
{
address_hash ad6e80394af99ece5d7701bf2f457480b93965b7
script "dup hash160 [ad6e80394af99ece5d7701bf2f457480b93965b7] equalverify checksig"
value 49525957813
}
}
version 1
}
例如,我想检查哪些输出可以从地址mvm74FACaagz94rjWbNmW2EmhJdmEGcxpa
发送
所以我用Python中的Hash160:
这不是我期望的结果:a73706385fffbf18855f2aee2a6168f29dbb597e
同时,this在线服务正确计算哈希值。在
如何在Python中哈希160比特币地址?在
看起来你在独自完成这项工作时遇到了很多麻烦,而且我认为你的解决方案在性能方面不会有效率。在
你所遵循的逻辑是正确的,但是如果你知道有一个包可以在base58中解码和编码,它被称为base58,那么事情就可以做得更好
下面是获取以base58编码的比特币地址的ripemd160散列的简单方法(python 2.7):
^{pr2}$注意decod_检查用于考虑校验和,而[2:]用于去除零
我终于成功了。 我的回答中的一些启示对你来说可能是显而易见的和基本的,但我希望它们能对比特币全新的ppl(比如我)有所帮助。在
=======
Wiki表示我可以通过颠倒地址生成的最后一步来获得Hash160
(Hash160高亮显示)
这一步是用base58字母对字节串进行编码
这个字母表缺少0,I,l,O,因为这些符号很容易混淆。当一个错误的符号可能会导致一大笔钱的损失时,这是你最不想做的事情。在
因此,我们需要将
mvm74FACaagz94rjWbNmW2EmhJdmEGcxpa
转换为字节字符串。字节采用十六进制格式,范围从0x00
(0十进制)到0xff
(255十进制)。 请注意,我们有一个特殊的b58字母表要处理:用utf-8或其他编码标准解码地址将产生无意义的结果。在一开始我以为用这个函数可以很容易地解码地址:
^{pr2}$但结果与我在事务中查找的哈希值不同(
a73706385fffbf18855f2aee2a6168f29dbb597e
)。这样我才知道我不知道解码是怎么完成的。如果Hash160有0xff
怎么办?b58中没有这样的符号,因为十六进制中的58只是0x3a
。在解码b58时,我们不能独立地处理每个符号。整个地址组成一个用base58数字系统书写的巨大数字(它的第一个数字对应于58**34)。在为了得到字节串,我首先把这个数字转换成十进制,然后才转换成字节串。在
如果你知道如何避免这种迂回,直接获取字节,请评论
这个输出看起来有点像我需要的(
a7370638...
),但是有太多的零。不要看第一个字节(6f
)不匹配:它与我们需要的Hash160无关,只是协议版本。在这很可能是一个精度错误。为了解决这个问题,我使用了
mpmath
,它允许您精确地操作整数。在应用精确的模运算,最终得到Hash160。只需确保你删减了第一个和最后4个字节的胖手指检查。在
耶!就像在交易中一样!在
相关问题 更多 >
编程相关推荐