📜  如何建立自己的私有以太坊网络?(1)

📅  最后修改于: 2023-12-03 15:38:46.653000             🧑  作者: Mango

如何建立自己的私有以太坊网络?

介绍

以太坊是一种分布式的计算平台,能够处理去中心化的应用程序。而私有以太坊网络则是用于内部测试、学习等目的的,其区块链网络需要自己搭建而不是使用公共的以太坊网络。

本文将介绍如何在本地搭建私有以太坊网络,并向大家展示如何通过 Solidity 编写智能合约,并在私有以太坊网络上进行部署、测试。

步骤
1. 安装必要的软件

首先,你需要在本地安装 Node.js 、Git、geth 或者 parity 等以太坊客户端。这里以 geth 为例,你可以在 geth 官网下载相应的安装包并进行安装。

2. 创建创世区块

在创建一个以太坊网络之前,你需要先创建一个创世区块。这个区块是整个区块链网络的起点,可以定义网络中链的属性、协议的规则等等。下面是一个简单的创世区块示例:

{
  "config": {
        "chainId": 10,
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
    "alloc"      : {},
    "coinbase"   : "0x0000000000000000000000000000000000000000",
    "difficulty" : "0x1",
    "extraData"  : "",
    "gasLimit"   : "0x2fefd8",
    "nonce"      : "0x0000000000000042",
    "mixHash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",
    "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
    "timestamp"  : "0x00"
}

在这个示例中,chainId 表示链的 ID,homesteadBlock 表示 homestead 的区块高度,eip155Block 和 eip158Block 分别表示 EIP-155 和 EIP-158 规范的起始区块高度。其他的参数都比较好理解,可以根据需求自行设置。

3. 初始化一个私有网络

在上一步中,我们创建了一个创世区块,现在我们要用这个创世区块来初始化我们的私有以太坊网络。为此,我们需要在命令行运行以下的命令:

geth init /path/to/genesis.json --datadir /path/to/data/folder

这里 /path/to/genesis.json 指的是我们上一步中创建的创世区块文件,/path/to/data/folder 指的是我们要在哪个目录下存储私有以太坊网络的数据。在执行该命令后,你将在指定的目录下看到一些新的文件夹。

4. 启动私有网络

我们已经做好了创建私有以太坊网络的基础工作,现在我们来启动这个网络。为此,我们需要运行以下命令:

geth --networkid 12345 --nodiscover --datadir "/path/to/data/folder" --rpc --rpcport "8545" --rpccorsdomain "*" --rpcapi "eth,net,web3,personal"

其中,--networkid 为私有网络的 ID,这个 ID 的范围是 1 到 4294967295,根据需要自行设定即可;--nodiscover 为禁止外部节点发现本地节点;--rpc 表示启动以太坊客户端的 JSON-RPC 接口,允许外部的应用程序连接进来;--rpcport 表示 JSON-RPC 接口的端口号;--rpccorsdomain 表示允许哪些域名的 JavaScript 脚本可以访问 JSON-RPC 接口;--rpcapi 表示允许哪些以太坊 API 可以被 JavaScript 脚本调用。

在成功启动私有网络之后,你将看到一些类似这样的输出:

INFO [01-01|12:00:00.000] Starting peer-to-peer node               instance=Geth/v1.10.8-stable-xxxxxx
INFO [01-01|12:00:00.000] Node database                         dir=/path/to/data/folder/geth/chaindata
INFO [01-01|12:00:00.000] Initialised chain configuration          config="{ChainID: 12345 Homestead: N/A DAO: <nil> DAOSupport: false EIP150: <nil> EIP155: <nil> EIP158: <nil> Byzantium: <nil> Constantinople: <nil> Petersburg: <nil> Istanbul: <nil> Muir Glacier: <nil> Berlin: <nil> London: <nil> Engine: unknown}"
INFO [01-01|12:00:00.000] Starting peer-to-peer node               instance=Geth/v1.10.8-stable-xxxxxx
INFO [01-01|12:00:00.000] Initialized miner module
INFO [01-01|12:00:00.000] Etherbase automatically configured       address=0x0000000000000000000000000000000000000000
INFO [01-01|12:00:00.000] Database deduplication success           deduped=0
INFO [01-01|12:00:00.000] HTTP endpoint started                  url=http://localhost:8545 cors=* vhosts=localhost
INFO [01-01|12:00:00.000] Welcome to the Geth JavaScript console!
5. 编写智能合约

在搭建好私有以太坊网络之后,我们可以开始编写智能合约了。在本例中,我们将编写一个非常简单的合约,它只有一些简单的状态变量和方法,可以用来存储数据和读取数据。

pragma solidity 0.8.0;

contract MyContract {
    string public storedData;

    constructor(string memory x) {
        storedData = x;
    }

    function set(string memory x) public {
        storedData = x;
    }

    function get() public view returns (string memory) {
        return storedData;
    }
}

在这个示例中,我们定义了一个名为 MyContract 的智能合约,它包含一个名为 storedData 的公共字符串变量。通常情况下,公共变量都会被自动为合约创建一个 getter 方法,以便我们可以从其他地方访问它们的值。我们也定义了两个方法,一个是设置变量的值的方法,另一个是获取变量的方法。

6. 部署智能合约

在编写完智能合约之后,我们需要将其部署到私有以太坊网络上。为此,我们可以使用 Remix 等 Solidity IDE 来编译和运行我们的合约。在使用 Remix 进行部署时,你需要确保指定正确的网络和合约地址,并用管理员账户进行操作。

另外,你也可以手动在客户端控制台中调用 web3.eth.contract(abi).new(args, callback) 方法来部署智能合约,不过这需要你对以太坊客户端的 API 和 Solidity 语言有很深入的理解。

7. 测试智能合约

部署成功之后,我们可以在私有以太坊网络上进行一些简单的测试。为此,我们可以调用智能合约的方法,比如获取变量的值、修改变量的值等等。这个过程可以使用 JavaScript 命令行或者其他的调用方式来完成。

总结

本文介绍了如何在本地搭建私有以太坊网络,并向大家展示了如何使用 Solidity 编写智能合约,并在私有以太坊网络上进行部署、测试。私有以太坊网络不仅可以用于内部测试,也是学习区块链技术和智能合约编程的一个好途径。