主页 > 如何退出imtoken > 毕业设计-基于联盟链的区块链实现
毕业设计-基于联盟链的区块链实现
0 前言
近两年来,毕业设计和毕业答辩的要求和难度不断提高。 传统的毕业设计缺乏创新和亮点,往往达不到毕业答辩的要求。 在过去的两年里,学生们一直在向学长们讲述他们自己的项目。 系统不符合老师的要求。
为了让大家能够以最少的精力顺利通过毕业设计,学长们分享优质的毕业设计作品。 今天要分享的是
基于联盟链的区块链实现
这里学长给一个题目综合评分(每题满分5分)
完整帮助,选题指导,技术解决方案,欢迎打扰,见B站个人主页
1 课题简介
本文将为同学们介绍区块链相关知识,以及如何使用Java实现基于联盟链的区块链系统,甚至可以发行自己的虚拟货币。
1.1 知识点
由于大部分同学对区块链的概念还不是很清楚,所以学长们还是会在这里补充一些基础概念
1.2 区块链及类型 1.2.1 私有链
私有链对个人或实体开放,仅在公司等私有组织内部使用。 私有链上的读写权限和参与记账的权限都是由私有组织制定的。
再举个例子btc区块数据结构,不像现在人人都能进入虚拟世界,私链就像自己的家一样。 这个家是你个人所有的,是你的私人物品,所以你家谁出入(权限),你的东西要搬(预定)给谁,完全由你自己决定。 因为进出房子的人都是自己控制的,所以可以防止他人的恶意攻击,更好地保护自己的隐私,提高与他人交易的速度。
通过上面的例子我们可以看出,相对于公链的去中心化数据库,私链可以防止组织中的单个节点故意隐藏或篡改数据。 因此,私有链往往可以拥有极快的交易速度,更好的隐私保护,以及更低的交易成本,不易被恶意攻击。
1.2.2 公链
公链是指世界上任何人都可以读取和发送交易但可以获得有效确认的共识区块链。 也就是说,公链上的行为是公开透明的,不为任何人所控制,也不为任何人所有。 它是一个“完全去中心化”的区块链。
例如,假设公链是一个虚拟世界,那么我们任何人都可以进入这个虚拟世界建造自己的家园(也就是“挖矿”)或者与他人进行交易,这个虚拟世界保证了交易的安全和不变性
公链也叫非许可链,因为人人都可以参与,不需要授权,即可以参与所有的活动,不需要验证身份。 就像这个虚拟世界,每个人都可以在这里建立家园(也就是“挖矿”)。
因此,公链具有以下特点:
任何人都可以参与完全去中心化,门槛低。 任何拥有技术的人都可以访问它。 只需一台可以上网的电脑即可满足上网条件。 所有数据默认都是公开的,因为它是完全去中心化的,所以任何人都可以看到其他人的信息。
随着越来越多的人建立虚拟家园,资源的大规模消耗(比如挖矿功耗),虚拟世界的负载会越来越重,导致效率越来越低。 我要建楼(验证和竣工)需要很长时间。 因此,由于技术条件不成熟,一旦交易量过大,很容易造成网络拥堵,导致效率低下。 这也是很多公链需要解决的痛点。 公共链的使用:比特币、以太坊、Hyperledger、大多数山寨币和智能合约。
公链应用场景:
适用于数字货币、电子商务、互联网金融、知识产权等。
1.2.3 联盟链
由于需要保密的行业和应用不需要公链的公开透明特性,联盟链应运而生。 是指多个机构共同参与管理的区块链。 每个机构运行一个或多个节点,其中的数据只允许系统中的不同机构读取、写入和发送交易,并共同记录交易数据。 因此,联盟链上的读写权限和记账规则都是根据联盟规则“定制”的。
再举个例子:我们都知道一个集团是由很多不同的部门组成的,所以公司的走向是由各个部门的合作决定的(联盟的规则是共同制定的),每个部门都有自己的自己的职责(不同的节点),每个部门不能跨部门工作,所以各自写自己的数据信息,分发到指定的文件夹,然后这个指定的文件是公开透明的,每个部门都可以下载浏览。 其他公司来访时,会有专门部门接待(区块链开放API仅限查询)。
因此,联盟链具有以下特点:
联盟链的使用:
联盟链由参与成员机构共同维护,提供参与成员的管理、认证、授权、监控、审计等全套安全管理功能。 R3联盟成立于2015年,是银行业联盟链。 目前已有40多家成员加入,包括摩根大通、汇丰银行、高盛等全球知名银行。
1.3 比较
下表总结了一些主要差异
2 区块链算法关键技术 2.1 智能合约
所谓“合同”,是指条款、合同之类的东西,记录发生的条件和相应的执行条款,以支持确权等操作; 所谓“智能”,就是自动化和可编程。
因此,智能合约是可编程的合约,也可以理解为自动执行的合约。 在计算机中,它是一个自动执行的程序段。 保存合约比较容易,通过一定的算法运行。 给定输入,就会得到相应的输出,极大地保证了合约的执行。
用自动售货机做类比,可以帮助我们更好地理解智能合约的核心特征。
当用户选择好要购买的商品并完成支付后,发货逻辑就会被触发,用户就可以拿到想要的商品了。 这个过程不需要人工干预,节省了卖货的人工成本。 如果要破坏此合同,则必须物理销毁自动售货机。 像POS读卡器、EDI(Electronic Data Interchange)等,也可用此类比。
下面将分享一个基本的智能合约:HelloWorld。
此 Solidity 代码的功能是访问 _num 字段。 该字段称为“状态变量”,由区块链保存。
用户可以将此代码部署在以太坊或类似的区块链上。 成功部署意味着智能合约不能再被修改。 只要底层区块链不被破坏,这个合约就会一直存在。 任何人都可以通过“合约地址”调用合约接口,每次调用的信息都会记录在链上。
在解释这段代码如何运行之前,我们先来回顾一下传统java程序的运行方式。
首先,用户编译java代码后,会以字节码的形式保存在磁盘上; 然后用户调用程序,由JVM管理; 磁盘做IO。
Solidity 的实现类似。 不同的是,介质从硬盘变成了区块链,从单机变成了分布式。
代码部署后,以字节码的形式存储在各个节点上。 当用户请求调用某个功能时,该调用请求将包含在交易中并打包到某个区块中。 一旦全网对区块达成共识,就意味着调用是合法的。
接下来EVM会调用字节码,字节码负责访问底层的状态变量,就像传统编程的IO一样。
从代码上看,合约开发似乎无非如此。 单个合约只需要围绕字段进行操作。 对于许多简单的业务,它只是 CRUD。
但其复杂性恰恰在于此。 合约在区块链环境中执行,不可修改。
所以如果出现bug,就必须部署新的合约,这对合约的可维护性提出了挑战。 而且,一旦业务变得复杂,就容易出现安全漏洞,导致链上资产丢失。 同时,还要考虑完成代码编写、逻辑执行、数据存储的成本。
2.2 共识机制算法
共识算法可以定义为跨区块链网络达成共识的机制。 公有(去中心化)区块链作为一个分布式系统,不依赖于一个中央权威机构,而是通过分布式节点的一致通过来实现交易。 同时,共识算法发挥作用,保证协议规则的正常执行,交易可以在不信任的情况下发生,所有数字货币只能消费一次。
由于已有的共识很多,这里列举一些供大家参考。 有需要的可以自己查或者请教前辈
工作量证明(PoW,Proof of Work)计算
权益证明(PoS,Proof of Stake)
延迟工作量证明(dPoW,Delayed Proof-of-Work)
授权权益证明(DPoS,Delegated Proof-of-Stake)
权威证明(PoA,Proof-of-Authority)
重量证明(PoWeight,重量证明)
信誉证明(PoR,Proof of Reputation)
经过时间证明(PoET,经过时间证明)
容量证明(PoC,Proof of Capacity),又称空间证明(PoSpace,Proof of Space)
2.3 存储
无论是区块数据还是状态数据,都是由区块链节点使用和存储的。 区块链节点是运行在我们个人电脑、虚拟机或服务器上的程序。 分布在不同计算机或服务器上的多个区块链节点通过网络相互连接,形成一个完整的区块链网络。
区块链节点通常将区块链数据存储在个人电脑、虚拟机或服务器上,最常见的存储区块链数据的介质是磁盘。
区块链节点不直接访问磁盘,它们通过特定的数据库来操作数据,例如单机或分布式数据库,如 LevelDB、RocksDB 或 MySQL。 与直接操作磁盘相比,数据库抽象出特定的数据访问模型,对区块链节点更加友好。
因此,当我们说:“区块链数据存储在数据库中”时,可以认为区块链节点将区块链数据存储在MySQL(或其他数据库)中,MySQL将区块链数据存储在磁盘上。
3 实现联盟链区块链 3.1 区块链基本模型构建
区块是区块链系统的最小单位。 第一步,实现最简单的块结构,新建一个Block.java类,主要包括以下字段: Block.java
/**
* 块结构
*
* @作者 Jared Jia
*
*/
公共类块实现序列化{
private static final long serialVersionUID = 1L;
/**
* 区块索引号(区块高度)
*/
私有整数索引;
/**
* 当前区块的哈希值,区块的唯一标识
*/
私有字符串哈希;
/**
* 上一个区块的哈希值
*/
私有字符串 previousHash;
/**
* 生成块的时间戳
*/
私人长时间戳;
/**
* 工作量证明,计算正确哈希值的次数
*/
私人 int 随机数;
/**
* 当前区块存储的业务数据集(如转账交易信息、账单信息、合约信息等)
*/
私有列表交易;
/*** 省略get set方法****/
}
区块链是一种数据结构,其中块按照块哈希的顺序串联起来。 哈希值是通过哈希算法对区块进行二次哈希计算得到的数字摘要信息(不知道哈希函数的可以先百度了解SHA算法),用于保证信息的安全性块的安全性和整个区块链的有效性。 因此,在第二步中,我们新增了一个计算区块哈希值的方法,使用SHA256算法,通过java实现:CryptoUtil.java
/**
* 密码学工具
*
* @作者 Jared Jia
*
*/
公共类 CryptoUtil {
/**
* SHA256哈希函数
* @param 海峡
* @返回
*/
公共静态字符串 SHA256(字符串 str){
消息摘要消息摘要;
字符串 encodeStr = "";
尝试 {
消息摘要 = 消息摘要。 getInstance("SHA-256");
信息摘要。 更新(海峡。getBytes(“UTF-8”));
encodeStr = byte2Hex(messageDigest.digest());
} 赶上(异常 e){
System.out.println("getSHA256 错误" + e.getMessage());
}
返回编码器;
}
私有静态字符串 byte2Hex(byte[] bytes) {
StringBuilder 构建器 = new StringBuilder();
字符串温度;
for (int i = 0; i < bytes.length; i++) {
temp = Integer.toHexString(bytes[i] & 0xFF);
如果(温度。长度()== 1){
builder.append("0");
}
builder.append(temp);
}
返回 builder.toString();
}
}
第三步,创建链式结构对象,保存块对象,形成有序的块链表。 考虑到线程安全问题,采用CopyOnWriteArrayList来实现。 为了方便测试,让区块链结构存储在本地缓存中。 实际的区块链网络最终会实现持久层的功能,将区块链数据保存到数据库中。 例如BTC核心网使用KV数据库LevelDB:BlockCache.java
公共类 BlockCache {
/**
* 当前节点的区块链结构
*/
私有列表 blockChain = new CopyOnWriteArrayList();
公共列表 getBlockChain() {
返回区块链;
}
public void setBlockChain(列出区块链){
this.blockChain = 区块链;
}
}
第四步,有了区块链结构之后,我们需要添加一个新的方法来给区块链添加区块。 同时,我们每增加一个区块,都需要验证新区块的有效性,比如Hash值是否正确,新区块中前一个区块的hash属性的值是否等于前一个块的哈希值。
另外,区块链中必须有一个创世块,我们直接硬编码实现:BlockService.java
/**
* 区块链核心服务
*
* @作者 Jared Jia
*
*/
@服务
公共类 BlockService {
@Autowired
块缓存块缓存;
/**
* 创建创世块
* @返回
*/
公共字符串 createGenesisBlock() {
区块 genesisBlock = new Block();
//设置创世区块高度为1
创世块。 设置索引(1);
genesisBlock.setTimestamp(System.currentTimeMillis());
创世块。 设置随机数(1);
//封装业务数据
列表 tsaList = new ArrayList();
交易 tsa = new Transaction();
tsa.setId("1");
tsa.setBusinessInfo("这是创世块");
tsaList.add(tsa);
交易 tsa2 = new 交易 ();
tsa2.setId("2");
tsa2.setBusinessInfo("区块链高度:1");
tsaList.add(tsa2);
genesisBlock.setTransactions(tsaList);
//设置创世块的哈希值
genesisBlock.setHash(calculateHash("",tsaList,1));
//加入打包保存的业务数据集合
blockCache.getPackedTransactions().addAll(tsaList);
//添加到区块链
blockCache.getBlockChain().add(genesisBlock);
返回 JSON.toJSONString(genesisBlock);
}
/**
* 创建一个新块
* @param 随机数
* @param previousHash
* @param 哈希
* @param blockTxs
* @返回
*/
public Block createNewBlock(int nonce, String previousHash, String hash, List blockTxs) {
块 block = new Block();
block.setIndex(blockCache.getBlockChain().size() + 1);
//时间戳
block.setTimestamp(System.currentTimeMillis());
block.setTransactions(blockTxs);
//工作量证明,计算正确哈希值的个数
堵塞。 setNonce(随机数);
// 前一个块的哈希值
block.setPreviousHash(previousHash);
// 当前区块的哈希值
堵塞。 setHash(散列);
如果(addBlock(块)){
返回块;
}
返回空值;
}
/**
* 添加一个新区块到当前节点的区块链
*
* @param 新块
*/
public boolean addBlock(Block newBlock) {
//首先检查新块的有效性
如果 (isValidNewBlock(newBlock, blockCache.getLatestBlock())) {
blockCache.getBlockChain().add(newBlock);
// 新区块的业务数据需要添加到打包好的业务数据集合中
blockCache.getPackedTransactions().addAll(newBlock.getTransactions());
返回真;
}
返回假;
}
/**
* 验证新区块是否有效
*
* @param 新块
* @param 前一个块
* @返回
*/
public boolean isValidNewBlock(Block newBlock, Block previousBlock) {
如果 (!previousBlock.getHash().equals(newBlock.getPreviousHash())) {
System.out.println("新区块上一区块哈希校验失败");
返回假;
} 别的 {
// 验证新区块哈希值的正确性
String hash = calculateHash(newBlock.getPreviousHash(), newBlock.getTransactions(), newBlock.getNonce());
如果 (!hash.equals(newBlock.getHash())) {
System.out.println("新区块哈希值无效:" + hash + " " + newBlock.getHash());
返回假;
}
如果(!isValidHash(newBlock.getHash())){
返回假;
}
}
返回真;
}
}
4 测试结果
挖出的第一块虚拟货币,蛋城币
完整帮助,选题指导btc区块数据结构,技术解决方案,欢迎打扰,见B站个人主页