web3.0 以太坊从零到略懂2:设置开发环境
第 0 步:要求
- 您正在使用MacOS
- 您对软件开发有基本的了解
- 你知道以太坊是什么并且理解它是基本的用法。
- 您对MacOS 终端的使用有基本的了解。
- 你已经安装了自制软件
第一步:设置测试网
虽然我们正在学习以太坊开发的来龙去脉,但我们可能不想用真实的以太币来测试真实的生产网络。
例如,为此目的,有几个以太坊测试网用于此目的; Rinkeby和Morden;然而,与这个网络进行交互仍然需要我们通过挖矿或从其他用户那里获取以太币来获取以太坊。
虽然我们最终将与公共测试网络合作,但对于像我们这样刚刚起步的初学者来说,这远非理想,而且很难获得大量的以太币。
更好的选择是建立我们的私人测试网,我们可以弯曲和扭曲;它还将让我们更深入地了解以太坊网络的内部运作。
让我们 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 步:创世区块
为了开始我们的私人测试网,我们需要一个创世块。每个区块链都需要一个创世块,它本质上是我们区块链的配置文件。
创世块是区块链的开始——第一个块,块 0,也是唯一不指向前驱块的块。该协议确保没有其他节点会同意您的区块链版本,除非它们具有相同的创世块,因此您可以创建任意数量的私有测试网区块链!
- 创建项目目录,例如
ethereum_0hero
- 打开您喜欢的编辑器并创建一个名为
HeroGenesis.json
- 复制以下内容并保存文件:
{
"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
这个命令做了一些事情:
- 利用我们之前创建的创世区块
- 它使用自定义数据目录而不是默认目录
- 将网络 id 设置为 24 以防止我们从主网络的 noes 中交谈
- 禁用对等发现
- 通过将 maxpeers 设置为 0 来禁用网络
- 启动 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 和智能合约进行开发。
- 原文作者:知识铺
- 原文链接:https://geek.zshipu.com/post/web3.0/%E4%BB%A5%E5%A4%AA%E5%9D%8A%E4%BB%8E%E9%9B%B6%E5%88%B0%E7%95%A5%E6%87%822%E8%AE%BE%E7%BD%AE%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。
- 免责声明:本页面内容均来源于站内编辑发布,部分信息来源互联网,并不意味着本站赞同其观点或者证实其内容的真实性,如涉及版权等问题,请立即联系客服进行更改或删除,保证您的合法权益。转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。也可以邮件至 sblig@126.com