linechain发布

undefinedLineChain(来链)发布

自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(GPL) 有可能是开源界最常用的许可模式。GPL 保证了所有开发者的权利,同时为使用者提供了足够的复制,分发,修改的权利:

1.可自由复制

你可以将软件复制到你的电脑,你客户的电脑,或者任何地方。复制份数没有任何限制。

2.可自由分发

在你的网站提供下载,拷贝到U盘送人,或者将源代码打印出来从窗户扔出去(环保起见,请别这样做)。

3.可以用来盈利

你可以在分发软件的时候收费,但你必须在收费前向你的客户提供该软件的 GNU GPL 许可协议,以便让他们知道,他们可以从别的渠道免费得到这份软件,以及你收费的理由。

4.可自由修改

如果你想添加或删除某个功能,没问题,如果你想在别的项目中使用部分代码,也没问题,唯一的要求是,使用了这段代码的项目也必须使用 GPL 协议。

4、README 更新

undefinedLineChain Readme

undefined区块链构成图

linechain发布 - 图1

实现了区块链所需的关键功能:

  • Blockchain结构
  • Nodes节点
  • 共识算法, Blocks & Proof Of Work (POW)
  • Wallet钱包
  • Transactions交易
  • Uspent Transaction Output (UTXO)
  • Merkle Tree
  • Networking (P2P/分布式系统)网络层:p2plib
  • Database:高性能数据库badger

undefined文件清单

文件夹内容
./p2p网络层
./cmdCLI脚本,可与blockchain交互
./Binaries可执行文件夹,如 Wallet等
./walletWallet源码
./api使用Go, Python, Rust 和 JS 等编写的API封装

undefined关于部署

可部署在windows、linux系统的电脑上,以及任意支持交叉编译go的其它操作系统的终端,每个部署程序的都是一个全节点。 不同终端启动节点的命令参数 instanceId 可以相同。 同一个终端部署多个节点用于开发和测试用,需要使用不同的instanceId区分不同的终端。 运行节点的计算机,不需要安装第三方依赖库。

undefinedBlockchain

Blockchain 定义为一个存储区块的数据库,在数据库中,每一个区块链接到前一个区块。

undefinedNodes

Nodes 可被定义为任何类型的设备(主要是计算机), 手机, 笔记本电脑, 大数据中心。Nodes建立区块链网络基础架构,没有node就没有网络。所有nodes彼此连接,它们通常互相交换最新的区块链数据,确保所有节点保持最新。节点的主要作用包括但不限于:存储区块链数据,验证新的交易和区块,帮助新的和已经存在的节点保持最新。

区块链由三类节点组成:

undefinedMining Nodes

这是区块链网络中最重要的节点,他们保持网络运行,它们负责挖出新的币,它们验证交易,验证和挖出新的区块。

undefinedFull Nodes

这类节点负责为矿工验证新的交易,管理内存池(未验证的交易),以及验证新的区块。

undefinedOrdinary Nodes

这类节点是网络的一部分,保持网络运行,它们更多验证网络上的新节点。

undefinedGerneral Nodes

这类节点是网络的大多部分,保持网络运行。

本区块链支持fullnodemining nodegerneral node,但只是分工不同,他们都是全节点(以后将考虑升级支持轻节点)。

undefined共识算法,挖矿, 区块 与 Proof Of Work (POW)

本项目实现了Proof of work算法,POW被bitcoin和litecoin使用。

undefinedBlocks 图表

linechain发布 - 图2

undefined我们如何知道一个区块是否合法?

我们检查两件事:

  • 我们检查前一个区块引用是否存在和合法。
  • 我们检查该区块的POW合法.

undefinedWallet

钱包系统类似于银行账户,包括一对公私密钥。密钥用于跟踪拥有者权属、接受和发出加密货币。 钱包系统独立于区块链网络。

undefined钱包、地址、余额关联图

linechain发布 - 图3

undefinedCommands

这里命令参数 intanceid 请与 blockchain 的 instanceId 保持一致,以指定钱包文件的目录。

产生一个新钱包

  1. ./wallet new --intanceid INSTANCE_ID

打印所有本地钱包

  1. ./wallet print --intanceid INSTANCE_ID

根据地质打印钱包

  1. ./wallet print --address ADDRESS --intanceid INSTANCE_ID

