区块链尝试向Transaction字典添加键/值以创建区块链

2024-09-27 21:29:13 发布

您现在位置:Python中文网/ 问答频道 /正文

快速问题在我的代码中,我从第14-21行生成了一个关键错误。当我试图在事务字典中插入输入函数时,我收到一个键错误。我的问题是,如何将这些值插入我的字典以创建区块链?我的目标是引入一个while循环,将块放在区块链上。对于每个块的数据元素,我必须制作一个包含以下键\值的字典:发送方、接收方、货币\金额。在我从用户输入中收集这些值之后。我的while循环应该一直请求值,直到它被告知停止。一旦我收集了我所有的价值观,我必须验证区块链以确保它是好的

import hashlib
import json
from time import time 

class Block():
    def __init__(self, nonce, tstamp, transaction, prevhash=''):
        self.nonce = nonce
        self.tstamp = time()
        self.transaction = {}
        self.prevhash = prevhash
        self.hash = self.calhash()
        self.chain = []
        
        while True:
            self.sender = input("Sender:\n")
            self.transaction[self.sender]
            self.reciever = input("Receiver\n")
            self.transaction[self.reciever]
            self.amount = input("money_amt: \n")
            self.transaction[self.amount]
            break

    def calhash(self):
        block_string = json.dumps({"nonce": self.nonce, " tstamp": self.tstamp, " transaction": self.transaction, " prevhash": self.prevhash}, sort_keys=True).encode()
        return hashlib.sha256(block_string).hexdigest()

    def __str__(self):
        string= " nonce:" + " " + str(self.nonce) + "\n"
        string += " tstamp:" + " " + str(self.tstamp) + "\n"
        string += " transaction:" + " " + str(self.transaction) + "\n"
        string += " prevhash:" + " " + str(self.prevhash) + "\n"
        string += " hash:" + " " + str(self.hash) + "\n"

        return string 

    def printHashes(self):
        print("prevhash", self.prevhash)
        print("hash", self.hash)


class Blockchain():
    def __init__(self):
        self.chain=[self.generateGenesisBlock(),]
        
    def generateGenesisBlock(self):
        return Block(0, "" ," ", " ")

    def getLastBlock(self):
        return self.chain[-1]

    def addBlock(self, new_block):
        new_block.prevhash=self.getLastBlock().hash
        new_block.hash=new_block.calhash()
        self.chain.append(new_block)

    def isChainValid(self):
        for i in range(1, len(self.chain)):
            prevb=self.chain[i-1]
            currb=self.chain[i]
            if(currb.hash != currb.calhash()):
                print("invalid block")
                return False
            if(currb.prevhash != prevb.hash):
                print("invalid chain")
                return False
            return True


BTC = Blockchain()
BTC.addBlock(Block(1, " ", "Sender: Luke Reciepent: James Amount: 220", " "))

for b in BTC.chain:
    print(b)
print(BTC.isChainValid())

Tags: selfchainnewstringreturndefhashblock
1条回答
网友
1楼 · 发布于 2024-09-27 21:29:13

我对python比较新,但在阅读您的错误时,我想到了一个解决方案,即使用.get()方法返回在指定键处找到的值或默认值。因此,对于您的具体问题:

    while True:
        self.sender = input("Sender:\n")
        self.transaction.get(self.sender)
        self.reciever = input("Receiver\n")
        self.transaction.get(self.reciever)
        self.amount = input("money_amt: \n")
        self.transaction.get(self.amount)
        break

相关问题 更多 >

    热门问题