来自工作量证明的随机数如何确保块中的有效交易记录?
How a nonce from proof of work ensures valid transaction records in block?
我是区块链新手,正在学习在 javascript 中实现它,同时了解事物。我有一个问题,我试着搜索了很多,没有得到任何明确的解释。
问题:假设我有 3 个交易记录和前一个区块哈希。我还发现了 Nonce 值。结合起来,我在前面得到了所需的 4'0' 的散列。现在我到处读到,它说这证明了块的有效性。但是怎么办?!我的意思是,如果在找到哈希之前,我(或某人)篡改了这 3 个交易怎么办。我可以再次找到一个包含 4 个“0”的哈希值,但这次我更改了这 3 笔交易中的 AMOUNT(使它们出错)。
我们如何确定这些交易金额是合法的。考虑到这是最新的区块,我担心这 3 个交易记录的有效性。
如果工作量证明不能保证关键信息(交易记录),那么它的意义何在。什么东西可以验证区块中的那些交易记录没有错误? (在将块添加到区块链之前,矿工没有篡改它们)
JS 中的工作证明和哈希块函数:
// Hashing Single Block
Blockchain.prototype.hashBlock = function(previousBlockHash, currentBlockData, nonce){
const dataAsString = previousBlockHash +
nonce.toString() +
JSON.stringify(currentBlockData);
const hash = sha256(dataAsString);
return hash;
};
// Proof of Work
Blockchain.prototype.proofOfWork = function(previousBlockHash, currentBlockData){
let nonce = 0;
let hash = this.hashBlock(previousBlockHash, currentBlockData, nonce);
while(hash.substr(0, 4) !== '0000'){
nonce++;
hash = this.hashBlock(previousBlockHash, currentBlockData, nonce);
// console.log(hash);
}
return nonce;
};
交易记录本身由最初创建交易的一方进行数字签名。只有 he/she 拥有生成交易的私钥。当您更改交易记录中的一个值时,数字签名将失效,因此交易本身也将失效。您可以更改交易记录数据,但其他节点将不会接受此交易(或已开采的区块),因为它包含无效数据。
此检查交易记录本身是否有效与您为挖掘新区块而必须做的工作证明无关。
我将尝试给出一个简化的答案,因为有很多细节不需要理解该解决方案。
首先,让我们看一下交易由什么组成:
- 交易数据:
- 钱的来源地址
- 钱去的地址
- 金额
- 使用您的私钥创建的交易数据的签名
- 你的 public 密钥
当您创建一个地址供人们转账时,这个地址来自哪里?首先,您创建一个 public/private 密钥对。 public/private 密钥对是 some complicated mathematics 的结果。你可以用这些键做什么很有趣。您可以使用您的私钥签署消息。如果您的朋友有您的 public 密钥,他们可以验证该消息的签名是否有效,这意味着他们可以验证该消息是您写的。
在区块链中,地址是 public 密钥的 sha256 哈希值。
现在转账时,您需要做两件事:
- 表明您是该地址的所有者。您可以通过提供 public 键来做到这一点。在这种情况下,矿工可以对您的 public 密钥进行哈希处理,以验证它是否会产生 'from' 地址。
- 确认您拥有私钥。您可以通过创建交易数据的签名来做到这一点。
如果矿工更改了'to'地址、'from'地址或金额,交易数据的签名将不再有效。
如果矿工决定根据更改后的数据添加新签名,它将不再使用交易中的 public 密钥进行验证。
如果矿工决定更改签名和 public 以便它们匹配,那么 'from' 地址将不再正确,因为它是 [=82= 的哈希值]键。
我遗漏了一些细节,例如:
- 一个'from'地址指的是之前的交易
- 上一笔交易的金额需要全部花完。所以如果里面太多了,你会有第二个'to'地址在你的控制之下,基本上把剩下的转回给你自己
- 一笔交易中可以有多个'from'个地址和'to'个地址。每个 'from' 地址都需要一个 public 密钥和签名。
- 该交易实际上包含一个说明如何验证地址和签名的脚本。如果扩展该脚本中使用的语言,那么您就是在谈论智能合约。
- 有私钥可以生成多个public个密钥,因此可以生成多个地址,因此您不必管理多个私钥。
- 无法验证 'to' 地址是否有效。因此,您可以将钱转移到一个没有人拥有私钥的地址。
您可以在此处找到交易内容的复杂细节:https://en.bitcoin.it/wiki/Transaction
我是区块链新手,正在学习在 javascript 中实现它,同时了解事物。我有一个问题,我试着搜索了很多,没有得到任何明确的解释。
问题:假设我有 3 个交易记录和前一个区块哈希。我还发现了 Nonce 值。结合起来,我在前面得到了所需的 4'0' 的散列。现在我到处读到,它说这证明了块的有效性。但是怎么办?!我的意思是,如果在找到哈希之前,我(或某人)篡改了这 3 个交易怎么办。我可以再次找到一个包含 4 个“0”的哈希值,但这次我更改了这 3 笔交易中的 AMOUNT(使它们出错)。
我们如何确定这些交易金额是合法的。考虑到这是最新的区块,我担心这 3 个交易记录的有效性。
如果工作量证明不能保证关键信息(交易记录),那么它的意义何在。什么东西可以验证区块中的那些交易记录没有错误? (在将块添加到区块链之前,矿工没有篡改它们)
JS 中的工作证明和哈希块函数:
// Hashing Single Block
Blockchain.prototype.hashBlock = function(previousBlockHash, currentBlockData, nonce){
const dataAsString = previousBlockHash +
nonce.toString() +
JSON.stringify(currentBlockData);
const hash = sha256(dataAsString);
return hash;
};
// Proof of Work
Blockchain.prototype.proofOfWork = function(previousBlockHash, currentBlockData){
let nonce = 0;
let hash = this.hashBlock(previousBlockHash, currentBlockData, nonce);
while(hash.substr(0, 4) !== '0000'){
nonce++;
hash = this.hashBlock(previousBlockHash, currentBlockData, nonce);
// console.log(hash);
}
return nonce;
};
交易记录本身由最初创建交易的一方进行数字签名。只有 he/she 拥有生成交易的私钥。当您更改交易记录中的一个值时,数字签名将失效,因此交易本身也将失效。您可以更改交易记录数据,但其他节点将不会接受此交易(或已开采的区块),因为它包含无效数据。
此检查交易记录本身是否有效与您为挖掘新区块而必须做的工作证明无关。
我将尝试给出一个简化的答案,因为有很多细节不需要理解该解决方案。
首先,让我们看一下交易由什么组成:
- 交易数据:
- 钱的来源地址
- 钱去的地址
- 金额
- 使用您的私钥创建的交易数据的签名
- 你的 public 密钥
当您创建一个地址供人们转账时,这个地址来自哪里?首先,您创建一个 public/private 密钥对。 public/private 密钥对是 some complicated mathematics 的结果。你可以用这些键做什么很有趣。您可以使用您的私钥签署消息。如果您的朋友有您的 public 密钥,他们可以验证该消息的签名是否有效,这意味着他们可以验证该消息是您写的。
在区块链中,地址是 public 密钥的 sha256 哈希值。
现在转账时,您需要做两件事:
- 表明您是该地址的所有者。您可以通过提供 public 键来做到这一点。在这种情况下,矿工可以对您的 public 密钥进行哈希处理,以验证它是否会产生 'from' 地址。
- 确认您拥有私钥。您可以通过创建交易数据的签名来做到这一点。
如果矿工更改了'to'地址、'from'地址或金额,交易数据的签名将不再有效。
如果矿工决定根据更改后的数据添加新签名,它将不再使用交易中的 public 密钥进行验证。
如果矿工决定更改签名和 public 以便它们匹配,那么 'from' 地址将不再正确,因为它是 [=82= 的哈希值]键。
我遗漏了一些细节,例如:
- 一个'from'地址指的是之前的交易
- 上一笔交易的金额需要全部花完。所以如果里面太多了,你会有第二个'to'地址在你的控制之下,基本上把剩下的转回给你自己
- 一笔交易中可以有多个'from'个地址和'to'个地址。每个 'from' 地址都需要一个 public 密钥和签名。
- 该交易实际上包含一个说明如何验证地址和签名的脚本。如果扩展该脚本中使用的语言,那么您就是在谈论智能合约。
- 有私钥可以生成多个public个密钥,因此可以生成多个地址,因此您不必管理多个私钥。
- 无法验证 'to' 地址是否有效。因此,您可以将钱转移到一个没有人拥有私钥的地址。
您可以在此处找到交易内容的复杂细节:https://en.bitcoin.it/wiki/Transaction