数字货币是区√块链的典型应用,它是电子货币形式的替代货币,一种不受管制的、数字化的货币,通常由开发者发行和管理,被特定虚拟社区的成员所接受和使用。数字货币交易所,又可称为数字货币平台,是指用区块链,撮合交易等一些技术,使得数字货币交易方便的平台,而交易所的作用是可进行数字货币交易/支付,除此之外,还可以进行资产管理,撮合交易以及资产清算等。
区块链是由每个区块的哈希值串连起来的链式结构,而区块的哈希值=SHA256(“当前区块内容+上一个区块的哈希值”),任何一个区块的内容发生修改,都会引起哈希值的变化,而哈希值的变化也会引起子区块哈希值发生变化,进而引起整个区块链的改变。
因此任何人想要修改区块的数据几乎是不可能的,除非他把整个区块链中从创世区块到最新的区块的所有哈希值全部重新修改一遍,并且修改完之后,还得广播告诉网络中的其他所有节点,让其他所有节点接受修改。
不过按照目前计算机的算力,想要在短时间内从区块链头部到尾部全部修改一遍,是一件非常困难的事,并且即使修改完了,其他节点也不会接受修改,因为凭一己之力,没有能够让所有节点达成共识的条件。
public class BlockCache {
/**
* 当前节点的区块链结构
*/
private List
public List
return blockChain;
}
public void setBlockChain(List
this.blockChain = blockChain;
}
}
/**
* 区块链核心服务
*
* @author Jared Jia
*
*/
@Service
public class BlockService {
@Autowired
BlockCache blockCache;
/**
* 创建创世区块
* @return
*/
public String createGenesisBlock() {
Block genesisBlock = new Block();
//设置创世区块高度为1
genesisBlock.setIndex(1);
genesisBlock.setTimestamp(System.currentTimeMillis());
genesisBlock.setNonce(1);
//封装业务数据
List
Transaction tsa = new Transaction();
tsa.setId("1");
tsa.setBusinessInfo("这是创世区块");
tsaList.add(tsa);
Transaction tsa2 = new Transaction();
tsa2.setId("2");
tsa2.setBusinessInfo("区块链高度为:1");
tsaList.add(tsa2);
genesisBlock.setTransactions(tsaList);
//设置创世区块的hash值
genesisBlock.setHash(calculateHash("",tsaList,1));
//添加到已打包保存的业务数据集合中
blockCache.getPackedTransactions().addAll(tsaList);
//添加到区块链中
blockCache.getBlockChain().add(genesisBlock);
return JSON.toJSONString(genesisBlock);
}
/**
* 创建新区块
* @param nonce
* @param previousHash
* @param hash
* @param blockTxs
* @return
*/
public Block createNewBlock(int nonce, String previousHash, String hash, List
Block block = new Block();
block.setIndex(blockCache.getBlockChain().size() + 1);
//时间戳
block.setTimestamp(System.currentTimeMillis());
block.setTransactions(blockTxs);
//工作量证明,计算正确hash值的次数
block.setNonce(nonce);
//上一区块的哈希
block.setPreviousHash(previousHash);
//当前区块的哈希
block.setHash(hash);
if (addBlock(block)) {
return block;
}
return null;
}
/**
* 添加新区块到当前节点的区块链中
*
* @param newBlock
*/
public boolean addBlock(Block newBlock) {
//先对新区块的合法性进行校验
if (isValidNewBlock(newBlock, blockCache.getLatestBlock())) {
blockCache.getBlockChain().add(newBlock);
// 新区块的业务数据需要加入到已打包的业务数据集合里去
blockCache.getPackedTransactions().addAll(newBlock.getTransactions());
return true;
}
return false;
}
/**
* 验证新区块是否有效
*
* @param newBlock
* @param previousBlock
* @return
*/
public boolean isValidNewBlock(Block newBlock, Block previousBlock) {
if (!previousBlock.getHash().equals(newBlock.getPreviousHash())) {
System.out.println("新区块的前一个区块hash验证不通过");
return false;
} else {
// 验证新区块hash值的正确性
String hash = calculateHash(newBlock.getPreviousHash(), newBlock.getTransactions(), newBlock.getNonce());
if (!hash.equals(newBlock.getHash())) {
System.out.println("新区块的hash无效: " + hash + " " + newBlock.getHash());
return false;
}
if (!isValidHash(newBlock.getHash())) {
return false;
}
}
return true;
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)