📅  最后修改于: 2023-12-03 15:38:46.653000             🧑  作者: Mango
以太坊是一种分布式的计算平台,能够处理去中心化的应用程序。而私有以太坊网络则是用于内部测试、学习等目的的,其区块链网络需要自己搭建而不是使用公共的以太坊网络。
本文将介绍如何在本地搭建私有以太坊网络,并向大家展示如何通过 Solidity 编写智能合约,并在私有以太坊网络上进行部署、测试。
首先,你需要在本地安装 Node.js 、Git、geth 或者 parity 等以太坊客户端。这里以 geth 为例,你可以在 geth 官网下载相应的安装包并进行安装。
在创建一个以太坊网络之前,你需要先创建一个创世区块。这个区块是整个区块链网络的起点,可以定义网络中链的属性、协议的规则等等。下面是一个简单的创世区块示例:
{
"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 规范的起始区块高度。其他的参数都比较好理解,可以根据需求自行设置。
在上一步中,我们创建了一个创世区块,现在我们要用这个创世区块来初始化我们的私有以太坊网络。为此,我们需要在命令行运行以下的命令:
geth init /path/to/genesis.json --datadir /path/to/data/folder
这里 /path/to/genesis.json
指的是我们上一步中创建的创世区块文件,/path/to/data/folder
指的是我们要在哪个目录下存储私有以太坊网络的数据。在执行该命令后,你将在指定的目录下看到一些新的文件夹。
我们已经做好了创建私有以太坊网络的基础工作,现在我们来启动这个网络。为此,我们需要运行以下命令:
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!
在搭建好私有以太坊网络之后,我们可以开始编写智能合约了。在本例中,我们将编写一个非常简单的合约,它只有一些简单的状态变量和方法,可以用来存储数据和读取数据。
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 方法,以便我们可以从其他地方访问它们的值。我们也定义了两个方法,一个是设置变量的值的方法,另一个是获取变量的方法。
在编写完智能合约之后,我们需要将其部署到私有以太坊网络上。为此,我们可以使用 Remix 等 Solidity IDE 来编译和运行我们的合约。在使用 Remix 进行部署时,你需要确保指定正确的网络和合约地址,并用管理员账户进行操作。
另外,你也可以手动在客户端控制台中调用 web3.eth.contract(abi).new(args, callback)
方法来部署智能合约,不过这需要你对以太坊客户端的 API 和 Solidity 语言有很深入的理解。
部署成功之后,我们可以在私有以太坊网络上进行一些简单的测试。为此,我们可以调用智能合约的方法,比如获取变量的值、修改变量的值等等。这个过程可以使用 JavaScript 命令行或者其他的调用方式来完成。
本文介绍了如何在本地搭建私有以太坊网络,并向大家展示了如何使用 Solidity 编写智能合约,并在私有以太坊网络上进行部署、测试。私有以太坊网络不仅可以用于内部测试,也是学习区块链技术和智能合约编程的一个好途径。