第 0 步:要求

  • 您正在使用MacOS
  • 您对软件开发有基本的了解
  • 你知道以太坊是什么并且理解它是基本的用法。
  • 您对MacOS 终端的使用有基本的了解。
  • 你已经安装了自制软件

第一步:设置测试网

虽然我们正在学习以太坊开发的来龙去脉,但我们可能不想用真实的以太币来测试真实的生产网络。

例如,为此目的,有几个以太坊测试网用于此目的; RinkebyMorden;然而,与这个网络进行交互仍然需要我们通过挖矿或从其他用户那里获取以太币来获取以太坊。

虽然我们最终将与公共测试网络合作,但对于像我们这样刚刚起步的初学者来说,这远非理想,而且很难获得大量的以太币。

更好的选择是建立我们的私人测试网,我们可以弯曲和扭曲;它还将让我们更深入地了解以太坊网络的内部运作。

让我们 GETH 去吧

我们需要安装 geth,一个 go CLI 客户端,它允许我们在本地运行完整的以太坊节点。

brew tap ethereum/ethereum brew install ethereum

我们可以通过键入以下内容来验证所有内容是否正确安装:

geth version

这应该为您提供类似于以下内容的输出:

Geth
Version: 1.7.3-stable
Architecture: amd64
Protocol Versions: [63 62]
Network Id: 1
Go Version: go1.9.2
Operating System: darwin
GOPATH=
GOROOT=/usr/local/Cellar/go/1.9.2/libexec

第 2 步:创世区块

image-20220611200010405

为了开始我们的私人测试网,我们需要一个创世块。每个区块链都需要一个创世块,它本质上是我们区块链的配置文件。

