};
vargenerateNextBlock= (blockData)=> {
varpreviousBlock= getLatestBlock();
varnextIndex= previousBlock.index+ 1;
varnextTimestamp= newDate().getTime()/ 1000;
varnextHash= calculateHash(nextIndex,previousBlock.hash,nextTimestamp,blockData);
returnnewBlock(nextIndex,previousBlock.hash,nextTimestamp,blockData,nextHash);
};
块的存储
内存中的Java数组被用于存储区块链。区块链的第一个块通常被称为“起源块”,是硬编码的。
vargetGenesisBlock= ()=> {
returnnewBlock(0,"0",1465154705,"my genesis block!!","816534932c2b7154836da6afc367695e6337db8a921823784c14378abed4f7d7");
};
varblockchain= [getGenesisBlock()];
vargetGenesisBlock= ()=> {
returnnewBlock(0,"0",1465154705,"my genesis block!!","816534932c2b7154836da6afc367695e6337db8a921823784c14378abed4f7d7");
};
varblockchain= [getGenesisBlock()];
确认块的完整性
在任何时候都必须能确认一个区块或者一整条链的区块是否完整。在我们从其他节点接收到新的区块,并需要决定接受或拒绝它们时,这一点尤为重要。
varisValidNewBlock= (newBlock,previousBlock)=> {
if(previousBlock.index+ 1!== newBlock.index){
console.log('invalid index');
returnfalse;
}elseif(previousBlock.hash!== newBlock.previousHash){
console.log('invalid previoushash');
returnfalse;
}elseif(calculateHashForBlock(newBlock)!== newBlock.hash){
console.log('invalid hash: '+ calculateHashForBlock(newBlock)+ ' '+ newBlock.hash);
returnfalse;
}
returntrue;
};
varisValidNewBlock= (newBlock,previousBlock)=> {
if(previousBlock.index+ 1!== newBlock.index){
console.log('invalid index');
returnfalse;
}elseif(previousBlock.hash!== newBlock.previousHash){
console.log('invalid previoushash');
returnfalse;
}elseif(calculateHashForBlock(newBlock)!== newBlock.hash){
console.log('invalid hash: '+ calculateHashForBlock(newBlock)+ ' '+ newBlock.hash);
returnfalse;
}
returntrue;
};
任何时候在链中都应该只有一组明确的块。万一冲突了(例如:两个结点都生成了72号块时),会选择有最大数目的块的链。
varreplaceChain= (newBlocks)=> {
if(isValidChain(newBlocks)&& newBlocks.length> blockchain.length){
console.log('Received blockchain is valid. Replacing current blockchain with received blockchain');
blockchain= newBlocks;
broadcast(responseLatestMsg());
}else{
console.log('Received blockchain invalid');
}
};
varreplaceChain= (newBlocks)=> {
if(isValidChain(newBlocks)&& newBlocks.length> blockchain.length){
console.log('Received blockchain is valid. Replacing current blockchain with received blockchain');
blockchain= newBlocks;
broadcast(responseLatestMsg());
}else{
console.log('Received blockchain invalid');
}
};
结点的本质是和其他结点共享和同步区块链,下面的规则能保证网络同步。
当一个结点生成一个新块时,它会在网络上散布这个块。
当一个节点连接新peer时,它会查询最新的block。
当一个结点遇到一个块,其index大于当前所有块的index时,它会添加这个块到它当前的链中,或者到整个区块链中查询这个块。
当一个结点生成一个新块时,它会在网络上散布这个块。
当一个节点连接新peer时,它会查询最新的block。
当一个结点遇到一个块,其index大于当前所有块的index时,它会添加这个块到它当前的链中,或者到整个区块链中查询这个块。
如图为当节点遵循前文所述协议时会发生的一些典型通信场景
我没有采用自动发现peer的工具。peers的位置(URL)必须是手动添加的。
结点控制
在某种程度上用户必须能够控制结点。这一点通过搭建一个HTTP服务器可以实现。
varinitHttpServer= ()=> {
varapp= express();
app.use(bodyParser.json());
app.get('/blocks',(req,res)=> res.send(JSON.stringify(blockchain)));
app.post('/mineBlock',(req,res)=> {
varnewBlock= generateNextBlock(req.body.data);
addBlock(newBlock);
broadcast(responseLatestMsg());
-imtoken钱包app">地址:娄底市四川街129号
电话:13662709616
传真:13360725079
邮箱:176376221@qq.com
};
vargenerateNextBlock= (blockData)=> {
varpreviousBlock= getLatestBlock();
varnextIndex= previousBlock.index+ 1;
varnextTimestamp= newDate().getTime()/ 1000;
varnextHash= calculateHash(nextIndex,previousBlock.hash,nextTimestamp,blockData);
returnnewBlock(nextIndex,previousBlock.hash,nextTimestamp,blockData,nextHash);
};
块的存储
内存中的Java数组被用于存储区块链。区块链的第一个块通常被称为“起源块”,是硬编码的。
vargetGenesisBlock= ()=> {
returnnewBlock(0,"0",1465154705,"my genesis block!!","816534932c2b7154836da6afc367695e6337db8a921823784c14378abed4f7d7");
};
varblockchain= [getGenesisBlock()];
vargetGenesisBlock= ()=> {
returnnewBlock(0,"0",1465154705,"my genesis block!!","816534932c2b7154836da6afc367695e6337db8a921823784c14378abed4f7d7");
};
varblockchain= [getGenesisBlock()];
确认块的完整性
在任何时候都必须能确认一个区块或者一整条链的区块是否完整。在我们从其他节点接收到新的区块,并需要决定接受或拒绝它们时,这一点尤为重要。
varisValidNewBlock= (newBlock,previousBlock)=> {
if(previousBlock.index+ 1!== newBlock.index){
console.log('invalid index');
returnfalse;
}elseif(previousBlock.hash!== newBlock.previousHash){
console.log('invalid previoushash');
returnfalse;
}elseif(calculateHashForBlock(newBlock)!== newBlock.hash){
console.log('invalid hash: '+ calculateHashForBlock(newBlock)+ ' '+ newBlock.hash);
returnfalse;
}
returntrue;
};
varisValidNewBlock= (newBlock,previousBlock)=> {
if(previousBlock.index+ 1!== newBlock.index){
console.log('invalid index');
returnfalse;
}elseif(previousBlock.hash!== newBlock.previousHash){
console.log('invalid previoushash');
returnfalse;
}elseif(calculateHashForBlock(newBlock)!== newBlock.hash){
console.log('invalid hash: '+ calculateHashForBlock(newBlock)+ ' '+ newBlock.hash);
returnfalse;
}
returntrue;
};
任何时候在链中都应该只有一组明确的块。万一冲突了(例如:两个结点都生成了72号块时),会选择有最大数目的块的链。
varreplaceChain= (newBlocks)=> {
if(isValidChain(newBlocks)&& newBlocks.length> blockchain.length){
console.log('Received blockchain is valid. Replacing current blockchain with received blockchain');
blockchain= newBlocks;
broadcast(responseLatestMsg());
}else{
console.log('Received blockchain invalid');
}
};
varreplaceChain= (newBlocks)=> {
if(isValidChain(newBlocks)&& newBlocks.length> blockchain.length){
console.log('Received blockchain is valid. Replacing current blockchain with received blockchain');
blockchain= newBlocks;
broadcast(responseLatestMsg());
}else{
console.log('Received blockchain invalid');
}
};
结点的本质是和其他结点共享和同步区块链,下面的规则能保证网络同步。
当一个结点生成一个新块时,它会在网络上散布这个块。
当一个节点连接新peer时,它会查询最新的block。
当一个结点遇到一个块,其index大于当前所有块的index时,它会添加这个块到它当前的链中,或者到整个区块链中查询这个块。
当一个结点生成一个新块时,它会在网络上散布这个块。
当一个节点连接新peer时,它会查询最新的block。
当一个结点遇到一个块,其index大于当前所有块的index时,它会添加这个块到它当前的链中,或者到整个区块链中查询这个块。
如图为当节点遵循前文所述协议时会发生的一些典型通信场景
我没有采用自动发现peer的工具。peers的位置(URL)必须是手动添加的。
结点控制
在某种程度上用户必须能够控制结点。这一点通过搭建一个HTTP服务器可以实现。
varinitHttpServer= ()=> {
varapp= express();
app.use(bodyParser.json());
app.get('/blocks',(req,res)=> res.send(JSON.stringify(blockchain)));
app.post('/mineBlock',(req,res)=> {
varnewBlock= generateNextBlock(req.body.data);
addBlock(newBlock);
broadcast(responseLatestMsg());
地址:铜陵市麻城路919号
电话:13669583062
传真:13727601113
邮箱:95724472@qq.com
10.4891