主页 > imtoken > 以太坊私链Geth控制台操作教程

以太坊私链Geth控制台操作教程

imtoken 2023-07-18 05:14:07

本文连接上一篇以太坊私链搭建教程,介绍以太坊私链Geth控制台操作教程。

一、Geth 控制台

Geth Console 是一个交互式 JavaScript 执行环境,其中 > 是命令提示符。在这个环境中也有内置的用于操作以太坊的 JavaScript 对象,可以直接使用。这些对象主要包括:

更多方法请参考:

常用命令有:

二、创建账户

在控制台中,您可以使用命令与私有链进行交互。创建一个新帐户:

> personal.newAccount()
Passphrase:
Repeat passphrase:
"0xc8248c7ecbfd7c4104923275b99fafb308bbff92"

输入两次密码后,会生成账户地址。同理,您可以创建多个帐户并查看帐户:

>eth.accounts

三、查看账户余额

>eth.getBalance(eth.accounts[0])
0

四、挖矿

开始挖矿:

>miner.start(1)

其中start参数表示用于挖矿的线程数。第一次开始挖矿,会先生成挖矿所需的DAG文件。这个过程有点慢。进度达到100%后,开始挖矿。屏幕会被挖矿信息刷新。

挖比特币还是以太坊

停止挖矿,在控制台输入:

>miner.stop()

挖一个区域区块会奖励以太币,挖矿奖励会进入矿工账户。该帐户称为coinbase。默认情况下,coinbase 是本地账户中的第一个账户。您可以通过 miner.setEtherbase() 将其他账户设置为 coinbase。

您可以使用以下命令,当新区块被挖出时,挖矿将结束。

>miner.start(1);admin.sleepBlocks(1);miner.stop();

五、交易

目前0号账户已挖出3块奖励,1号账户余额仍为0:

>eth.getBalance(eth.accounts[0])
15000000000000000000
>eth.getBalance(eth.accounts[1])
0

我们需要从账户 0 向账户 1 转账,并解锁账户 0 才能发起交易:

>personal.unlockAccount(eth.accounts[0])
Unlock account 0x3443ffb2a5ce3f4b80080791e0fde16a3fac2802
Passphrase: 
true

发送交易,账户 0 -> 账户 1:

> amount = web3.toWei(5,'ether')
"5000000000000000000"
> eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})
INFO [09-12|07:38:12] Submitted transaction                    fullhash=0x9f5e61f3d686f793e2df6378d1633d7a9d1df8ec8c597441e1355112d102a6ce recipient=0x02bee2a1582bbf58c42bbdfe7b8db4685d4d4c62
"0x9f5e61f3d686f793e2df6378d1633d7a9d1df8ec8c597441e1355112d102a6ce"

如果此时没有挖矿,使用 txpool.status 命令查看本地交易池中有待处理的交易。您可以使用 eth.getBlock("pending", true).transactions 查看当前待处理的交易。使用以下命令开始挖矿。

>miner.start(1);admin.sleepBlocks(1);miner.stop();

新区块挖完后,挖矿结束,查看账户1余额,账户0已经收到以太币:

> web3.fromWei(eth.getBalance(eth.accounts[1]),'ether')
5

挖比特币还是以太坊

六、查看交易和区块

查看当前区块总数:

> eth.blockNumber
4

按区块编号查看区块:

> eth.getBlock(4)

通过交易Hash查看交易(Hash值包含在上面交易的返回值中):

>  eth.getTransaction("0x9f5e61f3d686f793e2df6378d1633d7a9d1df8ec8c597441e1355112d102a6ce")

七、其他节点加入

至此,私链已经通过节点创建完成。如果其他节点想加入,需要通过以太坊客户端连接到私有区块网络,并连接网络的节点以同步区块信息。在其他主机上安装以太坊客户端Geth,通过Geth命令进入私链,注意指定相同的网络号。

假设有两个节点:节点一和节点二,NetWorkID都是6666挖比特币还是以太坊,你可以通过以下步骤从节点一连接到节点二。

首先要知道节点2的enode信息,在节点2的Geth Console中执行以下命令查看enode信息:

> admin.nodeInfo.enode
"enode://d465bcbd5c34da7f4b8e00cbf9dd18e7e2c38fbd6642b7435f340c7d5168947ff2b822146e1dc1b07e02f7c15d5ca09249a92f1d0caa34587c9b2743172259ee@[::]:30303"

然后在节点1的Geth Console中执行admin.addPeer()连接节点2:

> admin.addPeer("enode://d465bcbd5c34da7f4b8e00cbf9dd18e7e2c38fbd6642b7435f340c7d5168947ff2b822146e1dc1b07e02f7c15d5ca09249a92f1d0caa34587c9b2743172259ee@[::]:30303")

