Blockchain 工作证明的临时凭证如何确保区块中的有效交易记录?

Blockchain 工作证明的临时凭证如何确保区块中的有效交易记录?,blockchain,cryptocurrency,Blockchain,Cryptocurrency,我是区块链新手,在理解事物的同时学习用javascript实现它。我有一个问题,我试着寻找了很多,没有得到任何明确的解释 问题:假设我有3条事务记录和以前的块散列。我还发现了Nonce值。加起来,我在前面得到了所需的4'0散列。现在我读到的每一篇文章都说这证明了block的有效性。但是怎么做?!我的意思是,如果在找到散列之前,我(或某人)篡改了这3个事务。我可以再次找到一个4'0's的散列,但这次我更改了这3笔交易中的金额(使它们出错) 我们如何才能确保这些交易金额是合法的。考虑到这是最新的块,

我是区块链新手,在理解事物的同时学习用javascript实现它。我有一个问题,我试着寻找了很多,没有得到任何明确的解释

问题:假设我有3条事务记录和以前的块散列。我还发现了Nonce值。加起来,我在前面得到了所需的4'0散列。现在我读到的每一篇文章都说这证明了block的有效性。但是怎么做?!我的意思是,如果在找到散列之前,我(或某人)篡改了这3个事务。我可以再次找到一个4'0's的散列,但这次我更改了这3笔交易中的金额(使它们出错)

我们如何才能确保这些交易金额是合法的。考虑到这是最新的块,我关心这3个交易记录的有效性。 如果工作证明不能保证关键信息(交易记录),那么这又有什么意义呢。什么东西验证块中的事务记录没有错误?(矿商在向区块链添加区块之前,没有对其进行篡改)

JS中的工作证明和哈希块函数:

//散列单个块
Blockchain.prototype.hashBlock=函数(previousBlockHash、currentBlockData、nonce){
const dataAsString=previousBlockHash+
nonce.toString()+
stringify(currentBlockData);
常量散列=sha256(数据串);
返回散列;
};
//工作证明
Blockchain.prototype.proofwork=函数(previousBlockHash,currentBlockData){
设nonce=0;
让hash=this.hashBlock(previousBlockHash、currentBlockData、nonce);
while(hash.substr(0,4)!='0000'){
nonce++;
hash=this.hashBlock(previousBlockHash、currentBlockData、nonce);
//console.log(散列);
}
返回当前值;
};

交易记录本身由最初创建交易的一方进行数字签名。只有他/她具有生成事务的私钥。当您更改事务记录中的一个值时,数字签名将无效,因此事务本身将无效。您可以更改事务记录数据,但是其他节点不会接受此事务(或挖掘的块),因为它包含无效数据


检查交易记录本身是否有效与挖掘新区块所需的工作证明无关。

我将尝试给出一个简单的答案,因为理解解决方案不需要很多细节

首先,让我们看看事务由什么组成:

  • 交易数据:
    • 钱来自的地址
    • 钱要寄到的地址
    • 金额
  • 使用私钥创建的事务数据的签名
  • 您的公钥
  • 当你为人们创建一个汇款地址时,这个地址来自哪里?首先,创建一个公钥/私钥对。公钥/私钥对是加密的结果。你能用这些钥匙做什么很有趣。您可以使用私钥对邮件进行签名。如果您的朋友拥有您的公钥,他们可以验证签名是否对该消息有效,这意味着他们可以验证是您编写了该消息

    在区块链中,地址是公钥的sha256散列

    现在,当您需要转账时,您需要做两件事:

  • 表明您是该地址的所有者。您可以通过提供公钥来实现这一点。本例中的矿工可以散列您的公钥,以验证它是否会产生“发件人”地址
  • 确认您拥有私钥。您可以通过创建事务数据的签名来实现这一点
  • 如果矿工更改“收件人”地址、“发件人”地址或金额,则交易数据的签名不再有效

    如果矿工决定根据更改的数据添加新的签名,它将不再使用事务中的公钥进行验证

    如果矿工决定更改签名和公钥,使其匹配,那么“发件人”地址将不再正确,因为它是公钥的散列

    我遗漏了一些细节,如:

    • “发件人”地址指以前的交易
    • 上一笔交易中的金额需要完全支出。因此,如果里面有太多的内容,你将有第二个“收件人”地址,它在你的控制之下,基本上把其余的内容转移回你自己
    • 在一个事务中可以有多个“发件人”地址和“收件人”地址。每个“发件人”地址都需要公钥和签名
    • 该事务实际上包含一个脚本,说明如何验证地址和签名。如果您扩展该脚本中使用的语言,那么您正在谈论智能合约
    • 有一些私钥可以生成多个公钥,因此可以生成多个地址,因此您不必管理多个私钥
    • 无法验证“收件人”地址是否有效。所以你可以把钱转移到一个没有人有私钥的地址

    您可以在此处找到交易内容的复杂细节:

    谢谢,伙计,问题:其他节点如何检查交易的数字签名是否有效?@krupeshAnadkat,这取决于区块链/交易的实施和规范。在比特币区块链的情况下,如何检查,节点如何检查(我相信网络中的物理计算机)验证这些交易的数字签名?@krupeshAnadkat您可以阅读比特币脚本引擎如何用于验证交易的签名是否有效。谢谢:)很久以来我一直对此感到困惑。这真是一个很好的解释,我想在添加了您的答案之后,我所有的拼图都适合了:)