安装准备:go,git
- 通过PPAs安装geth
1 $ sudo add-apt-repository -y ppa:ethereum/ethereum 2 $ sudo apt-get update 3 $ sudo apt-get install ethereum
- 创建自己的私有链
创建创世文件
创建一个genesis.json文件,官网配置文件如下:https://github.com/ethereum/go-ethereum,其中,chainId是私有链的id,注意不要和现有的主链(1)和测试链的id相同(2,3,42),例如:500,666等;alloc代表初始资产配置,在该区块链产生时,就预先赋予这些账户一定数额的wei,可以将metamask中的地址写入,分配以太币,注意单位是wei;difficulty 定义了每次挖矿时,最终确定nonce 的难度;nonce预定一个随机数,这是一个与PoW 机制有关的值;coinbase 每挖出一个区块,都会获得奖励,该值指定默认情况下把奖励给到哪个账户,实际上,我们每次挖矿开始之前,都会自己指定;gasLimit 规定该区块链中,gas 的上限。
1 { 2 "config": { 3 "chainId": <arbitrary positive integer>, 4 "homesteadBlock": 0, 5 "eip150Block": 0, 6 "eip155Block": 0, 7 "eip158Block": 0, 8 "byzantiumBlock": 0, 9 "constantinopleBlock": 0, 10 "petersburgBlock": 0, 11 "istanbulBlock": 0, 12 "berlinBlock": 0 13 }, 14 "alloc": {}, 15 "coinbase": "0x0000000000000000000000000000000000000000", 16 "difficulty": "0x20000", 17 "extraData": "", 18 "gasLimit": "0x2fefd8", 19 "nonce": "0x0000000000000042", 20 "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", 21 "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", 22 "timestamp": "0x00" 23 }
初始化创建私有链
创建myChain文件夹,用来指定数据存储的位置,使用以下命令初始化私有链。
1 mkdir myChain 2 # 指定数据存储位置 3 geth --datadir myChain/ init genesis.json
私有链启动
Networkid与配置文件中的id相同
1 geth --datadir mychain/ --networkid 666
info输出重定向
上面的命令启动私有链,时不时就会出现info消息,影响我们输入geth命令,因此我们将info输出重定向到一个log文件,使用使用下面命令启动。可以新开一个命令行终端输入以下命令查看日志:tail -f geth.log。
1 geth --datadir mychain/ --networkid 666 console 2>geth.log
创建完成
可以使用exit和ctrl-d退出。
启动脚本创建
创建一个启动rungeth.sh命令脚本,之后运行脚本,私有链就启动了,其中指定了数据存储位置,私有链网络id,开放端口,rpc端口,rpc地址,rpc方法,允许HTTP通道解锁账户,info重定向等命令,请大家根本自身的实际情况进行修改,脚本具体内容如下。(相关的参数的涉及可能在后面给出原因)
1 #!/bin/bash 2 geth --datadir . --networkid 15 --port 30303 --http --http.addr "0.0.0.0" --http.port 8545 --http.api 'db,net,eth,web3,personal' --allow-insecure-unlock --http.corsdomain '*' console 2>> geth.log
赋予rungeth.sh脚本权限
1 chmod 755 rungeth.sh
运行脚本
1 # 在rungeth.sh文件夹下执行该命令 2 ./rungeth.sh
启动命令参数说明
使用最新版本geth客户,当执行personal.unlockAccount()或在程序中调用personal_unlockAccount接口时,会出现:account unlock with HTTP access is forbidden异常。新版本geth,出于安全考虑,默认禁止了HTTP通道解锁账户。在启动命令中添加“--allow-insecure-unlock”参数进行打开操作。
- 安装metamask
MetaMask是一款在谷歌浏览器Chrome上使用的插件类型的以太坊钱包,该钱包不需要下载,只需要在谷歌浏览器添加对应的扩展程序即可,非常轻量级,使用起来也非常方便。
Chrome的安装
进入到Chrome的网上应用商店下载metamask
MetaMask使用
可以参考:https://zhuanlan.zhihu.com/p/112285438?from_voters_page=true
- Metamask连接自己的私有链(win10下的Ubuntu18.04虚拟机)
私有链启动时命令参数包含rpc和rpcaddr
其中rpcaddr "0.0.0.0",指定任何一个ip地址都可以访问,rpc默认端口是8545。
查看虚拟机IP地址
ifconfig查看虚拟机的ip地址,此处你的虚拟机要是桥接模式,不然不会有自己的ip。
metamask连接
在metamask上自定义rpc,网络名称可以随意取,URL地址为http://虚拟机ip:8545,,链ID为私有链id看,保存即可以连上虚拟机上的私有链。
MetaMask/外部账户导入到Geth私链(可以在初始化私有链的配置文件中就加上metamask账户地址)
-
- 获取MetaMask上账户的私钥:点击账户详情,导出私钥。
- 拿到私钥以后,在虚拟机中创建一个文本文件例如fk.txt放进去
- 输入geth account import 你的私钥文件路径
- 提示你输入密码,这个密码是在geth控制台使用的密码
- 发现生成的账户地址就是在MetaMask上的账户地址。
- 查看当前生成密钥文件位置:geth account list
- 找到对应账户后面的存储位置,把文件放到项目中的keystore文件夹中即可。(keystore文件夹的位置为geth启动命令是指定的数据存储位置参数,即datadir)
- 在geth控制台中输入eth.accounts查看
- 导入完成
完成metamask账户地址的添加到私有链中,稍后进行转账,即可看到账户余额。
- 基本命令
下面的命令均在geth控制台中输入,即输入启动私有链命令后。
1 # 创建一个新的账户,输入两遍密码后,生成账户地址。以同样的方式,可创建多个账户。 2 personal.newAccount() 3 # 查看账户 4 eth.accounts 5 # 查看账户余额 6 eth.getBalance(eth.accounts[0]) 7 # 启动挖矿,其中 start 的参数表示挖矿使用的线程数。第一次启动挖矿会先生成挖矿所需的 DAG 文件,这个过程有点慢,等进度达到 100% 后,就会开始挖矿,此时屏幕会被挖矿信息刷屏。 8 miner.start(1) 9 # 停止挖矿 10 miner.stop() 11 # 检查挖矿是否已经停止,eth.mining 输出为false时表示挖矿已经停止 12 eth.mining 13 # 当新区块挖出后,挖矿即可结束。 14 miner.start(1);admin.sleepBlocks(1);miner.stop(); 15 # 挖到一个区块会奖励以太币,挖矿所得的奖励会进入矿工的账户,这个账户叫做 coinbase,默认情况下 coinbase 是本地账户中的第一个账户,可以通过 miner.setEtherbase() 将其他账户设置成 coinbase。 16 17 # 从账户 0 向账户 1 转账,先解锁账户 0,才能发起交易,部署智能合约时,同样需要先解锁。未解锁返回的报错信息为:Error: authentication needed: password or unlock undefined。 18 personal.unlockAccount(eth.accounts[0]) 19 # 发送交易,账户 0 -> 账户 1: 20 amount = web3.toWei(5,'ether') 21 eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount}) 22 # 此时如果没有挖矿,用 txpool.status 命令可以看到本地交易池中有一个待确认的交易,可以使用 eth.getBlock("pending", true).transactions查看当前待确认交易。使用下面命令开始挖矿。 23 miner.start(1);admin.sleepBlocks(1);miner.stop(); 24 # 新区块挖出后,挖矿结束,查看账户 1 的余额,已经收到了账户 0 的以太币: 25 web3.fromWei(eth.getBalance(eth.accounts[1]),'ether') 26 # 查看当前区块总数 27 eth.blockNumber 28 # 通过区块号查看区块 29 eth.getBlock(4) 30 # 通过交易 Hash 查看交易(Hash 值包含在上面交易返回值中) 31 eth.getTransaction("0x9f5e61f3d686f793e2df6378d1633d7a9d1df8ec8c597441e1355112d102a6ce")
- 参考文章
https://blog.csdn.net/weixin_43584346/article/details/114792707
https://zhuanlan.zhihu.com/p/112285438?from_voters_page=true
https://www.cnblogs.com/soowin/p/14328195.html
https://blog.csdn.net/wo541075754/article/details/98847308
https://blog.csdn.net/youlinhuanyan/article/details/99574782
https://blog.csdn.net/u014439239/article/details/79347389
https://blog.csdn.net/mingrizhixin/article/details/111407758
https://blog.csdn.net/weixin_43988498/article/details/108394012
https://www.jianshu.com/p/9fa31e4cdf4d
https://github.com/ethereum/go-ethereum