addPeer() 参数为节点2的enode信息,注意将enode中的[::]替换为节点2的IP地址。连接成功后,节点2开始同步节点1的区块。同步完成后,任一节点开始挖矿,另一节点自动同步区块挖比特币还是以太坊,向任一节点发送交易,另一节点也会收到交易。

通过admin.peers可以查看其他连接节点信息,通过net.peerCount可以查看连接节点数。

挖比特币还是以太坊

除了上述方法外,还可以在启动节点时指定--bootnodes选项连接其他节点。

八、智能合约操作1、创建和编译智能合约

以太坊支持两种智能合约编程语言:Solidity 和 Serpent。 Serpent 语言面临一些安全问题,现已弃用。 Solidity 的语法类似于 JavaScript,它的编译器 solc 可以将智能合约源代码编译成可以被以太坊虚拟机 EVM 执行的二进制代码。

Solidity 编译器也有多种安装方式,参考这里介绍最简单快捷的安装方式。

Linux下直接安装

add-apt-repository ppa:ethereum/ethereum
apt update
apt install solc

您还可以使用基于浏览器的 IDE 环境:Remix。便于在私有链上部署。这里使用Remix来做介绍。

编写一个 Solidity 智能合约,其中包含一个方法 multiply() 将两个输入数字相乘并输出:

pragma solidity ^0.4.0;
contract TestContract
{
    function multiply(uint a, uint b) returns (uint)
    {
        return a * b;
    }
}

将以上代码复制到Remix编辑器中,程序会自动完成编译。

0.png

点击run选择Environment中的JavaScript VM,Value可以设置为1,点击Create,可以创建一个部署智能合约的事务。

1.png

因为我们要将智能合约部署到私有链上,所以需要编译智能合约 Post EVM 二进制代码和 JSON ABI(Application Binary Interface)。将生成的事务保存到scenario.json文件中,点击箭头所指的按钮。

挖比特币还是以太坊

2.png

53-75是智能合约的ABI(注意前面有[符号),ABI指定合约接口,包括可调用的合约方法、变量、事件等。

3.png

输入字段为合约EVM二进制码,点击直接复制即可。

4.png

Linux下,可以直接使用安装好的编译器编译保存合约代码,进入testContract.sol文件,使用以下两条命令分别获取EVM二进制代码和JSON ABI。

$solc --bin testContract.sol
$solc --abi testContract.sol

2、部署智能合约

回到Geth的控制台,用变量code和abi值记录上面两个:

> code = "0x6060604052341561000f57600080fd5b60ba8061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063165c4a16146044575b600080fd5b3415604e57600080fd5b606b60048080359060200190919080359060200190919050506081565b6040518082815260200191505060405180910390f35b60008183029050929150505600a165627a7a7230582081dd79a44dd90fc4995e529b4388568798ea418408704372336e0f019ab1d9480029"
> abi = [{"constant":false,"inputs":[{"name":"a","type":"uint256"},{"name":"b","type":"uint256"}],"name":"multiply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]

使用账号0部署合约,先解锁账号:

> personal.unlockAccount(eth.accounts[0])
Unlock account 0x3443ffb2a5ce3f4b80080791e0fde16a3fac2802
Passphrase:
true

创建合约实例并发送交易部署合约:

挖比特币还是以太坊

> myContract = eth.contract(abi)   
...
> contract = myContract.new({from:eth.accounts[0],data:code,gas:1000000})             

如果此时没有挖矿,使用 txpool.status 命令查看有 A 待处理的交易。使用miner.start()命令开始挖矿,一段时间后确认交易。通过查询该交易可得到合约地址,使用命令:

>eth.getTransactionReceipt("0x085b66b2591ee31c3ad58a66ca485bd19bea6c1fc8ca7550a896853ab52855a6")

合同地址:“0xd92845cc4bffc1d6a4b6a389933b88880d5ded24”

3、调用智能合约

使用如下命令通过发送交易来调用合约,sendTransaction方法的前几个参数要对应合约中multiply方法的输入参数。在这种情况下,交易通过挖矿被记录到区块链中:

>contract.multiply.sendTransaction(2, 4, {from:eth.accounts[0]})

在本地运行该方法直接查看返回结果,不会记录在区块链中,命令如下:

>contract.multiply.call(2, 4)

8

如果其他节点想要调用部署的合约,需要知道合约的地址和ABI。可以通过发送事务调用,也可以在本地调用。我们以拨打本地电话为例。

创建合约实例:

>abi = [{"constant":false,"inputs":[{"name":"a","type":"uint256"},{"name":"b","type":"uint256"}],"name":"multiply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]
>sample=eth.contract(abi)
>samplecontract=sample.at("0xd92845cc4bffc1d6a4b6a389933b88880d5ded24")

调用合约

>samplecontract.multiply.call(2,< @4)

8