主页 > token.im官网 > 以太坊私有网络的设置与体验

以太坊私有网络的设置与体验

token.im官网 2023-02-15 07:37:43

记录搭建以太坊私网环境的过程,方便以后开发

我这里使用的是Geth客户端,geth.ethereum.org网站上有详细的文档。 这里我主要是按照官网的教程来的。

安装

我是Ubuntu环境,执行以下命令安装

sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum

设置专用网络

首先,您需要设置一个网络 ID 以将其与其他以太坊网络隔离开来。 以太坊主网network id为1,我这里设置为15

二是选择共识算法。 有两种类型的工作证明和权威证明。 其中,proof-of-work是现在主要的算法挖以太坊网络要求,另外一个在我的理解上还是实验性的,所以还是优先选择proof-of-authority。 工作的

我们可以先创建一个账号

geth account new --datadir data

运行后会显示一个账号的地址。 比如我得到的地址是0xbDfa9d9C5656a2e4f09d53768DA17044AfE4F4d7

之后,创建一个创世块,这也是我的区块链的第一个块。 这个块是通过 genesis.json 文件配置的。 官网上的例子如下:

{
  "config": {
    "chainId": 15,
    "homesteadBlock": 0,
    "eip150Block": 0,
    "eip155Block": 0,
    "eip158Block": 0,
    "byzantiumBlock": 0,

挖以太坊网络要求_挖比特币和挖以太坊哪个赚钱_手机怎样挖以太坊

"constantinopleBlock": 0, "petersburgBlock": 0, "ethash": {} }, "difficulty": "1", "gasLimit": "8000000", "alloc": { "bDfa9d9C5656a2e4f09d53768DA17044AfE4F4d7": { "balance": "300000" } } }

这里的chainId代表网络id,difficulty的值代表挖矿的难度。 由于是私网挖以太坊网络要求,这里可以设置一个最小值。 Alloc 表示要为哪些账户分配初始以太币。 这是分配给我刚创建的帐户的 300,000 wei。 Wei是以太坊的最小单位,1以太等于10^18 wei。

在我的系统中新建一个blockchain目录,在里面新建一个data子目录,将genesis.json文件放到blockchain目录下,运行如下命令初始化Geth数据库,使用genesis区块配置文件新建一个区块链节点.

geth init --datadir data genesis.json

创建完成后我们就可以启动节点了,运行如下命令

geth --datadir data --networkid 15

从运行输出结果可以看到IPC端点结束这句话,我们可以打开一个新的命令行终端,通过IPC URL连接,启动javascript控制台

geth attach data/geth.ipc

矿业

进入Geth控制台后,我们可以尝试挖矿到我们现有的账户。 以下命令显示账户已解锁,然后设置coinbase,之后就可以挖矿了。 minser.start 可以指定使用多少 CPU 线程进行挖矿。

personal.unlockAccount(eth.accounts[0])
miner.setEtherbase(eth.accounts[0])
miner.start(1)

挖比特币和挖以太坊哪个赚钱_挖以太坊网络要求_手机怎样挖以太坊

观察之前启动区块链节点的命令行终端输出的日志,会看到commit new mining work, mined potential block等信息,说明挖矿任务正在进行,挖矿成功。 如果我们想停止挖矿,可以输入miner.stop()来终止。

一段时间后,我们可以查看我们开采了多少矿石。

web3.fromWei(eth.getBalance(eth.accounts[0]))

贸易

现在我们可以创建一个新帐户来向该帐户转移一些以太币。

personal.newAccount()

新账户地址为0x3312521d5892d45eb23b38c95375d9376dca8e0b

然后你可以转一些钱到这个新账户

personal.unlockAccount(eth.accounts[0])
eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:1e18,data:utils.toHex('This is a test')})

完成后,我们会得到交易的Hash值,“0xa69ae61b029a9e2ea46a075872e079829f770dbf94801586ad157c266010d9a5”

此时eth.accounts[1]的余额还是0,因为没有人在挖,所以这笔交易还没有被确认写入区块链账本。 我们可以挖一个地雷,稍后检查一下,看看余额会变成 1 个以太币。

我们可以查看刚才的交易

eth.getTransaction('0xa69ae61b029a9e2ea46a075872e079829f770dbf94801586ad157c266010d9a5')

智能合约

以太坊最令人兴奋的功能之一是它对智能合约的支持。 现在我们可以创建一个智能合约并将其部署到网络中。

以下是一个简单的智能合约的代码:

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
/**

挖比特币和挖以太坊哪个赚钱_挖以太坊网络要求_手机怎样挖以太坊

* @title Storage * @dev Store & retrieve value in a variable */ contract Storage { uint256 number; /** * @dev Store value in variable * @param num value to store */ function store(uint256 num) public { number = num; } /** * @dev Return value * @return value of 'number' */ function retrieve() public view returns (uint256){ return number; }

挖比特币和挖以太坊哪个赚钱_挖以太坊网络要求_手机怎样挖以太坊

}

为了在python中编译用solidity语言编写的合约,需要安装以下包

pip install py-solc-x

之后我们可以通过web3.py库进行操作

1.首先是连接到我们的以太坊节点,如果连接成功,会打印True

from web3 import Web3
w3 = Web3(Web3.IPCProvider('data/geth.ipc'))
print(w3.isConnected())

2.查看活期账户,查看余额,单位是ether

for account in w3.eth.accounts:
    print("Account:{}, Balance:{} ether".format(account, Web3.fromWei(w3.eth.get_balance(account), 'ether')))

3. 设置一个默认账户并解锁,这个账户后面会用到部署合约

w3.eth.default_account=w3.eth.accounts[0]
w3.geth.personal.unlockAccount(w3.eth.accounts[0], password)

4.编译部署合约

import solcx
from solcx import compile_source
solcx.install_solc()
def compile_source_file(file_path):
    with open(file_path, 'r') as f:

手机怎样挖以太坊_挖比特币和挖以太坊哪个赚钱_挖以太坊网络要求

source = f.read() return compile_source(source) def deploy_contract(w3, contract_interface): tx_hash = w3.eth.contract( abi=contract_interface['abi'], bytecode=contract_interface['bin']).constructor().transact() return tx_hash contract_source_path = 'storage.sol' compiled_sol = compile_source_file('storage.sol') contract_id, contract_interface = compiled_sol.popitem() transcation_hash = deploy_contract(w3, contract_interface)

5.开始挖矿,一段时间后查看合约地址

w3.geth.miner.start(1)
#Wait some time
contract_address = w3.eth.get_transaction_receipt(transaction_hash)['contractAddress']

6. 获取合约地址意味着合约已经记录在区块链账本上。实例化合约并调用store方法存储一个值。 一段时间后,矿工执行完记录在账本上,就可以调用retrieve方法获取刚刚存入的值

contract_instance = w3.eth.contract(address=contract_address, abi=contract_interface['abi'])
contract_instance.functions.store(101).transact()
#Wait some time
contract_instance.functions.retrieve().call()