# 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
## 區塊鏈構成圖

實現了區塊鏈所需的關鍵功能:
* 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 圖表

### 我們如何知道一個區塊是否合法?
我們檢查兩件事:
1. 我們檢查前一個區塊引用是否存在和合法。
2. 我們檢查該區塊的POW合法.
## Wallet
錢包系統類似于銀行賬戶,包括一對公私密鑰。密鑰用于跟蹤擁有者權屬、接受和發出加密貨幣。 錢包系統獨立于區塊鏈網絡。
### 錢包、地址、余額關聯圖

### 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 樹示例

### Networking (peer-to-peer)
區塊鏈協議在互聯網上運行,在P2P網絡上,計算機運行該協議,并持有相同的交易賬本的副本,通過共識機制實現P2P價值交易。在計算上,p2p是一個對等網絡,它可以以相同的能力(在計算方面可能有所不同)和功能來存儲和共享文件。它們同時扮演服務器和客戶端,實時交換信息,當一個節點扮演客戶端時候,它從其它網絡節點下載文件。但當他們以服務器工作時,它們成為源頭,其它節點從這里下載文件。P2P網絡不存在單點故障,即使在諸如容錯等錯誤事件時依然能使系統繼續正常運行。P2P網絡是區塊鏈必不可少的一個部分,因為它允許區塊鏈數據分布于多節點/終端,防止困擾無數系統的Denial-of-Service (DoS)攻擊,使他們無法接受中央機構的審查。P2P的主要局限性在于在所有同級之間保持數據一致的能力(主觀),而且工作量的證明對于功能較弱的計算機而言過于計算昂貴,并且隨著區塊鏈變得更大且難度增加,這種情況只會變得更糟 這意味著具有較低計算能力的節點最終會離開,但從好的方面來說,P2P使去中心化成為可能,并為區塊鏈提供整體安全性。
#### Network 概覽

## 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管理工具