以太坊钱包搭建与使用

时间:2024-01-26 07:16:57

前言

本文使用系统:centos7。

以太坊客户端:geth

安装

下载geth:

官方下载地址:https://geth.ethereum.org/downloads

 

直接下载:

wget https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.9.6-bd059680.tar.gz

 

解压

tar zxvf geth-linux-amd64-1.9.6-bd059680.tar.gz
cd geth-linux-amd64-1.9.6-bd059680

 

移动

mv geth /usr/bin/

 

创建一个目录用来存放区块数据

mkdir /ethereum

 

常规配置

监听端口

--port 30303
geth网络监听端口 默认30303

 

设置区块目录

--datadir \'/ethereum\'
--datadir选项指定在哪里存储区块数据  没有提供则默认为家目录下的.ethereum目录。

 

指定网络

--networkid 1
--networkid指定网络ID  1代表主网络  2代表测试网络  没有提供则默认测试网络,乱写代表创建私有链

 

同步方式

--syncmode \'fast\' --cache 1024
fast意为快速同步(同步区块有full、fast、light三种模式,推荐fast,同步完成后geth会自动切换到full同步)
--cache分配到内部缓存的内存,单位MB,1024即为1G。

 

RPC配置

--rpc
启用HTTP-RPC服务

--rpcaddr \'0.0.0.0\'
HTTP-RPC服务白名单  默认localhost

 --rpcport 8545
HTTP-RPC服务监听端口  默认8545

--rpcapi \'db,eth,net,web3\'
这个命令决定允许什么API能够通过PRC进入,默认情况下geth会激活IPC上所有API以及PRC的db,eth,net,web3API。

--rpccorsdomain \'*\'
跨域,多个域名可用逗号分割。

 

搭建主链节点

星火节点

由于国内以太坊节点非常稀少,并且国内外网络不通畅等原因导致国内服务器同步区块数据非常缓慢还容易丢包,由EthFans发起的星火节点计划可以帮助我们加快同步速度。

下载节点列表:https://upyun-assets.ethfans.org/uploads/doc/file/b0c5266be42f43f1baf7207c432bede6.json?_upd=static-nodes.json

下载后将static-nodes.json文件放在区块存储目录下即可。

生成配置文件

geth --datadir \'/ethereum\' --networkid 1  --syncmode fast --cache 1024 --rpc --rpcaddr \'0.0.0.0\' --rpcport 8545 --rpcapi \'db,eth,net,web3\' --rpccorsdomain \'*\' dumpconfig > /ethereum/geth_config

 

后台启动

nohup geth --config /ethereum/geth_config  >> /var/log/geth.log  2>&1  &

 

监控区块同步日志

tail -f /var/log/geth.log

 

我是4核8G带宽10M的服务器同步了两天半,占用硬盘190G。

当你看到日志里无穷无尽的 Imported state entries ...,不要急,你还需要继续等待。。。

 

搭建私链环境

 

创世区块

先创建几个账户

geth --datadir /ethereum account new

 

创世区块文件

vim /ethereum/genesis.json

内容如下:

{
    "config": {
        "chainId": 100,
        "homesteadBlock": 0,
        "eip150Block": 0,
        "eip155Block": 0,
        "eip158Block": 0,
        "byzantiumBlock": 0,
        "constantinopleBlock": 0,
        "petersburgBlock": 0,
        "ethash": {}
    },
    "nonce": "0x42",
    "timestamp": "0x0",
    "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa",
    "gasLimit": "0x1388",
    "difficulty": "0x1",
    "alloc": {
        "0xDFeDb94Ab496d6b68795dB890AcbbBdc2557860A": {
            "balance": "100000000000000000000000000000000"
        }
    }
}

 

其中的 alloc 属性是给账户分配余额 。切记,余额是以wei为单位的,就是balance值要除以10的18次方才等于eth的数量。

 

初始化创世区块

geth --datadir /ethereum init /ethereum/genesis.json

 

生成配置文件

geth --datadir \'/ethereum\' --networkid 100  --cache 512 --rpc --rpcaddr \'0.0.0.0\' --rpcport 8545 --rpcapi \'db,eth,net,web3,personal\' --rpccorsdomain \'*\'  --allow-insecure-unlock  dumpconfig > /ethereum/geth_config

 

后台启动

nohup geth --config /ethereum/geth_config  >> /var/log/geth.log  2>&1  &

 

JavaScript控制台

进入控制台

geth console --config /ethereum/geth_config 2>> /var/log/geth.log

 

如果你后台启动了geth则不能进入,它会提示你端口已占用,这时候可以使用链接节点的方式进入:

geth attach /ethereum/geth.ipc

 

此时进入了控制台环境(退出控制台使用exit;)

 

查看当前同步情况

eth.syncing

如果返回的是false,证明同步完成了,可以使用当前节点。
否则会返回同步状态

currentBlock为当前下载到的区块高度,请注意,下载块不等于同步数据了,下载块是一个简单快速的过程,只验证相关的工作量证明,在下载块的同时geth也在一直下载所有的区块数据,当数据下载完成后届时才会处理曾经发生过的所有交易,重新组装整个链。

 

查询区块高度

eth.blockNumber

fast方式有个特点,在完全完成同步之前,geth无法提供有关区块或或账户信息,所以会返回0。

 

查询某个区块的信息

eth.getBlock(39)

 

创建账户

personal.newAccount()

 

列出本地账户

eth.accounts

 

查余额

eth.getBalance(\'0xca3ac4f946b997db24515a7ae7779f2e587d5a26\')

查到的余额除以18位小数就是真实的余额数字

 

我个人喜欢这么查

web3.fromWei(eth.getBalance(\'0x317188e4a00de2f689aEb79E9b7565DabEd360dB\'), "ether");

 

解锁账户

转账之前必须解锁账户

personal.unlockAccount(\'0x317188e4a00de2f689aEb79E9b7565DabEd360dB\',\'123456\')

 

如果你解锁出现这个错

(anonymous): Line 1:24 Unexpected token ILLEGAL (and 3 more errors)

检查一下,字符串改成用单引号试试,别用双引号,这个是巨坑。

 

如果你解锁出现这个错

Error: account unlock with HTTP access is forbidden

那么在启动项中添加参数 --allow-insecure-unlock

 

转账

personal.sendTransaction({from: \'0xfbe8bfaef37e49a278fbe760b9517ebbbec20eb8\', to: \'0x68d41149e5bbe35f3fe49cdb47474bf2e2ac5a55\', value: web3.toWei(1,\'ether\')},\'123456\')

 

注意:燃费最少是21000,这个值必须要比eth.getBlock(最新块) 中的gasLimit值要小,否则会报燃费太低或太高错误,也就是说,正常情况下,最新区块的gasLimit值必须要大于21000才会转账成功,否则就继续挖矿等待。

 

根据hash查询交易详情

eth.getTransaction(\'0xd7f78761ddd26468700d21cefb431cda19a03d3fe11e8b1b5af6c1df2470e5fb\')

 

挖矿

设置挖矿账户

miner.setEtherbase(\'0x317188e4a00de2f689aEb79E9b7565DabEd360dB\')

挖矿所得费用会自动进入该账户余额

 

开始挖矿

miner.start()

 

结束挖矿

miner.stop() 

 

查看是否在挖矿

eth.mining

 

API调用

各编程语言现成类库
Java:https://github.com/web3j/web3j
Python:https://github.com/ethereum/web3.py
PHP:https://github.com/sc0Vu/web3.php
NodeJs:https://github.com/ethereum/web3.js