{"content":{"title":"区块链基础教程 1 # ETH & BTC 私链搭建","body":"- 记录一下区块链的个人学习笔记，当前公链生态中最主流的是 BTC 和 ETH 链，因此本文介绍 BTC & ETH 的私有链搭建教程，为后续基于 ETH & BTC 的进一步程序开发做好准备。\r\n- 说明：本机环境 Mac 12.2.1，不同环境可能略有差异\r\n\r\n\r\n# 1 ETH 私有链搭建教程\r\n安装 go-ethereum 客户端\r\n```bash\r\nbrew tap ethereum/ethereum\r\nbrew install ethereum\r\n```\r\n检查安装是否成功：\r\n```bash\r\ngeth --help\r\n```\r\n在 /Desktop/blockchain 下新建 ethereum 目录，在其中再建一个 genesis.json\r\n 文件和一个子目录 /data。\r\n PoW 共识版本的 genesis.json 文件内容如下：\r\n ```json\r\n{\r\n    \"config\": {\r\n      \"chainId\": 1001,\r\n      \"homesteadBlock\": 0,\r\n      \"eip150Block\": 0,\r\n      \"eip150Hash\": \"0x0000000000000000000000000000000000000000000000000000000000000000\",\r\n      \"eip155Block\": 0,\r\n      \"eip158Block\": 0,\r\n      \"byzantiumBlock\": 0,\r\n      \"constantinopleBlock\": 0,\r\n      \"petersburgBlock\": 0,\r\n      \"istanbulBlock\": 0,\r\n      \"ethash\": {}\r\n    },\r\n    \"nonce\": \"0x0\",\r\n    \"timestamp\": \"0x5ddf8f3e\",\r\n    \"extraData\": \"0x0000000000000000000000000000000000000000000000000000000000000000\",\r\n    \"gasLimit\": \"0x47b760\",\r\n    \"difficulty\": \"0x00002\",\r\n    \"mixHash\": \"0x0000000000000000000000000000000000000000000000000000000000000000\",\r\n    \"coinbase\": \"0x0000000000000000000000000000000000000000\",\r\n    \"alloc\": { },\r\n    \"number\": \"0x0\",\r\n    \"gasUsed\": \"0x0\",\r\n    \"parentHash\": \"0x0000000000000000000000000000000000000000000000000000000000000000\"\r\n  }\r\n ```\r\n 由于 eth 经历过一次升级从 PoW 改为 PoS，[目前最新版的 geth 已经不再内置 ethash](https://www.odaily.news/newsflash/324601)，因此 PoS 的 genesis.json 和之前的文章会略有不同。下面这个是 PoS 版的 genesis.json 文件：\r\n ```json\r\n{\r\n    \"config\": {\r\n      \"chainId\": 8888,\r\n      \"homesteadBlock\": 0,\r\n      \"eip150Block\": 0,\r\n      \"eip155Block\": 0,\r\n      \"eip158Block\": 0,\r\n      \"byzantiumBlock\": 0,\r\n      \"constantinopleBlock\": 0,\r\n      \"petersburgBlock\": 0,\r\n      \"istanbulBlock\": 0,\r\n      \"berlinBlock\": 0,\r\n      \"clique\": {\r\n        \"period\": 5,\r\n        \"epoch\": 30000\r\n      }\r\n    },\r\n    \"difficulty\": \"1\",\r\n    \"gasLimit\": \"8000000\",\r\n    \"extradata\": \"0x0000000000000000000000000000000000000000000000000000000000000000b7e24438A3fe363f46994feEEdfbF5ad5078378d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\",\r\n    \"alloc\": {\r\n      \"27883476a0a617d8e6aa40888253608a0e05cfa4\": { \"balance\": \"300000\" },\r\n      \"b7e24438A3fe363f46994feEEdfbF5ad5078378d\": { \"balance\": \"300000\" },\r\n      \"87edfb2aed4875144fe1c3b28870284881990418\": { \"balance\": \"300000\" }\r\n    }\r\n  }\r\n```\r\n \r\n运行\r\n```bash\r\ngeth --datadir data init ./genesis.json\r\n```\r\n顺利初始化一条以太坊私链：\r\n![截屏2023-12-11 下午3.33.42.png](https://img.learnblockchain.cn/attachments/2023/12/bNZejImK6576bb8b2cc36.png)\r\n此时的目录结构如图所示：\r\n![截屏2023-12-11 下午3.35.39.png](https://img.learnblockchain.cn/attachments/2023/12/ROESUEDF6576bbcfe0ffa.png)\r\n目录说明：\r\n- keystore 用来保存账户信息\r\n- geth 用来保存区块信息\r\n\r\n启动以太坊私链：\r\n```bash\r\ngeth --datadir data --networkid 8888 console 2>geth.log\r\n```\r\n- networkid  为上面的 genesis.json 配置的 id，以太坊主网 id 为 1\r\n- 2>geth.log 这里的 2 是代表 stderr，这里是为了让私链的以太坊日志独立输出，防止影响命令行交互的显示\r\n\r\n![截屏2023-12-11 下午3.54.18.png](https://img.learnblockchain.cn/attachments/2023/12/N4Sa8lHi6576c030bd11c.png)\r\n\r\n 至此 ETH 私链搭建完成。\r\n\r\n# 2 BTC 私有链搭建教程\r\n在 bitcoin 官方查看 btc 客户端版本：https://bitcoin.org/bin/\r\n这里演示 Mac 下的操作，不同系统会略有差异，下载 https://bitcoin.org/bin/bitcoin-core-25.0/bitcoin-25.0-x86_64-apple-darwin.tar.gz   \r\n```bash\r\ntar -zvxf bitcoin-25.0-x86_64-apple-darwin.tar.gz   \r\nsudo install -m 0755 bitcoin-25.0/bin/* /usr/local/bin\r\n```\r\n后台运行：\r\n```bash\r\nbitcoind -daemon\r\n```\r\n测试是否搭建成功：\r\n```bash\r\nbitcoin-cli getdifficulty\r\nbitcoin-cli listtransactions\r\nbitcoin-cli stop\r\n```\r\n新建配置文件：~/.bitcoin/bitcoin.conf\r\n```conf\r\n# Generated by https://jlopp.github.io/bitcoin-core-config-generator/\r\n\r\n# This config should be placed in following path:\r\n# ~/.bitcoin/bitcoin.conf\r\n\r\n# [rpc]\r\n# Accept command line and JSON-RPC commands.\r\nserver=1\r\ntxindex=1\r\n\r\n# Username for JSON-RPC connections\r\nrpcuser=bitcoinrpc\r\n\r\n# Password for JSON-RPC connections\r\nrpcpassword=bitcoinrpc\r\n\r\n# Listen for JSON-RPC connections on this port\r\n# rpcport=18332\r\n# Allow JSON-RPC connections from specified source. Valid for <ip> are a single IP (e.g. 1.2.3.4), \r\n# a network/netmask (e.g. 1.2.3.4/255.255.255.0) or a network/CIDR (e.g. 1.2.3.4/24). This option \r\n# can be specified multiple times.\r\n# rpcallowip=127.0.0.1\r\n# rpcallowip=127.0.0.1\r\n\r\n# 设定默认为私有链\r\nregtest=1\r\n#gen=1 表示节点可以挖矿\r\ngen=0\r\n```\r\n启动服务：\r\n```bash\r\nbitcoind -conf=/Users/yuanbo.xie/.bitcoin/bitcoin.conf\r\n```\r\n![截屏2023-12-12 下午3.13.55.png](https://img.learnblockchain.cn/attachments/2023/12/iTKXwvoq657808361f88b.png)\r\n启动成功。\r\n\r\n\r\n# 3 常见问题排查\r\n由于众所周知的原因，在国内最常见的是网络问题。以下命令撤销原本的 git proxy 设置：\r\n```bash\r\ngit config --global --unset http.proxy\r\ngit config --global --unset https.proxy\r\n```\r\n如果本地开了指定端口的代理请设置为对应端口。\r\n\r\n\r\nLibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443\r\n如果遇到 SSL 报错，可以关闭（但存在安全风险）：\r\n```bash\r\ngit config --global http.sslVerify false\r\n```\r\n\r\n权限问题：brew 安装 ethereum 时权限不够\r\n```bash\r\nsudo chown -R $(whoami) /usr/local/bin /usr/local/lib\r\n```\r\n\r\n查看 chainid 是否被占用： [chainlist](https://chainlist.org/?search=)\r\n\r\nMac 无法打开“\\*\\*\\*”，因为无法验证开发者的问题解决：\r\n**command+shift+G** 输入 /usr/local/bin 第一次手工点击 bitcoind 然后打开，后续就可以从命令后调用了\r\n\r\n\r\n\r\n\r\n# Reference\r\n[1] [区块链开发学习第一章：Mac搭建以太坊私有链](https://www.cnblogs.com/I-will-be-different/p/15501145.html)\r\n[2] [以太坊上创建并实现PoS私链](https://zhuanlan.zhihu.com/p/653867761)\r\n[3] [搭建比特币私链](https://zhuanlan.zhihu.com/p/410893203)"},"author":{"user":"https://learnblockchain.cn/people/17075","address":null},"history":"bafkreick6dh4kmdrya4heuqjo6esveyuwhjqq6hnts2scoh4zqmgruxhr4","timestamp":1702368169,"version":1}