区块链节点和区块区别_区块链的新节点分析

新节点接入网络后,会进行连接建立,一般是采用TCP协议。新节点会发送一条包含自身相关信息的消息给对等节点,实现握手通信。新节点建立好连接之后,会通过现有连接的节点通过OKEx中的地址广播不断扩充丰富自己的地址数据库。从建立连接开始,新节点同时也在进行区块信息的同步,直到新节点同步完所有区块,该节点才能真正开始承担交易和区块的传播验证职能。

当成功生成一个新区块后,生成该区块的节点会迅速将该区块广播到全网其他节点,由其他节点进行验证。验证节点收到发来的数据后,将首先对照一个长长的标准清单来验证该区块的有效性。以OKEx为例,该标准清单包括:

1.区块的语法和数据结构是否正确;

2.区块头的随机数是否满足难度要求;

3.区块长度大小是否在长度限制内;

4.是否符合有且只有第一个交易是创币交易;

5.区块内的交易验证是否有效。

如果区块经过验证无效,那么就拒绝该区块;如果区块有效,就将找到该区块的前一区块上链。同样交易数据也是如此,交易节点将新生成的交易数据向全网广播,其他节点监听到交易数据,将对该交易数据进行有效性检查,无效的交易在第一个节点就会被废弃,这样可以确保只有有效的交易才会在网络中传播。而如果数据有效,在继续向邻近节点转发的同时还会按照接收交易顺序将交易数据存储在交易池等待打包。

f1d951aaa03f91c71cd0e2e81c4cd526.png
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现一个自己的区块链需要考虑到节点之间的同步问题,下面是Java代码实现节点之间同步区块链的示例: 1. Node类 首先定义一个Node类,表示一个区块链节点。该类包含节点的IP地址、端口号以及一个BlockChain对象。 ```java import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.Socket; public class Node { private String ip; private int port; private BlockChain blockChain; public Node(String ip, int port, BlockChain blockChain) { this.ip = ip; this.port = port; this.blockChain = blockChain; } public void sync() { try { Socket socket = new Socket(ip, port); ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream()); ObjectInputStream in = new ObjectInputStream(socket.getInputStream()); // 发送本节点区块链的最后一个区块的哈希值 out.writeObject(blockChain.getLastBlockHash()); // 接收对方节点区块链 BlockChain remoteBlockChain = (BlockChain) in.readObject(); // 合并本节点和对方节点区块链 blockChain.merge(remoteBlockChain); in.close(); out.close(); socket.close(); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } } ``` 2. BlockChain类 接下来定义一个BlockChain类,表示区块链。该类包含一系列区块、难度值以及一个方法用于合并两个区块链。 ```java import java.util.ArrayList; import java.util.List; public class BlockChain { private int difficulty; private List<Block> blocks; public BlockChain(int difficulty) { this.difficulty = difficulty; this.blocks = new ArrayList<>(); blocks.add(new Block(0, "Genesis Block")); } public String getLastBlockHash() { return blocks.get(blocks.size() - 1).getHash(); } public void addBlock(Block block) { block.mineBlock(difficulty); blocks.add(block); } public void merge(BlockChain other) { if (other.blocks.size() <= blocks.size()) { return; } for (int i = blocks.size(); i < other.blocks.size(); i++) { Block block = other.blocks.get(i); if (block.isValid() && block.getPrevHash().equals(getLastBlockHash())) { blocks.add(block); } else { break; } } } } ``` 3. Block类 最后定义一个Block类,表示区块。该类包含区块的索引、时间戳、交易记录、前一个区块的哈希值以及一个Nonce值。 ```java import java.io.Serializable; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Date; public class Block implements Serializable { private static final long serialVersionUID = 1L; private int index; private long timestamp; private String data; private String prevHash; private String hash; private int nonce; public Block(int index, String data) { this.index = index; this.timestamp = new Date().getTime(); this.data = data; this.prevHash = ""; this.hash = calculateHash(); this.nonce = 0; } public String getPrevHash() { return prevHash; } public String getHash() { return hash; } public void mineBlock(int difficulty) { String target = new String(new char[difficulty]).replace('\0', '0'); while (!hash.substring(0, difficulty).equals(target)) { nonce++; hash = calculateHash(); } System.out.println("Block mined! Hash: " + hash); } public boolean isValid() { if (!hash.equals(calculateHash())) { return false; } if (!prevHash.isEmpty() && !prevHash.equals(calculatePrevHash())) { return false; } return true; } private String calculateHash() { String data = index + timestamp + this.data + prevHash + nonce; return sha256(data); } private String calculatePrevHash() { String data = (index - 1) + timestamp + data + prevHash + nonce; return sha256(data); } private String sha256(String data) { try { MessageDigest digest = MessageDigest.getInstance("SHA-256"); byte[] hash = digest.digest(data.getBytes()); StringBuffer hexString = new StringBuffer(); for (int i = 0; i < hash.length; i++) { String hex = Integer.toHexString(0xff & hash[i]); if (hex.length() == 1) { hexString.append('0'); } hexString.append(hex); } return hexString.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); return null; } } } ``` 4. 示例 最后给出一个示例,构建两个节点,它们的IP地址和端口号分别为localhost:8000和localhost:8001。 ```java public class Main { public static void main(String[] args) { BlockChain blockChain1 = new BlockChain(4); blockChain1.addBlock(new Block(1, "Block 1")); blockChain1.addBlock(new Block(2, "Block 2")); BlockChain blockChain2 = new BlockChain(4); blockChain2.addBlock(new Block(1, "Block 1")); Node node1 = new Node("localhost", 8000, blockChain1); Node node2 = new Node("localhost", 8001, blockChain2); node1.sync(); node2.sync(); System.out.println("Node 1: " + blockChain1.getLastBlockHash()); System.out.println("Node 2: " + blockChain2.getLastBlockHash()); } } ``` 在该示例中,节点1先向节点2发送自己区块链的最后一个区块的哈希值,节点2接收到后将自己的区块链发送给节点1,然后节点1将两个区块链合并,最终节点1和节点2的区块链都包含了两个区块

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值