在探索区块链技术,尤其是以太坊生态时,搭建一条私有链是开发者进行测试、学习和原型验证的常见选择,与公有链不同,私有链完全由单一组织或个人控制,没有代币挖矿机制,因此初始账户的设置,尤其是“默认余额”的配置,成为了一个基础且重要的环节,本文将深入探讨以太坊私有链中的“默认余额”概念、其重要性以及如何进行设置。
在以太坊公有链上,账户的余额是通过交易转移或挖矿奖励获得的,初始余额通常为0,而在私有链环境中,由于没有矿工和区块奖励,我们需要一种机制为初始账户(通常是创世账户)预先设定一定的以太币(ETH)余额,以便能够发起交易、部署合约等,这个预先为创世区块中账户设定的初始ETH数量,就是我们所说的“默认余额”(Default Balance)。


默认余额就是私有链启动时,创世账户中拥有的初始ETH数额,它是私有链“创世”时注入的“启动资金”。
以太坊私有链的搭建通常使用Geth(Go-Ethereum)客户端,设置默认余额主要在创建创世区块(Genesis File)时进行,创世区块是一个JSON格式的配置文件,定义了私有链的初始参数。

以下是一个典型的创世区块配置示例(genesis.json),并重点解释默认余额的设置:
{
"config": {
"chainId": 15, // 私有链的Chain ID,确保唯一性
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"berlinBlock": 0,
"londonBlock": 0,
"terminalTotalDifficulty": 0,
"terminalTotalDifficultyPassed": true
},
"alloc": {
// "0x..." 是以太坊地址,格式为40位十六进制数,以"0x"开头
// "100000000000000000000" 是该地址的初始余额,单位是Wei(1 ETH = 10^18 Wei)
"0x742d35Cc6634C0532925a3b844Bc454e4438f44e": {"balance": "100000000000000000000"},
"0xf17f52151EbEF6C7334FAD080c5704D77216b732": {"balance": "200000000000000000000"}
},
"coinbase": "0x0000000000000000000000000000000000000000", // 矿工地址,私有链中可忽略或设为固定值
"difficulty": "0x20000", // 初始难度,私有链可设为较低值以便快速出块
"extraData": "", // 附加信息
"gasLimit": "0xffffffff", // Gas上限,私有链通常设为较大值
"nonce": "0x0000000000000042",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp": "0x00"
}
关键点解析:
alloc 字段:这是设置默认余额的核心。alloc 是一个对象,其键值对为 地址: { "balance": "余额数量(以Wei为单位)" }。
account new命令或其他钱包工具生成),并将这些地址填入alloc对象中。"100000000000000000000" 表示 100 ETH(因为 100 * 10^18 = 100000000000000000000)。geth account new --datadir ./my_private_chain 这会创建一个新的加密账户,并返回地址。genesis.json的alloc字段。genesis.json后,使用geth --datadir ./my_private_chain init ./genesis.json命令来初始化创世区块。alloc中指定的地址就会被赋予预设的余额。alloc中的地址格式正确,40位十六进制数,以"0x"开头,且大小写敏感。fromwei和towei)。alloc分配的余额很难被修改或清除。