以太坊加入私链(2023已更新(以太坊公链私链) |
您所在的位置:网站首页 › web30龙头股 › 以太坊加入私链(2023已更新(以太坊公链私链) |
以太坊私有链搭建(2)--修改挖矿难度
官放解释就不多说了,Difficulty值越大,越难出区块,意味着交易不容易确认,默认的机制是难度越来越大,对私有链一般是不可接受的,当然这个值也不是越小越好,这样的话也会让机器的很卡,所以这个值要根据项目自己确定。 创世区块中的的难度能影响整体的挖矿速度,但是并不能改变难度上升这个趋势,所以在自己的项目中,仅仅在创世区块中指定难度是不够的。 当前geth版本 1.7 unstable 源文件 consensus/ethash/consensus.go 行290 好了,这里也不多想怎么实现了,我也看不懂,简单改下返回难度为恒定值就会~~ 将这个函数改为 重新make geth,试试看出块难度是不是恒定了。 以太坊多节点私有链部署假设两台电脑A和B 要求: 1、两台电脑要在一个网络中,能ping通 2、两个节点使用相同的创世区块文件 3、禁用ipc;同时使用参数--nodiscover 4、networkid要相同,端口号可以不同 1.4 搭建私有链 1.4.1 创建目录和genesis.json文件 创建私有链根目录./testnet 创建数据存储目录./testnet/data0 创建创世区块配置文件./testnet/genesis.json 1.4.2 初始化操作 cd ./eth_test geth --datadir data0 init genesis.json 1.4.3 启动私有节点 1.4.4 创建账号 personal.newAccount() 1.4.5 查看账号 eth.accounts 1.4.6 查看账号余额 eth.getBalance(eth.accounts[0]) 1.4.7 启动停止挖矿 启动挖矿: miner.start(1) 其中 start 的参数表示挖矿使用的线程数。第一次启动挖矿会先生成挖矿所需的 DAG 文件,这个过程有点慢,等进度达到 100% 后,就会开始挖矿,此时屏幕会被挖矿信息刷屏。 停止挖矿,在 console 中输入: miner.stop() 挖到一个区块会奖励5个以太币,挖矿所得的奖励会进入矿工的账户,这个账户叫做 coinbase,默认情况下 coinbase 是本地账户中的第一个账户,可以通过 miner.setEtherbase() 将其他账户设置成 coinbase。 1.4.8 转账 目前,账户 0 已经挖到了 3 个块的奖励,账户 1 的余额还是0: 我们要从账户 0 向账户 1 转账,所以要先解锁账户 0,才能发起交易: 发送交易,账户 0 - 账户 1: 需要输入密码 123456 此时如果没有挖矿,用 txpool.status 命令可以看到本地交易池中有一个待确认的交易,可以使用 eth.getBlock("pending", true).transactions 查看当前待确认交易。 使用 miner.start() 命令开始挖矿: miner.start(1);admin.sleepBlocks(1);miner.stop(); 新区块挖出后,挖矿结束,查看账户 1 的余额,已经收到了账户 0 的以太币: web3.fromWei(eth.getBalance(eth.accounts[1]),'ether') 用同样的genesis.json初始化操作 cd ./eth_test geth --datadir data1 init genesis.json 启动私有节点一,修改 rpcport 和port 可以通过 admin.addPeer() 方法连接到其他节点,两个节点要要指定相同的 chainID。 假设有两个节点:节点一和节点二,chainID 都是 1024,通过下面的步骤就可以从节点二连接到节点一。 首先要知道节点一的 enode 信息,在节点一的 JavaScript console 中执行下面的命令查看 enode 信息: admin.nodeInfo.enode " enode://d465bcbd5c34da7f4b8e00cbf9dd18e7e2c38fbd6642b7435f340c7d5168947ff2b822146e1dc1b07e02f7c15d5ca09249a92f1d0caa34587c9b2743172259ee@[::]:30303 " 然后在节点二的 JavaScript console 中执行 admin.addPeer(),就可以连接到节点一: addPeer() 的参数就是节点一的 enode 信息,注意要把 enode 中的 [::] 替换成节点一的 IP 地址。连接成功后,节点一就会开始同步节点二的区块,同步完成后,任意一个节点开始挖矿,另一个节点会自动同步区块,向任意一个节点发送交易,另一个节点也会收到该笔交易。 通过 admin.peers 可以查看连接到的其他节点信息,通过 net.peerCount 可以查看已连接到的节点数量。 除了上面的方法,也可以在启动节点的时候指定 --bootnodes 选项连接到其他节点。 bootnode 是一个轻量级的引导节点,方便联盟链的搭建 下一节讲 通过 bootnode 自动找到节点 参考: 以太坊开发(2):在以太坊私有链上的基本操作在上一讲 如何使用geth搭建以太坊私有链 完成了私有链的搭建,下面介绍在私有链上的基本操作。 启动私有链后在命令行输入: 执行完之后可以查看到生成的账户地址为0xe6e4e20c95abc11dca8b3e9c292a34725bf89930 查询账户余额: 刚刚创建的私有链账户都是没有余额的,需要通过挖矿才会产生eth,下面介绍如何在私有链上挖矿。 在geth环境下执行: 这时候查看日志geth.log可以看到以太坊私有链有个启动的百分比,到100就正式启动了: 挖矿开始: 这时候有个疑问,挖矿挖到的eth到哪了,其实默认到了eth.account[0],就是第一个账户上: 如何修改挖矿所得的账户: 命令如下: 下面开始进行转账: 这时候出现报错,原因是转账的账户没有解锁,需要输入密码解锁转账的账户才能完成转账操作: 搭建geth私有链和联盟链网络操作系统:linux或Mac OS 安装geth执行以下命令: linux:sudo apt-get install ethereum Mac OS:brew install ethereum 直接创建两个geth的工作目录,用于之后的组建联盟链的使用: mkdir eth-private1 mkdir eth-private2 首先 cd eth-private1 进入节点1的工作目录该目录下执行下面命令 geth --datadir data --nodiscover console (data是之后geth节点的数据目录,可自行修改) 使用geth自带的工具 puppeth 用于生成创世区块,过程如下: puppeth +-----------------------------------------------------------+ | Welcome to puppeth, your Ethereum private network manager | | | | This tool lets you create a new Ethereum network down to | | the genesis block, bootnodes, miners and ethstats servers | | without the hassle that it would normally entail. | | | | Puppeth uses SSH to dial in to remote servers, and builds | | its network components out of Docker containers using the | | docker-compose toolset. | +-----------------------------------------------------------+ Please specify a network name to administer (no spaces, please) 输入私链名称后,会出现二级菜单,现在2:配置一个新的创世快 What would you like to do? (default = stats) 再次出现二级菜单,让你选择共识机制(这里采用poa共识) Which consensus engine to use? (default = clique) Ethash - proof-of-work(PoW) :工作量证明,通过算力达成共识 (以太坊就是使用这种方式) Clique - proof-of-authority(PoA): 权威证明、通过预先设定的权威节点来负责达成共识 (不消耗算力,一般用于私有链测试开发) 如果选择Pow的共识方法,直接输入1,回车即可。 如果选择PoA的共识方法,输入2后会提示让你选择处快的间隔时间,一般测试开发使用可以设置相对的将处快时间设置较少5秒即可,然后会让你选择哪个账户来作为权威生成区块(至少有一个,输入刚才创建的账户,若只是单节点就输入那个节点目录生成的地址,若想组建联盟链就填写生成的两个地址) How many seconds should blocks take? (default = 15) 选择好共识机制后会让你指定给那些账号初始化ether(至少有一个),输入我们刚才创建的账户地址回车即可。 Which accounts should be pre-funded? (advisable at least one) 选择输入私有链的网络ID,任意数字即可(不能为1,1是公链),也可以不输入会给定一个随机数作为私有链的网络ID Specify your chain/network ID if you want an explicit one (default = random) 选择导出创世区块配置文件 选择导出创世区块配置文件的保存路径,可以保存到当前目录,直接按回车即可 Which file to save the genesis into? (default = my-private-chain.json) INFO [02-09|14:56:33] Exported existing genesis block 这样就完成了创世区块文件的配置了,直接退出puppeth即可。 输入命令 geth --datadir data init private.json 其中data自己制定,private.json就是刚才生成的创世区块 若出现如图错误: 输入命令: geth --datadir data --syncmode full --port 2001 --networkid 1234 --rpc --rpcport "8545" --rpccorsdomain "*" --rpcaddr "0.0.0.0" --rpcapi "db,eth,net,web3,personal,admin,clique" --nodiscover console 进入控制台 --datadir data:节点的数据目录 --syncmode full:块同步的方式(若只是单节点可不填) --port 2001: 网卡监听端口 --networkid 1234:网络标识符 --rpc:开启rpc服务 --rpcport "8545":rpc服务的端口 --rpccorsdomain "*":允许跨域请求的域名列表(逗号分隔)(浏览器强制) --rpcaddr "0.0.0.0" :HTTP-RPC服务器接口地址(默认值:“localhost”) --rpcapi "db,eth,net,web3,personal,admin,clique":基于HTTP-RPC接口提供的API(私有链可以任意开发,公有链需要谨慎) --nodiscover:不允许节点自动加入 若想搭建联盟链,必须保证创世区块一致,进入到刚才创建的eth-private2的目录 将之前生成的创世区块拷贝过来,初始化创世区块,然后使用启动命令启动分别启动两个节点,进入控制台,使用 admin.nodeInfo 命令获取节点的信息 总结: 两个服务器部署两个节点是可以联通的,但是只能使用两个节点对应的地址进行挖矿,所以只能是两个节点对应两个地址进行挖矿,使用poa共识,当一个节点挂掉,挖矿停止,因为poa共识挖矿必须超过50%的节点进行钱增,现在只是两个节点,挂掉一个节点挖矿就会停止等待另一个节点的确认,停掉的节点可以通过正常运作的节点信息重新连接到网络中。 问题: 同步块有可能报错情况: 1:Synchronisation failed "retrieved hash chain is invalid" 解决目前找到的方法是removedb 数据目录 ,重新init创世区块 2:内存溢出初步确认为开启rpc服务造成的,有可能服务器恶意被黑,暴力破解密码,占有内存,解决,将服务器的ip设置一条防火墙 若存在问题可给本人留言或访问本人的github: 记录了一些本人搭建使用的命令 首先需要安装 Docker,Docker 的安装和使用可以参看阮一峰老师的 《Docker 入门教程》 。 Ethereum 官方是支持 docker 的,可以参看 官方文档 。 centOS 其中 -v /home/linshan/works/block-chain/ethereum:/root 是把我们当前的 ethereum 目录,挂到了docker 的 /root 下。 在 Windows 环境下使用 -v /home/linshan/works/block-chain/ethereum:/root 不能启动容器,原因不明,所以在 Windows 下先不要使用目录挂载。 各字段具体用途参看 官方文档 。 Windows Windows 不必创建 start-ethereum.sh 文件, genesis.json 也可以在 Docker 容器启动后创建。 centOS Windows 运行成功后执行 进入 docker 容器命令行 因为 Windows 没有挂载共享目录,所以 root 目录下没有 genesis.json 文件,我们要在这里手动创建 genesis.json 文件,内容要和 centOS 的一致。 data 用来存放区块数据 geth 的参数参看 以太坊客户端Geth命令用法-参数详解 启动私有节点后进入 geth 命令行执行: 输出的内容就是节点信息,我们在手动连接节点是会用到,注意要把“0.0.0.0“换成你自己的IP,然后将这个信息发送给其他节点。手动连接节点有两种方式: 当然不管使用哪种方法连接节点都要保证创世区块文件 genesis.json 一致,还有在启动时 networkid 也要一致。 至此以太坊私有链已搭建完毕。 geth命令 docker命令 以太坊的 ChainId 与 NetworkIdChainId 是 EIP-155 引入的一个用来区分不同 EVM 链的一个标识。如下图所示,主要作用就是避免一个交易在签名之后被重复在不同的链上提交。最开始主要是为了防止以太坊交易在以太经典网络上重放或者以太经典交易在以太坊网络上重放。在以太坊网络上是从 2675000 这个区块通过 Spurious Dragon 这个硬分叉升级激活。 引入 ChainId 后,带来了哪些影响呢? NetworkId 主要用来在网络层标识当前的区块链网络。NetworkId 不一致的两个节点无法建立连接。 NetworkId 无法通过配置文件指定,智能通过参数 --networkid 来指定。所以我们启动自己私链节点上需要记得加上这个参数。如果不加这个参数也不指定网络类型,默认 NetworkId 的值和以太坊主网一致。 不是。 这个根据上面的介绍可以很明显的看出,两者并没有非常高的关联度。 网上几乎所有提到搭建以太坊私链的文章,都要强调 NetworkId 需要和 genesis 文件里 ChainId 的值相同。事实上是没必要的。 就像下面这张图展示的这样,很多已经在主网运行的 EVM 链,它们的 ChainId 和 NetworkId 并不相同。比如以太经典,它的 ChainId 是 61,但 NetworkId 和以太坊主网一样都是 1。 之所以很多文章强调 ChainId 和 NetworkId 要保持一致,可能因为在某一段时间内,一些开发工具比如 MetaMask,会把 NetworkId 当作 ChainId 来用。不过现在 MetaMask 已经支持自定义 ChainId,以太坊也添加了 “eth_chainId” 这个 RPC API,相信两者误用的情况会越来越少。 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |