# LineChain(来链)发布
自2022年2月初到现在,因工作繁忙,停更了近2个月。
从今天开始,将继续更新。
做自己喜欢的事情,不存在困难,只有探索未知,而探索是一种真正的乐趣。
1、今天把项目的go升级到1.18版本了;
2、升级了项目依赖的第三方库。发现libp2p更新很少,应该是很稳定了;
3、为了实现给不同的blockchain实例创建专属的钱包,给钱包创建命令增加了instanceId参数,这样,当在一台计算机上启动不同的终端模拟多个node的时候,可以以instanceId作为文件夹区分钱包目录,以满足在一台计算机上创建多个钱包文件的需要。
计划下周完成测试后,将目前的代码全部上传到github中,作为今后不断进行更新的blockchain唯一正式项目(基于第八版)。
正式版项目命名为**LineChain**,简单易记易发音,中文为“**来链**”。已为此申请域名linchain.cc,后面抽空花点时间建立一个专门的网站,相关文档将则要地同步更新到网站上。
LineChain 因为广泛参考或引用了第三方开源项目,将会一直遵循最开放的**GNU GPL**开源协议。[GNU General Public Licence](www.opensource.org/licenses/gpl-2.0.php)(GPL) 有可能是开源界最常用的许可模式。GPL 保证了所有开发者的权利,同时为使用者提供了足够的复制,分发,修改的权利:
**1.可自由复制**
你可以将软件复制到你的电脑,你客户的电脑,或者任何地方。复制份数没有任何限制。
**2.可自由分发**
在你的网站提供下载,拷贝到U盘送人,或者将源代码打印出来从窗户扔出去(环保起见,请别这样做)。
**3.可以用来盈利**
你可以在分发软件的时候收费,但你必须在收费前向你的客户提供该软件的 GNU GPL 许可协议,以便让他们知道,他们可以从别的渠道免费得到这份软件,以及你收费的理由。
**4.可自由修改**
如果你想添加或删除某个功能,没问题,如果你想在别的项目中使用部分代码,也没问题,唯一的要求是,使用了这段代码的项目也必须使用 GPL 协议。
4、README 更新
# LineChain Readme
## 区块链构成图
![](https://img.kancloud.cn/77/a6/77a6a9bd10e92058013268ae027d33fd_921x241.png)
实现了区块链所需的关键功能:
* Blockchain结构
* Nodes节点
* 共识算法, Blocks & Proof Of Work (POW)
* Wallet钱包
* Transactions交易
* Uspent Transaction Output (UTXO)
* Merkle Tree
* Networking (P2P/分布式系统)网络层:p2plib
* Database:高性能数据库badger
## 文件清单
| 文件夹 | 内容 |
| --- | --- |
| `./p2p` | 网络层 |
| `./cmd` | CLI脚本,可与blockchain交互 |
| `./Binaries` | 可执行文件夹,如 Wallet等 |
| `./wallet` | Wallet源码 |
| `./api` | 使用Go, Python, Rust 和 JS 等编写的API封装 |
## 关于部署
可部署在windows、linux系统的电脑上,以及任意支持交叉编译go的其它操作系统的终端,每个部署程序的都是一个全节点。 不同终端启动节点的命令参数 instanceId 可以相同。 同一个终端部署多个节点用于开发和测试用,需要使用不同的instanceId区分不同的终端。 运行节点的计算机,不需要安装第三方依赖库。
## Blockchain
Blockchain 定义为一个存储区块的数据库,在数据库中,每一个区块链接到前一个区块。
## Nodes
Nodes 可被定义为任何类型的设备(主要是计算机), 手机, 笔记本电脑, 大数据中心。Nodes建立区块链网络基础架构,没有node就没有网络。所有nodes彼此连接,它们通常互相交换最新的区块链数据,确保所有节点保持最新。节点的主要作用包括但不限于:存储区块链数据,验证新的交易和区块,帮助新的和已经存在的节点保持最新。
区块链由三类节点组成:
### Mining Nodes
这是区块链网络中最重要的节点,他们保持网络运行,它们负责挖出新的币,它们验证交易,验证和挖出新的区块。
### Full Nodes
这类节点负责为矿工验证新的交易,管理内存池(未验证的交易),以及验证新的区块。
### Ordinary Nodes
这类节点是网络的一部分,保持网络运行,它们更多验证网络上的新节点。
### Gerneral Nodes
这类节点是网络的大多部分,保持网络运行。
本区块链支持**fullnode**、**mining node**和**gerneral node**,但只是分工不同,他们都是全节点(以后将考虑升级支持轻节点)。
### 共识算法,挖矿, 区块 与 Proof Of Work (POW)
本项目实现了Proof of work算法,POW被bitcoin和litecoin使用。
### Blocks 图表
![](https://img.kancloud.cn/18/e9/18e926082a42b83653e7c97a99913bc4_801x341.png)
### 我们如何知道一个区块是否合法?
我们检查两件事:
1. 我们检查前一个区块引用是否存在和合法。
2. 我们检查该区块的POW合法.
## Wallet
钱包系统类似于银行账户,包括一对公私密钥。密钥用于跟踪拥有者权属、接受和发出加密货币。 钱包系统独立于区块链网络。
### 钱包、地址、余额关联图
![](https://img.kancloud.cn/70/f7/70f7016222b24519118767e98199e043_580x261.png)
### Commands
这里命令参数 intanceid 请与 blockchain 的 instanceId 保持一致,以指定钱包文件的目录。
产生一个新钱包
~~~
./wallet new --intanceid INSTANCE_ID
~~~
打印所有本地钱包
~~~
./wallet print --intanceid INSTANCE_ID
~~~
根据地质打印钱包
~~~
./wallet print --address ADDRESS --intanceid INSTANCE_ID
~~~
### Transactions
一个交易是在钱包之间的价值传送。它由交易输入和交易输出组成。交易输入由已花费币数组组成,同时交易输出由未花费币数组组成。交易由私钥签名,以证明一个用户确实是拥有这些币。交易初始化后发送到网络,随后网络节点们使用该用户的公钥对该交易执行一序列验证。
### Memory pool
交易池是一个未确认交易的等待区。当一个用户发出了一个交易后,该交易被发送给网络上的所有全节点,全节点验证交易后,将它们放入到它们的内存池中,同时等待矿工节点拾起它,并包含到下一个区块中。
### Uspent Transaction Output (UTXO) Model
得益于bitcoin区块链,这个概念变得真正流行起来,它定义为一个区块链交易未花费的输出。
它们可用于新的交易(只要您用私钥解锁它们),这使得他们变得有用。当一个用户试着发送X数量的币给Y用户,UTXOs用作输入,该用户可以解锁它们。 计算一个钱包的balance(余额)可以通过将被特定地址锁定的所有未花费交易输出相加得到。
#### 为什么我们需要这个 ?
balance(余额) 区块链数据相当冗长,其大小可为从几百到几亿的数据,通过区块链计算一个用户的钱包余额相当昂贵,UTXOs作为一个拯救手段可降低费用。UTXOs不是完全聪明,但是一个进步,而每一个主意都有它的权衡。
#### 它是如何工作的?
UTXOs被存储在BadgerDB,提供特别的命令执行这个,但记住,UTXOS是从创世区块开始创建的,UTXOS是从创世区块开始的区块链中创建的,每次执行新交易时都会进行计算,并且每次用户检查其余额时和添加新区块时都会进行计算。
### Merkle Tree
Merkle树可以简单地定义为二进制哈希树数据结构,它由一组节点组成,在树的底部包含大量底层节点,这些底层节点包含基础数据,还有一组中间节点,其中每个节点都是哈希,最后也是一个由其两个子节点的哈希组成的单个根节点,称为merkle根的树的“顶部”,这使得能够快速验证区块链数据以及快速移动区块链数据。 在merkle树算法上执行事务生成单个哈希,该哈希是一串数字和字母,可用于验证给定的数据集与原始事务集相同。
### Merkle 树示例
![](https://img.kancloud.cn/c2/03/c2030bf913e9b1721e887539a6bfaac2_701x332.png)
### Networking (peer-to-peer)
区块链协议在互联网上运行,在P2P网络上,计算机运行该协议,并持有相同的交易账本的副本,通过共识机制实现P2P价值交易。在计算上,p2p是一个对等网络,它可以以相同的能力(在计算方面可能有所不同)和功能来存储和共享文件。它们同时扮演服务器和客户端,实时交换信息,当一个节点扮演客户端时候,它从其它网络节点下载文件。但当他们以服务器工作时,它们成为源头,其它节点从这里下载文件。P2P网络不存在单点故障,即使在诸如容错等错误事件时依然能使系统继续正常运行。P2P网络是区块链必不可少的一个部分,因为它允许区块链数据分布于多节点/终端,防止困扰无数系统的Denial-of-Service (DoS)攻击,使他们无法接受中央机构的审查。P2P的主要局限性在于在所有同级之间保持数据一致的能力(主观),而且工作量的证明对于功能较弱的计算机而言过于计算昂贵,并且随着区块链变得更大且难度增加,这种情况只会变得更糟 这意味着具有较低计算能力的节点最终会离开,但从好的方面来说,P2P使去中心化成为可能,并为区块链提供整体安全性。
#### Network 概览
![](https://img.kancloud.cn/b5/ed/b5edafa4adba0067a8446221bab6261d_478x393.png)
## Demon CLI
这是本项目官方的命令行工具,命令行工具允许开发者与区块链网络交互。
### Build CLI
导航到cmd/demon目录,运行以下命令创建cli:
~~~
go build
~~~
### 可执行的命令清单
~~~
请注意,所有的命令,都需要加上instanceid参数
~~~
#### 产生一个新钱包.这里intanceid请与blockchain的instanceId保持一致,以指定钱包文件的目录
~~~
./demon wallet new --intanceid INSTANCE_ID
~~~
#### 列出所有钱包地址.这里intanceid请与blockchain的instanceId保持一致,以指定钱包文件的目录
~~~
./demon wallet listaddress --intanceid INSTANCE_ID
~~~
#### 获得余额
~~~
./demon wallet balance --address ADDRESS --intanceid INSTANCE_ID
~~~
#### 打印区块链信息
~~~
./demon print --intanceid INSTANCE_ID
~~~
#### 计算UTXOs
~~~
./demon computeutxos --intanceid INSTANCE_ID
~~~
#### 发送
~~~
./demon send --sendfrom ADDRESS --sendto ADDRESS --amount AMOUNT --intanceid INSTANCE_ID
~~~
#### 启动一个RPC服务器
默认端口是**5000**./demon --rpc true --rpcport 4000 --intanceid INSTANCE\_ID
#### 开始一个节点
作为矿工 ./demon startnode --port PORT --address MINER\_ADDRESS --miner --instanceid INSTANCE\_ID
作为全节点 ./demon startnode --port PORT --fullnode --instanceid INSTANCE\_ID
如果这些标志在`.env`文件中已经存在,address, fullnode, miner 和 port 标志均为可选参数。
## 项目安装
### 将下面的信息添加到Env文件中(必须)
~~~
WALLET_ADDRESS_CHECKSUM = 4
~~~
### 矿工的其它信息(可选)
~~~
WALLET_ADDRESS_CHECKSUM = 4
MINER_ADDRESS = <YOUR_WALLET_ADDRESS>
MINER = true
~~~
### Start a node
#### NB: 运行多个区块链实例需要你使用--instanceid初始化一个新的区块链,随后访问该实例时候也需要用到它,区块链的数据库以instanceid命名。一个节点只有一个唯一的instanceid,该节点的所有针对区块链的操作均与其有关
#### Initialize a blockchain
这个命令创建创世区块,并初始化区块链。Instanceid允许你运行该区块链的多个实例,它必须是一个字符串,如5000 ./demon init --address --instanceid
#### 在启用RPC的情况下启动区块链实例
作为矿工 ./demon startnode --port PORT --address MINER\_ADDRESS --miner --rpc --rpcport PORT --instanceid INSTANCE\_ID
作为全节点 ./demon startnode --port PORT --fullnode --rpc --rpcport PORT --instanceid INSTANCE\_ID
作为普通节点 ./demon startnode --instanceid INSTANCE\_ID --rpc --rpcport PORT --instanceid INSTANCE\_ID
#### 节点JSON-RPC服务器
创建钱包 示例 curl -X POST -H "Content-Type: application/json" -d '{"id": 1, "method": "API.CreateWallet", "params": \[\]}'[http://localhost:5000/\_jsonrpc](http://localhost:5000/_jsonrpc)
获得余额 示例
~~~
curl -X POST -H "Content-Type: application/json" -d '{"id": 1, "method": "API.GetBalance", "params": [{"Address":"1EWXfMkVj3dAytVuUEHUdoAKdEfAH99rxa"}]}' http://localhost:5000/_jsonrpc
~~~
得到区块链 示例
~~~
curl -X POST -H "Content-Type: application/json" -d '{"id": 1,"method": "API.GetBlockchain", "params": []}' http://localhost:5000/_jsonrpc
~~~
通过Height得到区块 示例
~~~
curl -X POST -H "Content-Type: application/json" -d '{"id": 1,"method": "API.GetBlockByHeight", "params": ["Height":1]}' http://localhost:5000/_jsonrpc
~~~
发送 示例
~~~
curl -X POST -H "Content-Type: application/json" -d '{"id": 1 , "method": "API.Send", "params": [{"sendFrom":"1D214Jcep7x7zPphLGsLdS1hHaxnwTatCW","sendTo": "15ViKshPBH6SzKun1UwmHpbAKD2mKZNtBU", "amount":0.50, "mine": true}]}' http://localhost:5000/_jsonrpc
~~~
#### 命令行用法
~~~
用法:
demon [flags]
demon [command]
可用Commands:
computeutxos 重建和计算Unspent transaction outputs
help 关于任何命令的帮助
init 初始化区块链并创建创始区块
print 打印区块链里面的区块信息
send 从本地钱包地址发送X数量的币给一个地址
startnode 开始一个节点
wallet 管理钱包
Flags:
--address string 钱包地址
-h, --help demon命令帮助
--instanceid string 节点实例ID(所有命令都必须加此参数)
--rpc 启用HTTP-RPC server
--rpcaddr string HTTP-RPC server监听地址 (默认:localhost)
--rpcport string HTTP-RPC server监听端口(默认: 5000)
使用 "demon [command] --help" 得到特定命令的更多信息
~~~
## 挑战
本区块链项目没有解决区块链分叉问题[fork](https://en.wikipedia.org/wiki/Fork_(blockchain));此外,还没没有实现节点内存池,这反过来又影响了在系统中拥有多个挖矿节点和全节点的能力,轻节点也还不支持。
## 下一步
* 改善Memorypool和Mining的实现
* 节点内存池
* 单元测试覆盖
* 改善错误处理
* 脚本语言支持(智能合约支持)
* 解决分叉问题(fork)
* 挖矿节点(轻节点)
* 验证节点(轻节点)
* 节点docker发布(包含的docker compose)
- 重要更新说明
- linechain发布
- linechain新版设计
- 引言一
- 引言二
- 引言三
- vs-code设置及开发环境设置
- BoltDB数据库应用
- 关于Go语言、VS-code的一些Tips
- 区块链的架构
- 网络通信与区块链
- 单元测试
- 比特币脚本语言
- 关于区块链的一些概念
- 区块链组件
- 区块链第一版:基本原型
- 区块链第二版:增加工作量证明
- 区块链第三版:持久化
- 区块链第四版:交易
- 区块链第五版:实现钱包
- 区块链第六版:实现UTXO集
- 区块链第七版:网络
- 阶段小结
- 区块链第八版:P2P
- P2P网络架构
- 区块链网络层
- P2P区块链最简体验
- libp2p建立P2P网络的关键概念
- 区块链结构层设计与实现
- 用户交互层设计与实现
- 网络层设计与实现
- 建立节点发现机制
- 向区块链网络请求区块信息
- 向区块链网络发布消息
- 运行区块链
- LineChain
- 系统运行流程
- Multihash
- 区块链网络的节点发现机制深入探讨
- DHT
- Bootstrap
- 连接到所有引导节点
- Advertise
- 搜索其它peers
- 连接到搜到的其它peers
- 区块链网络的消息订发布-订阅机制深入探讨
- LineChain:适用于智能合约编程的脚本语言支持
- LineChain:解决分叉问题
- LineChain:多重签名
- libp2p升级到v0.22版本
- 以太坊基础
- 重温以太坊的树结构
- 世界状态树
- (智能合约)账户存储树
- 交易树
- 交易收据树
- 小结
- 以太坊的存储结构
- 以太坊状态数据库
- MPT
- 以太坊POW共识算法
- 智能合约存储
- Polygon Edge
- block结构
- transaction数据结构
- 数据结构小结
- 关于本区块链的一些说明
- UML工具-PlantUML
- libp2p介绍
- JSON-RPC
- docker制作:启动多个应用系统
- Dockerfile
- docker-entrypoint.sh
- supervisord.conf
- docker run
- nginx.conf
- docker基础操作整理
- jupyter计算交互环境
- git技巧一
- git技巧二
- 使用github项目的最佳实践
- windows下package管理工具