class Block{
constructor(timestamp, transactions, previousHash = ''){
this.timestamp = timestamp;
this.transactions = transactions;
this.previousHash = previousHash;
this.hash = this.calculateHash();
this.nonce = 0;
}
calculateHash(){
return SHA256(this.previousHash + JSON.stringify(this.transactions)
+ this.timestamp + this.nonce).toString();
}
mineBlock(difficulty){
while(this.hash.substring(0, difficulty) !== Array(difficulty +
1).join("0")){
this.nonce++;
this.hash = this.calculateHash();
}
console.log("Block mined: " + this.hash);
}
}
在上面的代码中,如何保证底层逻辑不会被人利用?我的意思是,要开采一个矿工,矿工必须
投资巨大的计算能力。如果s / he能够打破mineBlock()方法中的while循环,则可能不需要太多计算就可以挖掘一个块并使它被接受(前提是可以在所有验证器/矿工中操纵源代码(证明的工作和桩)。
提前致谢。
最佳答案
您不应该隐藏您的客户端代码,因为它会杀死区块链和去中心化技术本身。
只要51%的计算能力(如果有PoW共识)来自诚实节点,那么诸如比特币之类的技术就坚不可摧。
当超过51%的计算能力被破坏(恶意)时,分类帐就不安全。
正如许多最大化主义者可能会建议的那样,如果您打算建立自己的区块链,那么您应该重新使用已经编写并被认为是安全的代码,并逐步添加功能。
编写DLT不仅涉及编写无错误的代码(正如您在问题中所指出的,它不能用于破坏所有节点),而且还涉及无法利用的有效共识机制。
PoW代表工作证明。
DLT代表分布式分类帐技术(包括区块链,缠结等)
还要澄清一些我在这里看到的误解。
坚固性是一种用于在区块链内部编写智能合约的确定性语言(不是用于编码区块链本身的语言,而是用于区块链内部运行的软件的代码,例如:以太坊)
以太坊为例,它有不同的实现方式,其中最活跃的是葛斯(golang-ethereum)。正如我告诉您的那样,如果您想创建自己的区块链,则应该考虑重用已经被证明是可靠的代码。
回答:“新区块链容易遭受51%的攻击”(这主要困扰工作量证明共识区块链):是的,这是绝对正确的,新生的区块链(或哈希率低的区块链)往往会因租房而受到频繁攻击。 hashpower(请参阅最近发生的比特币私人案例或比特币黄金)。不幸的是,没有办法阻止这种情况的发生,因为这只是工作量证明共识的工作方式,要遏制它,唯一可以做的就是在考虑来自交易的资产可花费之前,您要等待更多的区块确认。
示例(名称是随机选择的):我有一家在线商店接受来自Bitcoin Weak的区块链的BTW(硬币),该区块链经常受到51%攻击的困扰,我要做的是,尽管客户交易已插入区块号(X)中,我等待直到区块编号(X + 100),然后才允许他在我的平台上花费这些钱。
我为什么要这样做?这是因为51%的攻击旨在重新创建两个链并在以后插入较长的链,从而删除较短的链(我在该平台上创建了用于在您的平台上购买的交易的链),因此等待时间越长的确认块我等待的金额就越多,黑客花费了51%的哈希率进行攻击。如果他的双重支出攻击包括花费100美元,但我强迫他花费101美元的电力(或算力租金),那么我不鼓励他攻击链条并尝试在平台上进行双重支出。
希望这可以澄清您的疑问。