undefinedTransactions

一个交易是在钱包之间的价值传送。它由交易输入和交易输出组成。交易输入由已花费币数组组成,同时交易输出由未花费币数组组成。交易由私钥签名,以证明一个用户确实是拥有这些币。交易初始化后发送到网络,随后网络节点们使用该用户的公钥对该交易执行一序列验证。

undefinedMemory pool

交易池是一个未确认交易的等待区。当一个用户发出了一个交易后,该交易被发送给网络上的所有全节点,全节点验证交易后,将它们放入到它们的内存池中,同时等待矿工节点拾起它,并包含到下一个区块中。

undefinedUspent Transaction Output (UTXO) Model

得益于bitcoin区块链,这个概念变得真正流行起来,它定义为一个区块链交易未花费的输出。

它们可用于新的交易(只要您用私钥解锁它们),这使得他们变得有用。当一个用户试着发送X数量的币给Y用户,UTXOs用作输入,该用户可以解锁它们。 计算一个钱包的balance(余额)可以通过将被特定地址锁定的所有未花费交易输出相加得到。

undefined为什么我们需要这个 ?

balance(余额) 区块链数据相当冗长,其大小可为从几百到几亿的数据,通过区块链计算一个用户的钱包余额相当昂贵,UTXOs作为一个拯救手段可降低费用。UTXOs不是完全聪明,但是一个进步,而每一个主意都有它的权衡。

undefined它是如何工作的?

UTXOs被存储在BadgerDB,提供特别的命令执行这个,但记住,UTXOS是从创世区块开始创建的,UTXOS是从创世区块开始的区块链中创建的,每次执行新交易时都会进行计算,并且每次用户检查其余额时和添加新区块时都会进行计算。

undefinedMerkle Tree

Merkle树可以简单地定义为二进制哈希树数据结构,它由一组节点组成,在树的底部包含大量底层节点,这些底层节点包含基础数据,还有一组中间节点,其中每个节点都是哈希,最后也是一个由其两个子节点的哈希组成的单个根节点,称为merkle根的树的“顶部”,这使得能够快速验证区块链数据以及快速移动区块链数据。 在merkle树算法上执行事务生成单个哈希,该哈希是一串数字和字母,可用于验证给定的数据集与原始事务集相同。

undefinedMerkle 树示例

linechain发布 - 图4

undefinedNetworking (peer-to-peer)

区块链协议在互联网上运行,在P2P网络上,计算机运行该协议,并持有相同的交易账本的副本,通过共识机制实现P2P价值交易。在计算上,p2p是一个对等网络,它可以以相同的能力(在计算方面可能有所不同)和功能来存储和共享文件。它们同时扮演服务器和客户端,实时交换信息,当一个节点扮演客户端时候,它从其它网络节点下载文件。但当他们以服务器工作时,它们成为源头,其它节点从这里下载文件。P2P网络不存在单点故障,即使在诸如容错等错误事件时依然能使系统继续正常运行。P2P网络是区块链必不可少的一个部分,因为它允许区块链数据分布于多节点/终端,防止困扰无数系统的Denial-of-Service (DoS)攻击,使他们无法接受中央机构的审查。P2P的主要局限性在于在所有同级之间保持数据一致的能力(主观),而且工作量的证明对于功能较弱的计算机而言过于计算昂贵,并且随着区块链变得更大且难度增加,这种情况只会变得更糟 这意味着具有较低计算能力的节点最终会离开,但从好的方面来说,P2P使去中心化成为可能,并为区块链提供整体安全性。

undefinedNetwork 概览

linechain发布 - 图5

undefinedDemon CLI

这是本项目官方的命令行工具,命令行工具允许开发者与区块链网络交互。

undefinedBuild CLI

导航到cmd/demon目录,运行以下命令创建cli:

  1. go build

undefined可执行的命令清单

  1. 请注意,所有的命令,都需要加上instanceid参数

undefined产生一个新钱包.这里intanceid请与blockchain的instanceId保持一致,以指定钱包文件的目录

  1. ./demon wallet new --intanceid INSTANCE_ID

undefined列出所有钱包地址.这里intanceid请与blockchain的instanceId保持一致,以指定钱包文件的目录

  1. ./demon wallet listaddress --intanceid INSTANCE_ID