创世块是区块链的开始——第一个块,块 0,也是唯一不指向前驱块的块。该协议确保没有其他节点会同意您的区块链版本,除非它们具有相同的创世块,因此您可以创建任意数量的私有测试网区块链!

  1. 创建项目目录,例如ethereum_0hero
  2. 打开您喜欢的编辑器并创建一个名为HeroGenesis.json
  3. 复制以下内容并保存文件:
{
    "config": {
        "chainId": 24,
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
    "nonce": "0x0000000000000042",     
    "timestamp": "0x0",
    "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "extraData": "0x0",     
    "gasLimit": "0x8000000",     
    "difficulty": "0x400",
    "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "coinbase": "0x3333333333333333333333333333333333333333",     
    "alloc": {     }
}

如您所见,文件内容是 json 格式,大部分内容是不言自明的,但让我们快速回顾一下每个参数以阐明它们的用途。

  • coinbase:从成功挖掘该区块中收集的所有奖励(以太币)已转移到的 160 位地址。这可以是创世块中的任何内容,因为该值是由矿工在创建新块时设置的。
  • timestamp:一个标量值,等于 Unix time() 函数在此块开始时的合理输出。最后两个块之间的较小周期导致难度级别增加,因此需要额外的计算来找到下一个有效块。
  • 难度:定义了挖矿目标,可以根据前一个区块的难度等级和时间戳计算得出。难度越高,矿工为了发现有效区块必须执行的统计计算就越多。该值用于控制区块链的出块时间,使出块频率保持在目标范围内。在测试网络上,我们将此值保持在较低水平以避免在测试期间等待,因为在区块链上执行交易需要发现有效块。
  • gasLimit:一个标量值,等于当前链范围内每个区块的 Gas 支出限制。在我们的例子中,高以避免在测试期间受到此阈值的限制。

最后,配置参数可以确保从一开始就可以进行某些协议升级

有关完整说明,请在stackexchange中查看此答案

接下来,我们需要通过运行以下命令来初始化我们的链:

geth --datadir ./TestNetData init HeroGenesis.json

设置数据目录很重要,否则我们将覆盖真实以太坊网络的默认数据目录。

输出应返回类似于以下内容:

WARN [12-22|15:32:55] No etherbase set and no accounts found as default
INFO [12-22|15:32:55] Allocated cache and file handles         database=/Users/.../ethereum_0hero/TestNetData/geth/chaindata cache=16 handles=16
INFO [12-22|15:32:55] Writing custom genesis block
INFO [12-22|15:32:55] Successfully wrote genesis state         database=chaindata                                                                 hash=6231b0…a0300b
INFO [12-22|15:32:55] Allocated cache and file handles         database=/Users/.../ethereum_0hero/TestNetData/geth/lightchaindata cache=16 handles=16
INFO [12-22|15:32:55] Writing custom genesis block
INFO [12-22|15:32:55] Successfully wrote genesis state         database=lightchaindata       

第 3 步:运行本地节点

现在我们创建了初始链,我们可以通过执行以下命令来运行它:

geth --datadir ./TestNetData --identity "HeroNode1" --rpc --rpcport "8080" --rpccorsdomain "*" --port "30303" --nodiscover --rpcapi "db,eth,net,web3" --maxpeers 0 --networkid 24 console

这个命令做了一些事情:

  1. 利用我们之前创建的创世区块
  2. 它使用自定义数据目录而不是默认目录
  3. 将网络 id 设置为 24 以防止我们从主网络的 noes 中交谈
  4. 禁用对等发现
  5. 通过将 maxpeers 设置为 0 来禁用网络
  6. 启动 geth 控制台,以便我们可以与区块链/节点进行交互

输出应该类似于以下内容:


WARN [12-22|16:10:27] No etherbase set and no accounts found as default
INFO [12-22|16:10:27] Starting peer-to-peer node               instance=Geth/HeroNode1/v1.7.3-stable/darwin-amd64/go1.9.2
INFO [12-22|16:10:27] Allocated cache and file handles         database=/Users/.../ethereum_0hero/TestNetData/geth/chaindata cache=128 handles=1024
INFO [12-22|16:10:27] Initialised chain configuration          config="{ChainID: 24 Homestead: 0 DAO: <nil> DAOSupport: false EIP150: <nil> EIP155: 0 EIP158: 0 Byzantium: <nil> Engine: unknown}"
INFO [12-22|16:10:27] Disk storage enabled for ethash caches   dir=/Users/.../ethereum_0hero/TestNetData/geth/ethash count=3
INFO [12-22|16:10:27] Disk storage enabled for ethash DAGs     dir=/Users/.../.ethash                                              count=2
INFO [12-22|16:10:27] Initialising Ethereum protocol           versions="[63 62]" network=24
INFO [12-22|16:10:27] Loaded most recent local header          number=0 hash=6231b0…a0300b td=1024
INFO [12-22|16:10:27] Loaded most recent local full block      number=0 hash=6231b0…a0300b td=1024
INFO [12-22|16:10:27] Loaded most recent local fast block      number=0 hash=6231b0…a0300b td=1024
INFO [12-22|16:10:27] Loaded local transaction journal         transactions=0 dropped=0
INFO [12-22|16:10:27] Regenerated local transaction journal    transactions=0 accounts=0
INFO [12-22|16:10:27] Starting P2P networking
INFO [12-22|16:10:27] RLPx listener up                         self="enode://...f?discport=0"
INFO [12-22|16:10:27] IPC endpoint opened: /Users/.../ethereum_0hero/TestNetData/geth.ipc
INFO [12-22|16:10:27] HTTP endpoint opened: http://127.0.0.1:8080
Welcome to the Geth JavaScript console!

此时,您应该已启动并运行,并且在 geth 控制台中准备好做一些事情,但是什么?

好吧,让我们将注意力转移到以下警告:

WARN 未设置 etherbase 且未找到默认帐户

我们已经启动并运行了节点,但没有任何帐户它不会有太大用处。

第 4 步:创建帐户

由于我们已经在 Geth 控制台中,因此更容易直接从那里创建一个帐户,因此在终端中键入以下内容:

personal.newAccount()

控制台将要求输入密码不要丢失!,并返回 a 如下所示:

0xe857331e4e3354bb72b3751cce419c8444e89e17

让我们通过运行来验证该帐户是否存在:

> eth.getBalance("0xe857331e4e3354bb72b3751cce419c8444e89e17") 0

现在,让我们在该帐户中存入一些以太币。

第 5 步:让我们进行 Geth 挖矿

快速回顾:

  • 我们有一个有效的专用网络,其中一个节点在本地运行
  • 我们在所述专用网络上创建一个测试帐户
  • 我们在那个账户里没有任何以太币,我们需要修复它

现在,虽然我们可以使用创世区块轻松地向我们的帐户发行以太币,但让我们玩得开心,并在我们的私人网络上挖掘以太币。

打开一个新的终端选项卡并运行以下命令:

get attach ./<DirectoryName>/geth.ipc

这会将我们的第二个终端连接到现有的 geth 实例并打开Javascript控制台。在控制台内运行以下命令:

miner.setEtherbase("0xe857331e4e3354bb72b3751cce419c8444e89e17") miner.start()

如果我们回到我们的第一个终端,我们应该会看到以下情况:

INFO [12-22|17:07:55] Updated mining threads                   threads=0
INFO [12-22|17:07:55] Transaction pool price threshold updated price=18000000000
INFO [12-22|17:07:55] Starting mining operation
INFO [12-22|17:07:55] Commit new mining work                   number=1 txs=0 uncles=0 elapsed=981.307µs
INFO [12-22|17:07:57] Generating DAG in progress               epoch=0 percentage=0 elapsed=577.592ms
INFO [12-22|17:07:57] Generating DAG in progress               epoch=0 percentage=1 elapsed=1.168s
INFO [12-22|17:07:58] Generating DAG in progress               epoch=0 percentage=2 elapsed=1.985s
INFO [12-22|17:07:59] Generating DAG in progress               epoch=0 percentage=3 elapsed=2.586s

让我们回到第二个终端并停止矿机并检查我们的余额:

miner.stop() eth.getBalance('0xe857331e4e3354bb72b3751cce419c8444e89e17') 75000000000000000000

恭喜!我们现在已经创建了我们的私有网络并开采了我们少量的以太币,并且我们拥有一个有效的网络,我们可以使用它来开发我们的智能合约DApps

在本系列的下一篇文章中,我们将开始使用 Solidity 和智能合约进行开发。