# gitcoin **Repository Path**: B24D/gitcoin ## Basic Information - **Project Name**: gitcoin - **Description**: 基于Go的比特币实现 - **Primary Language**: Go - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-04-12 - **Last Updated**: 2022-04-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 基于Go的比特币实现 ### 简介 本项目使用Go对比特币进行了简单实现,主要包括: - 实现基于工作量证明机制的共识算法 - 实现基于UTXO模型的交易验证及转账、挖矿奖励功能 - 基于ECDSA算法及Base58实现地址及数字签名 - 使用BoltDB完成区块链数据的持久化 ### 项目演示 进入项目目录,build代码,并将目录加入系统环境变量PATH 打开一个终端窗口,将 `NODE_ID` 设置为 3000(`SET NODE_ID=3000`) 为了区分不同节点执行的操作,本文将使用 `NODE 3000` 或 `NODE 3001` 对节点进行标识 #### NODE 3000 1. 创建一个钱包,记为` CENTREAL_NODE`: ```bash $ gitcoin createwallet ``` 2. 创建一个新的区块链: ```bash $ gitcoin createblockchain -address CENTREAL_NODE ``` (为了简洁起见,本文后续使用地址标签代替真实地址,如使用` CENTREAL_NODE`代替` 13kwFBYnaanzzU2aEdbbNAEjpRQxLu3kHK`) 之后会生成一个仅包含创世块的区块链。我们需要保存块,并在其他节点使用。创世块承担了一条链标识符的角色 ```bash $ COPY blockchain_3000.db blockchain_genesis.db ``` #### NODE 3001 打开一个新的终端窗口,将 `NODE_ID` 设置为 3001。此终端会作为一个钱包节点。通过 `gitcoin createwallet` 生成一些地址,记作 ` WALLET_1`, ` WALLET_2`, ` WALLET_3`,` WALLET_4` #### NODE 3000 向钱包地址发送一些币: ```bash $ gitcoin send -from CENTREAL_NODE -to WALLET_1 -amount 10 -mine $ gitcoin send -from CENTREAL_NODE -to WALLET_2 -amount 10 -mine ``` `-mine` 标志指块会立刻被同一节点挖出。此处必须要有这个标志,因为初始状态时,网络中没有矿工节点 启动节点: ```bash $ gitcoin startnode ``` 此节点会持续运行,直到本文定义的场景结束 #### NODE 3001 启动上面保存创世块节点的区块链: ```bash $ COPY blockchain_genesis.db blockchain_3001.db ``` 运行节点: ```bash $ gitcoin startnode ``` 本节点会从中心节点下载所有区块。暂停节点运行并检查余额: ```bash $ gitcoin getbalance -address WALLET_1 Balance of 'WALLET_1': 10 $ gitcoin getbalance -address WALLET_2 Balance of 'WALLET_2': 10 ``` 你还可以检查 `CENTRAL_NODE` 地址的余额,因为 `NODE 3001` 现在有它自己的区块链: ```bash $ gitcoin getbalance -address CENTRAL_NODE Balance of 'CENTRAL_NODE': 10 ``` #### NODE 3002 打开一个新的终端窗口,将 `NODE_ID` 设置为 3002,生成一个钱包,记作` MINER_WALLET` ```bash $ gitcoin createwallet ``` 该终端将作为一个矿工节点。初始化区块链: ```bash $ COPY blockchain_genesis.db blockchain_3002.db ``` 启动节点: ```bash $ gitcoin startnode -miner MINER_WALLET ``` #### NODE 3001 进行转账操作: ```bash $ gitcoin send -from WALLET_1 -to WALLET_3 -amount 1 $ gitcoin send -from WALLET_2 -to WALLET_4 -amount 1 ``` #### NODE 3002 迅速切换到矿工节点,可以看到新块被挖出 ![](https://fanwb.oss-cn-beijing.aliyuncs.com/img/uTools_1649841006128.png) 同时检查中心节点的输出 #### NODE 3001 切换到钱包节点并启动: ```bash $ gitcoin startnode ``` 该节点将下载最近挖出来的块,暂停节点并检查余额: ```bash $ gitcoin getbalance -address WALLET_1 Balance of 'WALLET_1': 9 $ gitcoin getbalance -address WALLET_2 Balance of 'WALLET_2': 9 $ gitcoin getbalance -address WALLET_3 Balance of 'WALLET_3': 1 $ gitcoin getbalance -address WALLET_4 Balance of 'WALLET_4': 1 $ gitcoin getbalance -address MINER_WALLET Balance of 'MINER_WALLET': 10 ``` 以上演示,通过本地不同终端的操作模拟了P2P网络中区块链的创建、地址生成,转账,挖矿,激励等主要功能