undefined获得余额

  1. ./demon wallet balance --address ADDRESS --intanceid INSTANCE_ID

undefined打印区块链信息

  1. ./demon print --intanceid INSTANCE_ID

undefined计算UTXOs

  1. ./demon computeutxos --intanceid INSTANCE_ID

undefined发送

  1. ./demon send --sendfrom ADDRESS --sendto ADDRESS --amount AMOUNT --intanceid INSTANCE_ID

undefined启动一个RPC服务器

默认端口是5000./demon —rpc true —rpcport 4000 —intanceid INSTANCE_ID

undefined开始一个节点

作为矿工 ./demon startnode —port PORT —address MINER_ADDRESS —miner —instanceid INSTANCE_ID

作为全节点 ./demon startnode —port PORT —fullnode —instanceid INSTANCE_ID

如果这些标志在.env文件中已经存在,address, fullnode, miner 和 port 标志均为可选参数。

undefined项目安装

undefined将下面的信息添加到Env文件中(必须)

  1. WALLET_ADDRESS_CHECKSUM = 4

undefined矿工的其它信息(可选)

  1. WALLET_ADDRESS_CHECKSUM = 4
  2. MINER_ADDRESS = <YOUR_WALLET_ADDRESS>
  3. MINER = true

undefinedStart a node

undefinedNB: 运行多个区块链实例需要你使用—instanceid初始化一个新的区块链,随后访问该实例时候也需要用到它,区块链的数据库以instanceid命名。一个节点只有一个唯一的instanceid,该节点的所有针对区块链的操作均与其有关

undefinedInitialize a blockchain

这个命令创建创世区块,并初始化区块链。Instanceid允许你运行该区块链的多个实例,它必须是一个字符串,如5000 ./demon init —address —instanceid

undefined在启用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

undefined节点JSON-RPC服务器

创建钱包 示例 curl -X POST -H "Content-Type: application/json" -d '{"id": 1, "method": "API.CreateWallet", "params": []}'http://localhost:5000/_jsonrpc

获得余额 示例

  1. curl -X POST -H "Content-Type: application/json" -d '{"id": 1, "method": "API.GetBalance", "params": [{"Address":"1EWXfMkVj3dAytVuUEHUdoAKdEfAH99rxa"}]}' http://localhost:5000/_jsonrpc

得到区块链 示例

  1. curl -X POST -H "Content-Type: application/json" -d '{"id": 1,"method": "API.GetBlockchain", "params": []}' http://localhost:5000/_jsonrpc

通过Height得到区块 示例

  1. curl -X POST -H "Content-Type: application/json" -d '{"id": 1,"method": "API.GetBlockByHeight", "params": ["Height":1]}' http://localhost:5000/_jsonrpc

发送 示例

  1. 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

undefined命令行用法

  1. 用法:
  2. demon [flags]
  3. demon [command]
  4. 可用Commands:
  5. computeutxos 重建和计算Unspent transaction outputs
  6. help 关于任何命令的帮助
  7. init 初始化区块链并创建创始区块
  8. print 打印区块链里面的区块信息
  9. send 从本地钱包地址发送X数量的币给一个地址
  10. startnode 开始一个节点
  11. wallet 管理钱包
  12. Flags:
  13. --address string 钱包地址
  14. -h, --help demon命令帮助
  15. --instanceid string 节点实例ID(所有命令都必须加此参数)
  16. --rpc 启用HTTP-RPC server
  17. --rpcaddr string HTTP-RPC server监听地址 (默认:localhost)
  18. --rpcport string HTTP-RPC server监听端口(默认: 5000)
  19. 使用 "demon [command] --help" 得到特定命令的更多信息

undefined挑战

本区块链项目没有解决区块链分叉问题fork);此外,还没没有实现节点内存池,这反过来又影响了在系统中拥有多个挖矿节点和全节点的能力,轻节点也还不支持。

undefined下一步

  • 改善Memorypool和Mining的实现
  • 节点内存池
  • 单元测试覆盖
  • 改善错误处理
  • 脚本语言支持(智能合约支持)
  • 解决分叉问题(fork)
  • 挖矿节点(轻节点)
  • 验证节点(轻节点)
  • 节点docker发布(包含的docker compose)