我想验证采矿奖励交易实际上是有效的,并且是由系统启动的。当前,我不知道如何在没有对公共和私有密钥进行硬编码的情况下验证系统的身份,这又是不安全的
目前,我正在使用椭圆生成密钥并进行验证。
valid() {
if (this.from === null) {
return true;
}
if (!this.signature || this.signature.length === 0) {
console.log('No signature on this transaction!\n');
return false;
}
if (typeof this.amount !== 'number' || this.amount <= 0) {
console.log('Amount must be a positive number\n');
return false;
}
const publicKey = ec.keyFromPublic(this.from, "hex");
return publicKey.verify(this.hash(), this.signature)
}
现在,如果“发件人”地址为空(表示这是采矿奖励),则交易自动为true。但是,某人可以简单地给发自地址“ null”,然后从本质上给自己钱。
我将如何验证挖矿奖励的正确性,并且仅当挖矿确实完成时才从系统中获取。
答案 0 :(得分:0)
这取决于采矿奖励的支付方式。在基于帐户的模型中,可以根据挖掘奖励来增加标头中包含的矿工的余额。世界状态不匹配将导致块被拒绝,以确保系统相应地增加余额。 在UTXO模型中,一种方法是让矿工自己签署空交易。这将验证他们是否控制了“收件人”地址的私钥,但是实际上并不是必需的。 这一切都取决于系统的约束。在比特币中,coinbase交易的规则是它应该是该区块中的第一笔交易,并且输出utxo包含的金额等于当前采矿奖励+该区块中包含的费用。根据BIP 34,币库还应将当前区块高度作为其数据的一部分。有关比特币中币库交易的更多信息,请参见this。