如何保护源代码以免在区块链中被篡改?

时间:2018-10-23 17:00:30

标签: javascript blockchain ethereum solidity

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循环,则可能不需要太多计算就可以挖掘一个块并使它被接受(前提是可以在所有验证器/矿工中操纵源代码(证明的工作和桩)。 预先感谢。

2 个答案:

答案 0 :(得分:1)

您不应该隐藏您的客户端代码,因为它会杀死区块链和去中心化技术本身的局面。

只要有51%的计算能力(在PoW共识下)来自诚实节点,诸如比特币之类的技术就不会破坏。

当超过51%的计算能力被破坏(恶意)时,分类帐就不安全。

许多最大化主义者可能会建议,如果您打算建立自己的区块链,那么您应该重新使用已经编写并被认为是安全的代码,并逐步添加功能。

编写DLT不仅涉及编写无错误的代码(正如您在问题中所指出的,它不能用于破坏所有节点),而且还涉及无法利用的有效共识机制。

PoW代表工作证明。 DLT代表分布式分类帐技术(包括区块链,缠结等)

还要澄清一些我在这里看到的误解。

Solidity是用于在区块链内部编写智能合约的确定性语言(它不是用于编码区块链本身的语言,而是用于区块链内部运行的软件的代码,例如:以太坊)

以太坊为例,它有不同的实现方式,最活跃的是geth(golang-ethereum)。正如我告诉您的那样,如果您想创建自己的区块链,则应该考虑重用已经被证明是可靠的代码。

回答:“新区块链容易受到51%的攻击”(这主要困扰工作量证明共识区块链):是的,这是绝对正确的,新生的区块链(或哈希率低的区块链)往往会受到攻击。经常通过租用算力(请参阅最近发生的比特币私人案例或比特币黄金)。不幸的是,没有办法阻止这种情况的发生,因为这只是工作量证明共识的工作方式,唯一可以遏制这种情况的方法是,您需要等待更多的区块确认,然后再考虑来自交易的资产是否可花费。 >

示例(名称是随机选择的):我有一家在线商店接受来自比特币弱的区块链的BTW(硬币),该区块链经常受到51%攻击的困扰,我要做的是,尽管客户交易已插入区块编号(X )我一直等到区块编号(X + 100),然后才允许他在我的平台上花费这些钱。

我为什么要这样做?这是因为51%的攻击旨在重新创建两个链并随后插入较长的链,从而删除较短的链(我在其中创建了用于在您的平台上购买交易的那个链),因此等待时间越长的确认块我就越多,我花了更多的钱。黑客花费了51%的哈希率进行攻击。如果他的双花攻击是花费100美元,但我强迫他花101美元的电费(或算力租金),那么我不鼓励他攻击链条,并尝试在我的平台上花一倍。 / p>

希望这可以澄清您的疑问。

答案 1 :(得分:0)

  

可能不需要太多计算即可挖掘一个块并获得它   接受(只要源代码可以在所有   验证器/矿工(分别为工作证明和权益证明)机器

由于挖掘是一种单向算法,因此(当前)在没有解决方案的情况下,除非获得解决方案,否则就无法伪造解决方案。因此,您不能伪造工作证明。

但是,您提到如果可以在所有验证器上更改源代码,则它们可能会接受较低难度的解决方案。的确如此,但有几点要注意:

  1. 在没有任何人知道的情况下,很难修改所有验证器上的共识代码。首先,因为代码是开源的,并且可以验证构建。其次,许多分布在世界各地的不同网络上,运行不同的版本和操作系统,因此,这是任何软件/计算设备都应关注的问题。

  2. 但是,如果确实发生了这种情况,则可以修补共识代码,并且网络将通过丢弃违规后接受的所有无效块来恢复网络。

如果您建议修改所有矿工的代码:

  1. 与上面的#1相同的问题,只是不是所有的矿工软件都是开源的,并且有许多不同的挖掘软件实现。

  2. 所有矿工随后将以较低的难度提交块,并且难度调整算法将降低网络的难度,因为块的求解速度较慢。从共识规则验证了所有块之后,这将更难恢复,并且可能需要硬分叉。