【问题标题】:Blockchain tutorials for double spending and signature verification双花和签名验证的区块链教程
【发布时间】:2026-02-18 13:30:02
【问题描述】:

我一直在从基础学习区块链,并逐行研究TPCoin python代码。 在查看代码时,我发现没有验证方法可以防止双花问题或拒绝签名无效的交易请求。

我正在研究以下文章: https://morioh.com/p/7bfc126c22c2

class Transaction:

    def __init__( self, sender, recipient, value ):
        self.sender = sender 
        self.recipient = recipient 
        self.value = value
        self.time = datetime.datetime.now()
        self.signer = ""
    
    def to_dict( self ):

        if self.sender == "Genesis":
            identity = "Genesis"
        else:
            identity = self.sender.identity

        return collections.OrderedDict( { 'sender': identity, 'recipient': self.recipient, 'value': self.value, 'time' : self.time } )

    def sign_transaction( self ):

        private_key = self.sender._private_key
        signer = PKCS1_v1_5.new( private_key )
        h = SHA.new( str( self.to_dict( ) ).encode( 'utf8' ) )
        self.signer = binascii.hexlify( signer.sign( h ) ).decode( 'ascii' )
        return self.signer

    def display_transaction( self ):
        dict = self.to_dict( )
        print ("sender: " + dict['sender'])
        print ('-----')
        print ("recipient: " + dict['recipient'])
        print ('-----')
        print ("value: " + str(dict['value']))
        print ('-----')
        print ("time: " + str(dict['time']))
        print ('-----')
        print ("signature: " + self.signer)
        print ('-----')

    def validate_transaction( self ):
        ### Double spending? Signature Verification?
        return

我认为 Transaction 类中应该有一种验证功能......但是 不太确定该怎么做。 我希望看到一些关于如何处理这个问题的绝妙想法。

【问题讨论】:

    标签: python blockchain bitcoin


    【解决方案1】:

    从技术上讲,您可以根据需要多次“尝试花费”硬币。但是,只能将一笔交易添加到区块中,其他交易将被拒绝。剩余的交易也不能添加到新的区块中,因为输出不再是 UTXO。

    棘手的部分是当两个不同的矿工从同一输出中获取两个不同的交易并且存在网络延迟时,他们都将块添加到自己的链中。此时,您需要查看最长链概念并了解孤立链、为什么我们要开始确认、工作量证明等。

    【讨论】: