分散应用程序(区块链)在哪里存储数据?

时间:2018-02-07 09:12:46

标签: database blockchain

随着加密热潮的兴起,我一直在阅读并知道所有加密数据库都是基于一种叫做区块链的东西。我知道区块链是什么以及它是如何工作的,但所有这些分散数据在哪里以及如何存储?

4 个答案:

答案 0 :(得分:0)

不同的区块链实现可能在每个节点需要多少数据方面才能在网络上活动,但在最常见/最简单的情况下,区块链网络的每个节点都存储区块链的完整副本 - 以及其中的所有数据 - 本地。

答案 1 :(得分:0)

去中心化单词本身解释了数据未存储在某个特定位置 它存储数据在各个地方,对于区块链,这些地方都是节点 在网络中,这些节点仅是您的计算机(如果您连接到网络)。每个人都具有本地数据副本。

答案 2 :(得分:0)

您可以将区块链视为一种数据结构,它可以与仅具有仅附加架构的数据库相关。由于其类似于账本系统,因此区块链可以记录事物,但是您不能对这些记录使用UPDATE或Delete之类的方法。您所能做的就是添加新记录,并使之前的记录过时。

作为一个简单示例,

今天,区块链设计了

这样的块

数据01 +数据02 +数据03 + .... +数据n

数据01-变量x = 20具有一些值

如果您想更改此变量,请添加一条新记录

数据101-现在变量x = 10 或

数据101-(x-10)刚发生。

Dara存储空间: 进入区块链的所有数据(在网络节点达成共识之后)将被添加到区块链,然后在所有节点之间分配。

当您考虑使用区块链作为数据库时,您必须确定其是否适合您的解决方案,并找到与区块链背后的技术兼容的最佳架构。

这是我写的两篇文章,将对它的实际工作原理有所提示。 希望对您有所帮助,

Blockchain — a simple explanation (linkedin) / (Medium)

How the actual blockchain works : what goes in to a block? is it incorruptible? - a simple explanation (Linkedin) / (Medium)

答案 3 :(得分:0)

这是一个很酷的问题。我认为您的意思是在区块链中存储数据的位置。区块链使用键值来存储数据。关键是哈希码。就像将事务添加到新块时一样。这将是sha256(sha256(translation raw))的两倍,这是一个密钥(不要忘记一个Block包含数千个事务),新的block将存储到LevelDB(http://leveldb.org)中。 LeveDB是一个轻量级的单用途库,具有与许多平台的绑定。这是一个嵌入式数据库,因此区块链使用levelDB保留数据。

您的比特币来源: https://github.com/bitcoin/bitcoin

https://github.com/bitcoin/bitcoin/blob/master/doc/release-notes/release-notes-0.8.0.md

LevelDB, a fast, open-source, non-relational database from Google, is
now used to store transactions and block indices.  LevelDB works much better
on machines with slow I/O and is faster in general. Berkeley DB is now only
used for the wallet.dat file (public and private wallet keys and transactions
relevant to you).

我创建了一个项目来解释它。

https://github.com/tomgtqq/Private-Blockchain-Leveldb

/* ===== Persist data with LevelDB ==================
|  Learn more: level: https://github.com/Level/level |
/===================================================*/

const level = require('level');
const chainDB = './chaindata';

class LevelSandbox {

    constructor() {
        this.db = level(chainDB);
    }

    // Get data from levelDB with key (Promise)
    getLevelDBData(key){
        let self = this;
        return new Promise(function(resolve, reject) {
            self.db.get(key, (err, value) => {
                if(err){
                    if (err.type == 'NotFoundError') {
                        resolve(undefined);  //@cool if NotFoundError 
                    }else {
                        reject(err);
                    }
                }else {
                    resolve(value);
                }       
            });
        });
    }

    // Get All Blocks in DB
    getAllBlocks(){
        let self = this;
        let dataArray = [];
        return new Promise(function(resolve, reject){
            self.db.createReadStream().on('data', function(chunk){
                dataArray.push(chunk);
            }).on('error', function(err){
                reject(error);
            }).on('close', function(){
                resolve(JSON.stringify(dataArray).toString());
            });
        });
    }

    // Add data to levelDB with key and value (Promise)
    addLevelDBData(key, value) {
        let self = this;
        return new Promise(function(resolve, reject) {
            self.db.put(key, value, function(err) {
                if (err) {
                    reject(err);
                }
                resolve(value);
            });
        });
    }

    // Method that return the height
    getBlocksCount() {
        let self = this;
        return new Promise(function(resolve, reject){
            let count = 0;
            self.db.createReadStream().on('data', function(chunk){
                count++;
            }).on('error', function(err){
                reject(error);
            }).on('close', function(){
                resolve(count - 1);
            });
        });
    }


}

module.exports.LevelSandbox = LevelSandbox;