区块链简述

区块链结构


第一步是要决定你的区块链结构当你要写自己的区块链时,为了使事情尽量简化,我把最重要的几个列举出来, 索引,数据,哈希,之前的哈希和时间戳。

1_pbyFH4U5sO27UE1EjnImoA.png

class Block{

    constructor(index, previousHash, timestamp, hash){

        this.index = index;

        this.previousHash = previouslyHash.toString();

        this.timestamp = timstamp;

        this.data = data;

        this.hash = hash.toString();

    }

}

区块链的哈希


区块需要用哈希来保证数据的完整, SHA-256可以用来接管区块的内容, 你要知道的是这个哈希和挖矿无关, 因为他并没有相关的问题被解决。


var calculateHash = (index, previsouHash, timestamp, data) => {

    return CryptoJS.SHA256(index + previsouHash + timestamp + data).toString()

};

生成一个区块


要生成一个区块我们必须知道之前的哈希然后创建一些必须的内容,比如索引,哈希,数据和时间戳。区块的内容是由最终的用户提供的。


var generateNextBlock = (blockData) => {

  var previsouBlock = getLastBlock();

  var nextIndex = previsouBlock.index + 1;

  var nextTimestamp = new Date().getTime() / 1000;

  var nextHash = calculateHash(nextIndex, previousBlock.hash, nextTimestamp, blockData);

  return new Block(nextIndex, previousBlock.hash, nextTimestamp, blockData, nextHash);

}

存储区块


JS的数组可以用来存储区块链, 一个区块链的区块经常被叫做起源区块。


var getGenesisBlock = () => {

  return new Block(0,"0", 1465154705, "my genesis block!!", "816534932c2b7154836da6afc367695e6337db8a921823784c14378abed4f7d7" );

};

var blockChain = [getGenesisBlock()];

证明区块的有效性


在任何情况下我们都要证明是否一个区块链是有效的在保存方面。特别是在当我们接收到一个新的区块在其他的节点, 我们必须决定要不要接受他们。


var isValidNewBlock = (newBlock, previousBlock) => {

  if(previousBlock.index + 1 !== newBlock.index) {

    console.log('invalid index');

    return false;

  }

  else if (previousBlock.hash !== newBlock.previsousHash) {

    console.log('invalid previsousHash');

    return false;

  }

  else if (calculateHashForBlock(newBlock) !== newBlock.hash) {

    console.log('invalid hash': calculateHashForBlock(newBlock) + '' + newBlock.hash);

      return false;

  }

  return true;

};

选择最长的链


在指定的时间里面必须只能有一个区块在区块链内部。 为了防止冲突,我们选择有最多区块的链。

1_KM7WYPiZwxyfDL6Eb66QIg.png

var replaceChain = (newBlocks) => {

  if (isValidNewBlock(newBlocks) && newBlocks.length > blockChain.length) {

    console.log('Received blockChain is vaild')

    blockChain = new Blocks;

    broadcast(responseLatestMsg());

  } else {

    console.log('received blockchain invaild');

  }

}

和其他节点的交流


一个节点很重要的部分就是和区块链里面其他的节点分享和同步。下面的规则就是为了使区块链网络保持同步。

  • 当一个节点产生一个新的区块, 他会把信息传播到网络内部

  • 当一个节点和另一个节点连接,他会询问他的最近的区块

  • 当一个节点遇到一个区块他的索引大于目前已知的区块, 他会把这个区块加到目前的区块链上或者询问区块链

12074731-dfd3e68e4dfb3e79.png

控制节点


用户必须要用某些方法控制区块。 这可以设置一个HTTP 服务器来实现。


var initHttpServer = () => {

  var app = express();

  app.use(bodyParser.json());

  app.get('/block', (req, res) => res.send(JSON.stringify(blockchain)));

  app.post('/mineBlock', (req,res) => {

    var newBlock = generateNextBlock(req.body.data);

    addBlock(newBlock);

    broadcast(responseLatestMsg());

    console.log('block added: ' + JSON.stringify(newBlock));

    res.send();

  });

  app.get('/peers', (res, req) => {

    res.send(socket.map(s => s._socket.remoteAddress + ':' + s._socket.remotePort

  });

  app.post('/addPeer', (res, req) => {

    connetToPeers([req.body.peer]);

    res.send();

  });

  app.listen(http_port, () => console.log('listening http on port: ' + http_port));

};

从上可以看出, 用户可以和其他节点进行交流用以下的几种方式“

-列出所有的区块

-用用户给出的内容创建一个新的区块

-列出或者添加其他的节点

最直接的方式来控制节点可以用Curl:


#get all blocks from the node

curl http://localhost:3001/blocks

结尾


一般来说, 节点实际上会暴露在2个服务器上, 一个是给来控制节点的也就是HTTP 服务器, 另一个是是给他们节点之间交流的也就是 Websocket HTTP 服务器。


Capture.PNG

这个博客只是简单的介绍了区块链的原则和实现,具体的挖矿算法参考 PoS or PoW.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容

  • 一、快速术语检索 比特币地址:(例如:1DSrfJdB2AnWaFNgSbv3MZC2m74996JafV)由一串...
    不如假如阅读 15,950评论 4 87
  • 1 货币的演变——从贝壳到比特币 当社会分工产生之后,人类就产生了商品交换的需求。在货币被发明之前,人类是以以物换...
    longlee阅读 7,630评论 1 23
  • 七律 清明 明灭稀光烽火连,星河泻地墨蛾旋。 愁云洒泪迷茫野,苦气飘歌响逝川。 意乱才知天地远,梦残始解死生煎。 ...
    冬日之阳阅读 440评论 2 2
  • 今天看到一条朋友圈,差点把我看哭。 写的是作者一个认识十年的朋友。 刚好他们两个我都认识。对作者,我比他那个十年的...
    我喝冰阔乐不头痛阅读 322评论 0 0
  • 今天预备上网买卫浴喷头,几经挑选最后纠结于九牧36827和箭牌AE3310B之间,二者皆是国产卫浴的领导品牌...
    陌白Carl阅读 110评论 0 1