主页 > imtoken国内版下载 > 以太坊私链Geth控制台操作教程

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

imtoken国内版下载 2023-04-12 06:54:49

本文是以太坊私链搭建教程的延续,介绍以太坊私链Geth控制台操作教程。

1.geth控制台

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

更多方法请参考:

常用的命令有:

2. 创建账户

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

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

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

>eth.accounts

3.查看账户余额

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

4.挖矿

开始挖矿:

>miner.start(1)

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

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

>miner.stop()

挖出一个区块会奖励以太坊,挖矿获得的奖励会进入矿工账户。 这个账户叫做 coinbase。 默认情况下,coinbase 是本地账户中的第一个账户。 您可以通过 miner.setEtherbase() 将其他账户设置为 coinbase。

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

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

5.交易

目前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

6.查看交易和区块

查看当前区块总数:

> eth.blockNumber
4

按块号查看块:

> eth.getBlock(4)

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

>  eth.getTransaction("0x9f5e61f3d686f793e2df6378d1633d7a9d1df8ec8c597441e1355112d102a6ce")

七、其他节点加入

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

假设有两个节点:Node 1和Node 2,NetWorkID为6666,可以通过以下步骤从Node 1连接到Node 2。

首先需要知道节点2的enode信息,在节点2的Geth控制台执行如下命令查看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编辑器中,程序会自动编译。

以太坊是公有链吗_以太坊是私有链_sitejinse.com 以太坊是区块链吗

0.png

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

以太坊是公有链吗_以太坊是私有链_sitejinse.com 以太坊是区块链吗

1.png

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

以太坊是公有链吗_以太坊是私有链_sitejinse.com 以太坊是区块链吗

2.png

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

以太坊是公有链吗_以太坊是私有链_sitejinse.com 以太坊是区块链吗

3.png

输入栏为合约EVM二进制代码以太坊是私有链,点击直接复制。

以太坊是公有链吗_以太坊是私有链_sitejinse.com 以太坊是区块链吗

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命令查看本地交易池中是否有交易待确认。 使用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个