title: 79.以太坊POW私链搭建 CreateTime: 2023-11-17 18:43:12 UpdateTime: 2024-05-31 12:24:50 CategoryName: BlockChain --- ## 1.准备环境 ```shell ## 安装依赖 yum -y install openssl-devel zlib-devel libtool automake autoconf make yum -y install git gcc gcc-c++ ## 安装go语言环境 wget https://golang.google.cn/dl/go1.16.15.linux-amd64.tar.gz ## 配置go的环境变量 #设置 go 代理 go env -w GOPROXY=https://goproxy.cn,direct ## 下载代码 #git clone https://github.com/ethereum/go-ethereum.git ## pow共识版本 #git reset --hard 141cd425310b503c5678e674a8c3872cf46b7086 git clone https://github.com/fedimoss/go-ethereum.git ## 编译 make geth ## 或者直接编译,没有提示语 # go run build/ci.go install ./cmd/geth ## Done building. ## Run "./build/bin/geth" to launch geth. ## 构建全部程序 # make all ## 软连接,方便测试 ln -s ./build/bin/geth ./ ``` ## 2.启动程序 ### 创世块配置(genesis.json) ```json { "config":{ "chainId":2024, "homesteadBlock":0, "daoForkSupport":false, "eip155Block":0, "eip158Block":0, "eip150Block":0, "eip150Hash":"0x0000000000000000000000000000000000000000000000000000000000000000", "byzantiumBlock":0, "constantinopleBlock":0, "petersburgBlock":0, "istanbulBlock":0, "muirGlacierBlock":0, "berlinBlock":0, "londonBlock":0, "arrowGlacierBlock":0, "grayGlacierBlock":0, "ethash": {} }, "coinbase":"0x0000000000000000000000000000000000000000", "difficulty":"0x400000000", "extraData":"", "gasLimit":"0x2cd29c0", "nonce":"0x121eb8a", "mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000", "parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000", "timestamp":"0x25c85d00", "alloc":{} } ``` ### 配置参数详解 **config**: 这个部分包含了一系列的网络配置参数,用于定义您的私有链的行为和规则. **chainId**: 私有链的唯一标识符.在这个示例中,chainId 设置为 2024. **homesteadBlock**: 切换到 Homestead 协议版本的块高度.在这个示例中,设置为 0,表示从创世块就采用 Homestead 协议. **daoForkBlock**: 切换到 DAO 协议版本的块高度,新链不要设置.如果设置为0,会出现Error: bad DAO pro-fork extra-data. **daoForkSupport**: 指定是否支持 DAO 分叉.在这个示例中,设置为 false,不支持 DAO 分叉. **byzantiumBlock**、**constantinopleBlock**、**eip155Block**、**eip158Block**、**eip150Block**: 类似于 **homesteadBlock**,分别指定了切换到对应协议版本的块高度. **eip150Hash**: 一个用于安全性的哈希值,与 EIP-150 相关. **coinbase**: 矿工的账户地址,用于接收挖矿奖励.在这个示例中,设置为一个全零的地址. **difficulty**: 难度目标值,它控制了挖矿的难度.在这个示例中,设置为 0x400000000,测试环境建议调小难度. **extraData**: 附加的数据,通常在挖矿过程中包含一些附加信息. **gasLimit**: 每个区块所允许的最大燃料消耗量.在这个示例中,设置为 0x1388,表示最大值. **nonce**: 一个随机数,用于标识区块的唯一性.在这个示例中,设置为一个非零的值. **mixhash**: 一个用于工作量证明的哈希值,与挖矿相关. **parentHash**: 前一个区块的哈希值,用于构建区块链. **timestamp**: 区块的时间戳,表示区块创建的时间.在这个示例中,设置为 0x00,表示创世块的时间戳. **alloc**: 初始分配的以太币和其他代币 ### 启动geth ```shell ## 初始化写入创世区块 ./geth init --datadir data genesis.json # Successfully wrote genesis state 表示成功初始化 ## 启动geth ./geth --datadir data --networkid 2024 --syncmode "full" --cache 18000 --rpc.allow-unprotected-txs --txlookuplimit 0 --http --http.addr "0.0.0.0" --http.port 8545 --http.corsdomain "*" --http.api "net,web3,eth" --port 30303 --authrpc.addr "0.0.0.0" --authrpc.port 8551 --allow-insecure-unlock --mine console 2>>geth.log ## nohup ./geth --datadir data --networkid 2024 --http --http.api "net,web3,eth" --http.port 8545 --http.corsdomain "*" --http.addr "0.0.0.0" --port 30303 --mine & ## Welcome to the Geth JavaScript console! 表示启动成功 ## 写入账号密码 echo "123456" > password ### 打开控制台 ./geth attach --datadir ./data ``` **geth**: 这是执行 geth 客户端的命令. **--datadir**: 这个选项指定了数据目录的路径,geth 将在这个目录中存储区块链数据和相关文件. **--networkid**: 指定私有链的网络标识符,这个值用于在不同私有链之间进行区分. **--http**: 启用 HTTP-RPC 通信接口,允许通过 HTTP 请求与 geth 进行交互. **--http.addr**: 设置 HTTP-RPC 服务监听的地址,0.0.0.0 表示允许来自任何 IP 地址的连接. **--http.port**: 指定 HTTP-RPC 服务的端口号,一般是 8545. **--http.corsdomain**: 配置允许跨域请求的域名,设置为 "*" 表示允许任何域名进行跨域请求. **--http.api**: 指定启用的 HTTP-RPC 接口,这里列出了一些常用的接口, "db,eth,net,web3,personal,web3" 包括数据库、以太坊操作、网络信息、Web3 功能和个人账户操作. **--port**: 设置 geth 节点的 P2P 网络端口,用于节点间的通信,默认 30303. **--allow-insecure-unlock**: 允许以不安全的方式解锁账户.这在测试环境中使用,允许在 HTTP-RPC 上发送解锁账户的请求,但在生产环境中不建议使用. **--mine**: 开启挖矿,需要先 ```./geth --datadir data account new``` 创建一个矿工. **--ipcdisable**: 每个节点ipc唯一或者禁用ipc,使用参数```--ipcpath```或者```--ipcdisable``` **--nodiscover**: geth.toml参数为 ```NoDiscovery = true``` 说明该节点不能被发现.只是能不能被发现的区别,都是可以被连接的. **--nat extip:**: 指定节点IP,其他节点尝试连接指定的IP,解决内网中的节点通信问题. ### 控制台操作 ```js // 打开控制台 ./geth attach --datadir ./data //查询账户 eth.accounts // 新开窗口,使用geth创建一个新的账户 // 需要指定你的datadir文件加,否则会创建在默认的文件夹下,务必记录私钥文件 // ./geth --datadir data account new //再次查询账户 eth.accounts // exit 退出控制台,可以使用 geth console 重新进入控制台 //设置矿工address,刚才创建的账户 miner.setEtherbase("0x81694fa39b1e810823810e4ffa2afc82820fa0a3") //开始挖矿 miner.start() //停止挖矿 miner.stop() //查询挖矿余额 web3.fromWei(eth.getBalance(eth.coinbase), "ether") web3.fromWei(eth.getBalance(eth.accounts[0]), "ether") web3.fromWei(eth.getBalance("0x9C4205bb28B4AC92e58D8f09Fb1D4381ACaE34dc"), "ether") //查看当前矿工算力 miner.hashrate // 查询区块高度 eth.blockNumber // 查询区块信息 eth.getBlock(1) // 查询交易信息 eth.getTransaction("0x8d37acc5da863a56f39c87aca0767f699135427575188d4fc59078509d3d8a1f") // 查询交易信息 eth.getTransactionReceipt("0x4c85d0859065ce1d15db33b8423c29cf36c41beb1253b0f10b72af3a36aaa57b") // 查看本机节点信息 admin.nodeInfo //查看peers admin.peers //查看网络状态 net.peerCount //查看同步状态 eth.syncing //查看挖矿状态 miner.status //退出 exit //转账 //1.解锁 personal.unlockAccount("0x91fB03D7042906c1db67d9e16966f0feB34D8A6C","123456") //2.转账,地址使用双引号 //amount=web3.toWei(10,"ether") //eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount}) eth.sendTransaction({from:"0x91fB03D7042906c1db67d9e16966f0feB34D8A6C", to:"0xDd42A396d7E47475f3D9099e0CF3403a835Debb4", value:web3.toWei(10,"ether")}) //返回交易hash // 查询交易信息 eth.getTransaction("0x248eaf614820b79b2d2f2a75e0bb62f99a5ef231ab89dfb2917a180cedf5f932") //3.查询余额 web3.fromWei(eth.getBalance("0xe3a970a8E105Ce624bDb4667A2507D352695b026"), "ether") // 添加其他节点 admin.addPeer("enode://") ``` ## 验证私链 ```shell // 使用钱包生成账户私钥,并控制台导入 //web3.ssh.addPrivateKey("0xcf2bde5348c5f66b9672f442021e23ca154ba8a0b19ea490786145aec18df285").then(console.log); //web3.eth.accounts.privateKeyToAccount("0xcf2bde5348c5f66b9672f442021e23ca154ba8a0b19ea490786145aec18df285"); ## 没有0x前缀的私钥 echo "cf2bde5348c5f66b9672f442021e23ca154ba8a0b19ea490786145aec18df285" > 0xDd42A396d7E47475f3D9099e0CF3403a835Debb4.txt ## 暂停控制台挖矿,导入账户 ./geth --datadir data account import 0xDd42A396d7E47475f3D9099e0CF3403a835Debb4.txt ## 查询账户 eth.accounts ``` ## 发布合约 使用remix/sdk发布合约测试 ## 多节点 参考: https://geth.ethereum.org/docs/fundamentals/private-network **注意:bootnode使用UDP协议,不是TCP协议,防火墙设置时一定要注意!!!!!!!!!!!!** ### bootnode ```bootnode```是一个专门用于网络引导和节点发现的节点,而普通节点是实际参与网络运作的节点.```bootnode```不直接参与交易验证或区块生成,其主要作用是为其他节点提供连接信息,帮助网络中的新节点加入并构建整个区块链网络. ```geth``` 和 ```bootnode``` 是以太坊的两个不同组件,各自有着不同的作用和功能.虽然它们都是以太坊客户端的一部分,但它们并不完全相同,因此不能完全互相替代. ```shell ## 编译bootnode cd cmd/bootnode go build -o bootnode ## 生成 boot.key ./bootnode -genkey boot.key ##启动bootnode ###默认bootnode必须是公网IP,如果使用内网,可以使用netrestrict参数限制网络. -verbosity 5 显示debug日志,用于问题排查 #./bootnode -nodekey boot.key -addr :30301 -netrestrict 192.168.1.1/24 -verbosity 5 ./bootnode -nodekey boot.key -addr :30301 ## 输出如下 #enode://c53daebd8946a1aa617d38d52fa64c4671c9cc8c818288b0f6ebf6b11bafb12a736e6140930a03fa816323ab0aa5d40a061d9c0a23d929b8ae9a5941b813f41c@127.0.0.1:0?discport=30301 ##enode可以简写如下,配置到geth.toml的 BootstrapNodes 和 BootstrapNodesV5 #c53daebd8946a1aa617d38d52fa64c4671c9cc8c818288b0f6ebf6b11bafb12a736e6140930a03fa816323ab0aa5d40a061d9c0a23d929b8ae9a5941b813f41c@192.168.1.121:30301 ``` ### 启动多个节点 ```js // 查看第一个节点的 enode admin.nodeInfo.enode // 1. 使用相同的配置初始化创世块 ./geth init --datadir data genesis.json // 建议手动验证一下创世块的hash // 2. 生成配置文件 ./geth --datadir data --networkid 2024 --syncmode "full" --cache 18000 --rpc.allow-unprotected-txs --txlookuplimit 0 --http --http.addr "0.0.0.0" --http.port 8545 --http.corsdomain "*" --http.api "net,web3,eth" --port 30303 --authrpc.addr "0.0.0.0" --authrpc.port 8551 --mine dumpconfig > ./geth2.toml //注意 删除FilterLogCacheSize,InsecureUnlockAllowed属性,指定 IPCPath,修改 BootstrapNodes BootstrapNodesV5 StaticNodes TrustedNodes 为 ["第一个节点的enode"] // 3. 其他节点使用配置文件启动geth nohup ./geth --config ./geth.toml --mine & // 带密码启动挖矿,只输出ERROR日志 # nohup ./geth --config ./geth.toml --verbosity 0 --mine --unlock 0 --password ./password --allow-insecure-unlock & // 打开控制台 // ./geth attach --datadir ./data // 查看日志 // tail -f nohup.out // 有控制台 // ./geth --config ./geth.toml --mine console 2>>geth.log // 4.新节点创建矿工账户,并开启挖矿,用于同步区块 //./geth --datadir data account new //miner.setEtherbase("0x9C4205bb28B4AC92e58D8f09Fb1D4381ACaE34dc") //miner.start() // 5.检查同步状态: 如果返回 false,表示该节点已经完全同步.如果返回一个对象,表示节点正在同步中.等待所有节点都完成同步 eth.syncing // 查看加入的节点,显示连接到当前节点的其他节点列表. admin.peers // 查询多个节点的相同区块,验证块hash是否一致 eth.getBlock(100) ``` ### geth.toml ```toml [Eth] NetworkId = 2024 SyncMode = "full" EthDiscoveryURLs = [] SnapDiscoveryURLs = [] NoPruning = false NoPrefetch = false TxLookupLimit = 2350000 LightPeers = 100 UltraLightFraction = 75 DatabaseCache = 9000 DatabaseFreezer = "" TrieCleanCache = 2700 TrieCleanCacheJournal = "triecache" TrieCleanCacheRejournal = 3600000000000 TrieDirtyCache = 4500 TrieTimeout = 3600000000000 SnapshotCache = 1800 Preimages = false EnablePreimageRecording = false RPCGasCap = 50000000 RPCEVMTimeout = 5000000000 RPCTxFeeCap = 1e+00 [Eth.Miner] GasFloor = 0 GasCeil = 30000000 GasPrice = 1000000000 Recommit = 3000000000 Noverify = false [Eth.Ethash] CacheDir = "ethash" CachesInMem = 2 CachesOnDisk = 3 CachesLockMmap = false DatasetDir = "data/.ethash" DatasetsInMem = 1 DatasetsOnDisk = 2 DatasetsLockMmap = false PowMode = 0 NotifyFull = false [Eth.TxPool] Locals = [] NoLocals = false Journal = "transactions.rlp" Rejournal = 3600000000000 PriceLimit = 1 PriceBump = 10 AccountSlots = 16 GlobalSlots = 5120 AccountQueue = 64 GlobalQueue = 1024 Lifetime = 10800000000000 [Eth.GPO] Blocks = 20 Percentile = 60 MaxHeaderHistory = 1024 MaxBlockHistory = 1024 MaxPrice = 500000000000 IgnorePrice = 2 [Node] DataDir = "data" IPCPath = "geth.ipc" HTTPHost = "0.0.0.0" HTTPPort = 8545 HTTPCors = ["*"] HTTPVirtualHosts = ["localhost"] HTTPModules = ["net", "web3", "eth"] AuthAddr = "localhost" AuthPort = 8551 AuthVirtualHosts = ["localhost"] WSHost = "0.0.0.0" WSPort = 8546 WSModules = ["net", "web3", "eth"] GraphQLVirtualHosts = ["localhost"] AllowUnprotectedTxs = true [Node.P2P] MaxPeers = 50 NoDiscovery = false BootstrapNodes = ["enode://c53daebd8946a1aa617d38d52fa64c4671c9cc8c818288b0f6ebf6b11bafb12a736e6140930a03fa816323ab0aa5d40a061d9c0a23d929b8ae9a5941b813f41c@192.168.1.121:30301"] BootstrapNodesV5 = ["enode://c53daebd8946a1aa617d38d52fa64c4671c9cc8c818288b0f6ebf6b11bafb12a736e6140930a03fa816323ab0aa5d40a061d9c0a23d929b8ae9a5941b813f41c@192.168.1.121:30301"] StaticNodes = [] TrustedNodes = [] ListenAddr = ":30303" DiscAddr = "" EnableMsgEvents = false [Node.HTTPTimeouts] ReadTimeout = 30000000000 ReadHeaderTimeout = 30000000000 WriteTimeout = 30000000000 IdleTimeout = 120000000000 [Metrics] HTTP = "127.0.0.1" Port = 6060 InfluxDBEndpoint = "http://localhost:8086" InfluxDBDatabase = "geth" InfluxDBUsername = "test" InfluxDBPassword = "test" InfluxDBTags = "host=localhost" InfluxDBToken = "test" InfluxDBBucket = "geth" InfluxDBOrganization = "geth" ``` ## GPU挖矿 挖矿软件(NBMiner) ---> 矿池软件(open-ethereum-pool) ---> 以太坊节点(geth) 不建议使用Windows,本文使用CentOS8 ### 安装CUDA ```shell ### 安装依赖 yum -y install openssl-devel zlib-devel libtool automake autoconf make yum -y install gcc gcc-c++ yum -y install kernel-devel ## 下载最新的 CUDA驱动,已经带有显卡驱动,不要再单独安装显卡驱动了 wget https://developer.download.nvidia.com/compute/cuda/12.3.1/local_installers/cuda_12.3.1_545.23.08_linux.run ## 执行安装 chmod 755 ./cuda_12.3.1_545.23.08_linux.run ./cuda_12.3.1_545.23.08_linux.run ##等待一会,可能会有报错,提示需要禁用 nouveau ,重启一下服务器,再重新安装cuda ## 安装成功之后,会有两个提示,按照提示操作 Please make sure that - PATH includes /usr/local/cuda-12.3/bin - LD_LIBRARY_PATH includes /usr/local/cuda-12.3/lib64, or, add /usr/local/cuda-12.3/lib64 to /etc/ld.so.conf and run ldconfig as root To uninstall the CUDA Toolkit, run cuda-uninstaller in /usr/local/cuda-12.3/bin To uninstall the NVIDIA Driver, run nvidia-uninstall Logfile is /var/log/cuda-installer.log #1. 修改/etc/profile,把/usr/local/cuda-12.3/bin加入到PATH export PATH=$PATH:/usr/local/cuda-12.3/bin #2. 在/etc/ld.so.conf中增加/usr/local/cuda-12.3/lib64,然后root权限运行 ldconfig ``` ### 以太坊节点 ```shell ## 启动&挖矿,需要加上 --mine 配合NBMiner之类的挖矿软件,需要先 ./geth --datadir data account new 创建一个矿工 ## nohup ./geth --mine --datadir data --networkid 2024 --http --http.api "net,web3,eth" --http.port 8545 --http.corsdomain "*" --http.addr "0.0.0.0" --port 30303 --password ./password & nohup ./geth --mine --datadir data --networkid 2024 --http --http.api "net,web3,eth" --http.port 8545 --http.corsdomain "*" --http.addr "0.0.0.0" --port 30303 & ``` ### 矿池 使用```open-ethereum-pool```作为矿池实现,比较简单的单矿工实现. #### 配置文件 ```shell ### 构建后端 git clone https://github.com/fedimoss/open-ethereum-pool.git cd open-ethereum-pool make go build ## 启动后端 ./open-ethereum-pool config.json ##构建前端,node使用 10.x版本 cd www npm install -g ember-cli@2.9.1 npm install -g bower npm install bower install ##把 www/config/environment.js 中修改为自己的 ApiUrl ##编译 ./build.sh ## Nginx运行编译后的静态文件 ``` ```config.json```基于```config.example.json```修改即可: ```json { "threads": 8, "coin": "eth", "name": "main", "proxy": { "enabled": true, "listen": "0.0.0.0:8888", "limitHeadersSize": 1024, "limitBodySize": 256, "behindReverseProxy": false, "blockRefreshInterval": "120ms", "stateUpdateInterval": "3s", "difficulty": 17179869184, "hashrateExpiration": "3h", "healthCheck": true, "maxFails": 100, "stratum": { "enabled": true, "listen": "0.0.0.0:8008", "timeout": "120s", "maxConn": 8192 }, "policy": { "workers": 1000, "resetInterval": "60m", "refreshInterval": "1m", "banning": { "enabled": false, "ipset": "blacklist", "timeout": 1800, "invalidPercent": 30, "checkThreshold": 30, "malformedLimit": 5 }, "limits": { "enabled": false, "limit": 30, "grace": "5m", "limitJump": 10 } } }, "api": { "enabled": true, "purgeOnly": false, "purgeInterval": "10m", "listen": "0.0.0.0:8080", "statsCollectInterval": "5s", "hashrateWindow": "30m", "hashrateLargeWindow": "3h", "luckWindow": [64, 128, 256], "payments": 50, "blocks": 50 }, "upstreamCheckInterval": "5s", "upstream": [ { "name": "main", "url": "http://127.0.0.1:8545", "timeout": "10s" } ], "redis": { "endpoint": "127.0.0.1:6379", "poolSize": 10, "database": 0, "password": "" }, "unlocker": { "enabled": false, "poolFee": 10.0, "poolFeeAddress": "0xDB53d4eBce983Bbe87a42555300C443037234B0C", "donate": false, "depth": 120, "immatureDepth": 20, "keepTxFees": false, "interval": "10m", "daemon": "http://127.0.0.1:8545", "timeout": "10s" }, "payouts": { "enabled": false, "requirePeers": 25, "interval": "12h", "daemon": "http://127.0.0.1:8545", "timeout": "10s", "address": "0x79d7150f66a1945b3c86c257f83a7176dbaa54b9", "gas": "21000", "gasPrice": "50000000000", "autoGas": true, "threshold": 500000000, "bgsave": false }, "newrelicEnabled": false, "newrelicName": "MyEtherProxy", "newrelicKey": "SECRET_KEY", "newrelicVerbose": false } ``` #### 配置说明 注意: ```proxy.difficulty``` 要和区块链的难度一致,注意进制转换 使用浏览器访问```api.listen```, http://192.168.1.121:8080 1. **通用设置**: - `"threads"`: 设置为您服务器的CPU核心数。 - `"coin"`: 在Redis存储中使用的币种前缀。 - `"name"`: 为每个实例指定一个唯一名称。 2. **代理设置** (`"proxy"`): - `"enabled"`: 是否启用代理模块。 - `"listen"`: 绑定HTTP挖矿端点到指定的IP和端口。 - `"limitHeadersSize"`: 允许矿工发送的HTTP请求头部大小。 - `"limitBodySize"`: 允许矿工发送的HTTP请求正文大小。 - `"behindReverseProxy"`: 如果您位于CloudFlare后面或使用http反向代理,请设置为true以启用从X-Forwarded-For头部检测IP。 - `"stratum"`: Stratum挖矿端点的设置。 - `"blockRefreshInterval"`: 尝试从geth获取新工作的时间间隔。 - `"stateUpdateInterval"`: 矿工状态更新的时间间隔。 - `"difficulty"`: 要求矿工提交的份额难度。 - `"healthCheck"`: 是否进行健康检查。 - `"maxFails"`: 在将矿池标记为病态之前,允许的Redis故障次数。 - `"hashrateExpiration"`: 矿工统计信息的存活时间(TTL)。 3. **策略设置** (`"policy"`): - `"workers"`: 允许的矿工数量。 - `"resetInterval"`: 矿工统计数据的重置间隔时间。 - `"refreshInterval"`: 矿工统计数据的刷新间隔时间。 - `"banning"`: 禁止设置,包括是否启用、IP集合名称、禁止超时时间、无效份额百分比阈值、检查阈值和格式错误的请求上限。 - `"limits"`: 连接速率限制设置。 4. **API设置** (`"api"`): - `"enabled"`: 是否启用API模块。 - `"listen"`: API模块监听的IP和端口。 - `"statsCollectInterval"`: 收集矿工统计数据(哈希率等)的时间间隔。 - `"purgeInterval"`: 清除过时统计数据的时间间隔。 - `"hashrateWindow"`: 用于快速估算每个矿工哈希率的时间窗口。 - `"hashrateLargeWindow"`: 用于精确估算哈希率的长时间窗口。 - `"luckWindow"`: 收集份额/难度比率统计数据的区块数量。 - `"payments"`: 前端显示的最大支付次数。 - `"blocks"`: 前端显示的最大区块数。 5. **上游节点检查** (`"upstreamCheckInterval"` 和 `"upstream"`): - `"upstreamCheckInterval"`: 检查每个geth节点健康状况的时间间隔。 - `"upstream"`: 用于轮询新工作的geth节点列表。 6. **Redis设置** (`"redis"`): - `"endpoint"`: Redis实例监听命令的地址。 - `"poolSize"`: 连接池大小。 - `"database"`: 数据库编号。 - `"password"`: Redis连接密码。 7. **解锁器设置** (`"unlocker"`): - `"enabled"`: 是否启用解锁器模块。 - `"poolFee"`: 矿池费用百分比。 - `"poolFeeAddress"`: 矿池费用受益地址。 - `"donate"`: 是否将矿池费用的10%捐赠给开发者。 - `"depth"`: 解锁区块的深度。 - `"immatureDepth"`: 不成熟的区块深度。 - `"keepTxFees"`: 是否保留挖掘交易费用作为矿池费用。 - `"interval"`: 解锁器运行的时间间隔。 - `"daemon"`: 解锁区块的geth实例节点RPC端点。 8. **支付设置** (`"payouts"`): - `"enabled"`: 是否启用支付模块。 - `"requirePeers"`: 节点上要求的最小对等体数量。 - `"interval"`: 运行支付的时间间隔。 - `"daemon"`: 用于支付处理的geth实例节点RPC端点。 - `"timeout"`: RPC请求的超时时间。 - `"address"`: 带有矿池余额的地址。 - `"autoGas"`: 是否让geth确定Gas和GasPrice。 - `"gas"`: 支付交易的Gas量。 - `"gasPrice"`: 支付交易的Gas价格。 - `"threshold"`: 发送支付的矿工余额阈值。 - `"bgsave"`: 成功支付会话后是否执行Redis的BGSAVE操作。 ### 挖矿软件 - [ethminer](https://github.com/ethereum-mining/ethminer):已经不维护了,也不兼容NVidia 30系显卡 - [NBMiner](https://nbminer.com):推荐使用,支持 ETH、RVN、BEAM、CFX、ZIL、ERGO、AE. 不建议使用Windows,挖矿软件的服务器是独享的,不要再安装其他软件! ```shell wget https://dl.nbminer.com/NBMiner_42.3_Linux.tgz tar -zxvf NBMiner_42.3_Linux.tgz cd NBMiner_Linux ## 启动GPU挖矿 nohup ./nbminer -a ethash -o stratum+tcp://192.168.1.121:8008 --platform 1 -u 0x81694Fa39b1E810823810E4ffA2aFc82820Fa0a3.worker -log & ## -a 以太坊挖矿算法 ethash ## -o 矿池地址 ## --platform 1 只使用NVidia显卡 ## -u 矿工钱包地址 .work是设备名称或其他标识符,不同设备命名要区分. ## 查看算力情况 ### 使用浏览器访问API默认的22333端口, http://192.168.1.233:22333 ## 查看矿工账号收益 ```