用MATLAB实现区块链:把区块对象连成链
现在可以把区块连成区块链了,我们用一个新的类叫做BlockChain来模拟它。 首先规定该链中的第一个block可以直接产生,就是genesis
block,这就是上面Block的construtor中,输入参数个数等于2是返回的对象.
classdef BlockChain < handle
properties
totalCount % 用来记录区块的个数
blockArray % 对象数组 用来盛放区块链
end
methods
function obj = BlockChain()
obj.blockArray =[ Block(0,'Genesis Block')]; % 构造blockchain对象时产生第一个 genesis
block
obj.totalCount = 1 ;
obj.calculateGensisBlockHash(); % 计算genesis block的hash
end
function bc = getLatest(obj)
bc = obj.blockArray(end);
end
function calculateGensisBlockHash(obj)
gb = obj.blockArray(1);
Opt.Method = 'SHA-256';
Opt.Input = 'ascii';
str = strcat(num2str(gb.index),gb.data) % 计算方法是把所有的内容做strcat
gb.selfHash = DataHash( str , Opt); % 然后hash
end
function addBlock(obj,newBlock) % 当miner成功的'挖出'一个符合要求的block之后
if obj.validateNewBlock(newBlock) % 调用该函数
obj.blockArray(end+1) = newBlock; % 把这个block加到blockchain上去
end
end
function tf = validateNewBlock(obj,newBlock) % 验证新添加的block是否符合要求
newHash = DataHash( strcat( newBlock.getCombined(), num2str(newBlock.nonce)
));
if(strcmp(newHash(1:2),'00') &&
strcmp(newBlock.selfHash,newHash))
tf= true;
else
tf = false;
end
end
end
end
在live editor中演示实例化这个BlockChain类,在它的constructor中,产生第一个genesis
block并且计算它的hash值
所谓的”链”,就是前一个block的selfHash的数据,保存在下一个block的previousHash属性中.
这就是说,区块2中包含着区块0的信息,区块3中包含着区块2的信息,从而区块3也包含着区块0的信息
+----------------------------+ +-------------------------+
+----------------------+
| genesis block | | block 1 | | block 2 |
+----------------------------+ +-------------------------+
+----------------------+
| index = 0 | | index = 1 | | index = 2 |
| previousHash ='' | +-----+ previousHash='075c277..'| +--+
previousHash='00abcd'| +-- ....
| selfHash = '075c27741a35068+---+ | selfHash ='00abcd...' +---+ | selfHash
= '00efgh..'+--+
| 46368fa6e5b3477f85b31cee..'| | | | |
+----------------------------+ +-------------------------+
+-----------------