最近有点背...
  • About Me

  • 兴趣爱好



  • 上一张

用Java搭建一条区块链

前言

为了更好的理解区块链的底层实现原理,决定自己动手模拟实现一条区块链。

思路分析

通过之前的学习,从文本知识的角度,我们知道,创世区块、记账原理、挖矿原理、工作量证明、共识机制等等区块链的相关知识。

创建一条区块链,首先默认构造创世区块。在此基础上,我们可以发布交易,并进行挖矿,计算出工作量证明,将交易记录到区块中,每成功的挖一次矿,块高就+1。当然在此过程中,可能会出现“造假”的问题。也就是说,每一个新注册的节点,都可以有自己的链。这些链长短不一,为了保证账本的一致性,需要通过一种一致性共识算法来找到最长的链,作为样本,同步数据,保证每个节点上的账本信息都是一致的。

数据结构

Web3j API详解

Web3j是什么

Web3j是什么,我们可以把它理解成是轻量级的Java库,用于连接Java与以太坊客户端的集成。

对于Web3j的最大特性,我的理解是,将Solidity语言的智能合约翻译成Java版本的智能合约。

它的核心特性有:

  • 以Java类型的JSON-RPC实现以太坊客户端的交互
  • 支持所有JSON-RPC类型的方法
  • 支持所有Geth和Parity方法来管理账户、签名、交易
  • 发送客户端同步请求和异步请求
  • 自动Solidity ABI文件生成Java智能合约包装

以太坊客户端 Geth 命令用法-参数详解

前言

Geth 在以太坊智能合约开发中最常用的工具(必备开发工具),一个多用途的命令行工具。

命令用法

geth [选项] 命令 [命令选项] [参数…]

版本

1.7.3-stable

命令

共识协议之工作量证明(比特币的挖矿原理)

记账工作

由于记账是有奖励的,每次记账都可以给自己凭空增加一定数量的个比特币(当前是12.5比特币,博文写作时每个比特币是4万人民币以上,大家可以算算多少钱),因此就出现大家争相记账,大家一起记账就会引起问题:出现记账不一致的问题,比特币系统引入工作量证明来解决这个问题,规则如下:
一段时间内(10分钟左右,具体时间会与密码学难题难度相互影响)只有一人可以记账成功
通过解决密码学难题(即工作量证明)竞争获得唯一记账权
其他节点复制记账结果
不过在进行工作量证明之前,记账节点会做进行如下准备工作:

  • 收集广播中还没有被记录账本的原始交易信息
  • 检查每个交易信息中付款地址有没有足够的余额
  • 验证交易是否有正确的签名
  • 把验证通过的交易信息进行打包记录
  • 添加一个奖励交易:给自己的地址增加12.5比特币

区块链的记账原理

在讲记账原理之前,我们先聊聊哈希函数。

哈希函数

Hash(原始信息) = 摘要信息
哈希函数的特点:

  • 同样的原始信息用同一个哈希函数总能够得到相同的摘要信息。
  • 原始信息任何微小的变化都会哈希出面目全非的摘要信息。
  • 无法从摘要信息逆推出原始信息。

举例说明:
Hash(张三借给李四100万,利息1%,1年后还本息 .....) = AC4635D34DEF
账本上记录了AC4635D34DEF这样一条记录。
可以看出哈希函数有以下的特点: