目录
1. 下载Geth
从官网下载,地址,下载完安装
2. 验证是否安装成功
打开cmd,输入
geth version
输出版本信息,安装成功
3. 两种方式启动和连接节点
先获取本地IP地址192.168.1.123,下面的命令里面的IP地址要改成自己的,然后创建个新文件夹privateChain,打开cmd,输入
3.1 attach方式(需2个cmd窗口)
3.1.1 启动
geth --networkid 123 --dev --datadir data1 --http --http.addr 192.168.1.123 --http.port 8989 --port 3000 --allow-insecure-unlock --ipcpath data1/geth1.ipc
- networkid 网络唯一标识id,测试用,随便输入个123,可以通过https://chainlist.org/这个网站查询真实的网络唯一标识
- dev 指定开发者模式
- datadir 指定本地数据存储目录
- http 表示开启 HTTP-RPC 服务
- http.addr 本地ip地址
- http.port 指定 HTTP-RPC 服务监听端口号
- port 指定和其他节点连接所用的端口号
- allow-insecure-unlock 这个是因为出于安全考虑,默认会禁止HTTP通道解锁账户,也就是如果你在客户端操作对账户解锁的时候可能会 出现"unlock with HTTP access is forbidde" 的错误,后续通过代码而不是通过客户端发起交易时可以不用开启这一选项
- ipcpath 指定ipc地址文件,特别重要
回车后输出日志,成功
3.1.2 连接
PS: 这里有个内外网都没找到解决方法的细节,其他教程都说直接用ipc连节点,连geth.ipc,但是永远找不到这个geth.ipc在哪里。所以这个到底在哪呢?
在日志输出里面有这个ipc地址,找这一行IPC endpoint opened
,然后复制后面的url=\\.\pipe\data1/geth1.ipc
,这就是ipc地址了
在文件夹privateChain下,重新打开一个cmd,输入命令
geth attach \\.\pipe\data1/geth1.ipc
回车后进入交互命令行
3.2 console方式(只需1个cmd窗口)
geth --networkid 123 --dev --datadir data1 --http --http.addr 192.168.1.123 --http.port 8989 --port 3000 --allow-insecure-unlock --ipcpath data1/geth1.ipc console
启动后直接连接进入交互命令行
5. 常用交互命令
5.1 查看账户列表
personal.listAccounts
会发现已经存在一个账户了,默认创建的开发者账户,并且有一定余额
5.2 创建新账户
personal.newAccount("111111")// 111111是密码
5.3 查看coinbase账户
eth.coinbase
默认第一个账户就是coinbase账户
5.4 查看第2个账户
personal.listAccounts[1]
5.5 查看某个账户的余额
eth.getBalance("0xa7ac1d344b619e7be347703e0ee9421128db7c11")
或用下面的命令
eth.getBalance(personal.listAccounts[1])
5.6 查看区块高度
eth.blockNumber
5.7 从第一个账户转账给第二个账户
5.7.1 先解锁第一个账户
PS: 第一个账户是自动生成的开发者账户,密码是空
personal.unlockAccount(personal.listAccounts[0],"输入密码")
5.7.2 发送交易
从第一个账户给第二个账户转5个以太币
eth.sendTransaction({from:personal.listAccounts[0],to:personal.listAccounts[1],value:web3.toWei(5,'ether')})
5.7.3 查询交易hash内容
使用上一步发送交易输出的hash值
eth.getTransaction("0xb2f155b1cd90056fe7a6868eab62687aef9f4d7bd494f9fe24c356457470818d")
5.7.4 查看交易后区块高度
eth.blockNumber
有交易,加了一个高度
5.7.5 查询第二个账户余额
eth.getBalance(personal.listAccounts[1])
下面命令是单位转换,从Wei转成以太币
web3.fromWei(eth.getBalance(personal.listAccounts[1]))
发现已经有5个以太币,交易成功
PS: 在开发者模式下,会自动进行挖矿,所以交易立马就生效了
6. 多节点互联
PS: 搞了很久都没成功,最后被逼去看geth源码,然后看到这句注释,吐血
7. 部署合约
以之前的一个文章《Solidity的框架Truffle的简单使用(2021版)》里的项目来做例子。
7.1 修改合约项目配置文件
- 在myProject合约项目根目录下找到truffle-config.js文件
- 打开后,搜索,development,根据文章上面的配置,修改成对应内容
7.2 打开合约项目truffle交互命令行
- 使用命令
truffle console
进入交互命令行,注意,这里只能用console模式,因为要用到修改的项目配置,如果用develop模式,就用的是默认的私链了 - 使用命令
compile
编译 - 使用命令
migrate --reset
部署,注意,geth的节点需要启动,观察这个命令执行后,节点cmd里会出现挖矿记录mined potential block,表示部署成功
7.3 打开geth节点交互命令行
- 使用命令
eth.blockNumber
查看区块高度,可以观察到区块增加了,侧面说明部署成功 - 在myProject合约项目目录下,进入build/contracts,打开HelloWorld.json文件
- 搜索abi,选中中括号(包括中括号)的内容,把内容复制出来,找个压缩json的工具进行压缩,结果如下
[{"constant":true,"inputs":[],"name":"test","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"test1","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"echo","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"}]
- 在geth节点交互命令行里,输入,abi等于刚刚压缩的内容,不需要双引号
var abi = [{"constant":true,"inputs":[],"name":"test","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"test1","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"echo","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"}]
- 在geth节点交互命令行里,输入
abi
,输出json结构内容,说明ok - 在HelloWorld.json文件里,继续搜索,address,把对应的值复制
- 在geth节点交互命令行里,输入
var myContract=eth.contract(abi).at("上面搜到的address值")
- 验证结果,输入
myContract.test()
- 验证结果,输入
myContract.test1.call()
- 验证结果,输入
myContract.echo("读者老爷好帅")
over,enjoy!