📜  什么是区块链分布式账本?(1)

📅  最后修改于: 2023-12-03 15:06:26.074000             🧑  作者: Mango

什么是区块链分布式账本?

区块链是一种去中心化的分布式账本技术,具有高度透明性、去信任化、不可篡改等特点。而分布式账本则是区块链中的核心结构,它记录着每一次交易的信息和状态。

区块链分布式账本由多个节点组成,每个节点维护一个完整的账本副本。当有新的交易发生时,这个交易会被所有节点接收并验证,然后加入一个新的区块中,该区块又会被广播给其他节点,每个节点都会将该区块添加到自己的账本中。

分布式账本中的每个区块包含着一个或多个交易记录和它们的状态,每个区块都有自己的哈希值和时间戳,每个区块还包含了指向前一个区块的引用,这样就形成了一个不可篡改的链式结构。

由于所有节点都有完整的账本副本,因此分布式账本具有高度的鲁棒性和容错性。即使一些节点发生故障或被攻击,其他节点仍可以维护账本的完整性和一致性。

在区块链中,每个用户都有一个公钥和一个私钥,公钥可以被用来接收加密货币,而私钥则用于签署该用户所发出的交易以及对其进行身份验证。

因此,区块链分布式账本是一种去中心化、安全、可靠、不可篡改的交易记录和状态存储方式,它为区块链技术提供了强大的支持和保障。

代码片段
class Blockchain:
    def __init__(self):
        self.chain = []
        self.current_transactions = []
        
        # 创建创世块
        self.new_block(proof=100, previous_hash=1)
        
    def new_block(self, proof, previous_hash=None):
        """
        生成新块
        :param proof: <int> 工作量证明算法提供的证明
        :param previous_hash: (Optional) <str> 前一个块的hash值
        :return: <dict> 新块
        """
        block = {'index': len(self.chain) + 1,
                 'timestamp': time(),
                 'transactions': self.current_transactions,
                 'proof': proof,
                 'previous_hash': previous_hash or self.hash(self.last_block)}
        # 重置当前交易记录
        self.current_transactions = []
        self.chain.append(block)
        return block
        
    def new_transaction(self, sender, recipient, amount):
        """
        生成新交易信息,信息将加入到下一个待挖的区块中
        :param sender: <str> 发送者地址
        :param recipient: <str> 接收者地址
        :param amount: <int> 金额
        :return: <int> 本次交易的区块索引
        """
        self.current_transactions.append({'sender': sender,
                                           'recipient': recipient,
                                           'amount': amount})
        return self.last_block['index'] + 1
        
    @staticmethod
    def hash(block):
        """
        生成块的 SHA-256 hash值
        :param block: <dict> 块
        :return: <str>
        """

        # 对块排序并转化为字符串
        block_string = json.dumps(block, sort_keys=True).encode()

        # 返回其 SHA-256 值
        return hashlib.sha256(block_string).hexdigest()

    @property
    def last_block(self):
        #返回链中的最后一个块
        return self.chain[-1]