[币严区块链]ETH搭建节点区块数据同步的三种模式:full、fast、light

ETH  全节点Archive(归档)模式数据量增长图

上述图表可通过链接查看:https://etherscan.io/chartsync/chainarchive

 

通过上表,可以看到截止2019年8月12日,以太坊的全部区块数据已经高达2.8T,如果按照比特币的方式搭建全节点,会是一个很痛苦的事,毕竟云硬盘也不是那么便宜的。

做数字钱包或交易所的开发人员里,有聪明人可能会意识到一个问题,在处理用户账户充值时,我们所关注的数据仅仅是从当前开始到未来这段时间的区块数据,那么巨大体积的历史区块数据没什么用处。

有问题,自然会有更聪明的人解决问题,鉴于ETH庞大的区块数据,并且不断在增长,ETH提供了三种同步模式:

  • –syncmode  "fast"         Enable fast syncing through state downloads
  • –syncmode  "light"        Enable light client mode
  • –syncmode  "full"

在Geth1.6以前,fast与full模式的命令参数为  --fast与--full。Geth 1.6版本及以后,两种命令参数都可使用。

 

使用方法,启动命令如下:

./geth --datadir  "D:\Program Files\Geth\data"  --syncmode  "fast"  --rpc  --rpcapi  "db,eth,net,web3,miner" 

上面的命令指定了区块数据与秘钥文件的存储目录:D:\Program Files\Geth\data

也指定了同步模式是: --syncmode  "fast"

同时开启了RPC方式模式: --rpc  --rpcapi  "db,eth,net,web3,miner" 

 

本文中,我们需要关注就是: -- syncmode,下面对三种同步模式做一个介绍:

Full同步步骤:

获取区块的header

获取区块的body

从创始块开始校验每一个元素

PS:下载所有区块数据信息,所以此种方式的数据量会十分庞大

Fast同步:

获取区块的header

获取区块的body

在同步到当前块之前不处理任何事务,然后获得一个快照,像full节点一样进行后面的同步操作。沿着区块下载最近数据库中的交易,有可能丢失历史数据。比如,你的账户地址A上面有10个ETH,但转入的的交易存在于较老的历史交易中,此同步模式无法获取到交易的详细情况。

使用此模式时注意需要设置–cache,默认16M,建议设置为1G(1024)到2G(2048)。

Ligth同步:

仅获取当前状态。验证元素需要向full节点发起相应的请求。

 

此外,启动ETH节点时还可以增加--gcmode=archive,这个模式称为归档Archive模式,即归档节点,这种模式保存了最最最全的Ethereum节点数据,占用硬盘空间也会更大。其数据量比单纯的full模式数量还要大。这个参数很多人不知道,大部分也没法用这个启动模式,因为需要的存储空间实在太大。启动命令一般如下:

./geth --datadir  "D:\Program Files\Geth\data"  --syncmode  "fast"    --gcmode=archive  --rpc  --rpcapi  "db,eth,net,web3,miner" 

 

那么,作为交易所与钱包服务商,如何选择合适的模式呢?如果对安全性要求极高,并且有充足的硬盘资源,自然是选择Full模式。而对于一般情况下,可使用Fast模式,因为Full模式同步区块数据需要很长时间。截止到本文发文时间2019-08-12,Fast模式需要同步数据大小为132GB,相较于Full模式的2.8TB而言,小了很多。Light模式对于轻量级的移动钱包比较适用。

 

附,当前Fast模式数据量大小变化:

 数据查看链接:https://etherscan.io/chart2/chaindatasizefast

 

BIZZAN(币严) 数字货币交易平台APP下载:

https://www.bizzan.com/app

BIZZAN(币严) 数字货币交易所官方网址:

https://www.bizzan.com

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用 PHP 监听以太坊区块并获取每个区块中所有的 NFT 数据,可以使用 Ethereum-PHP 库。该库提供了一些方便的方法来连接以太坊节点、执行智能合约方法和监听区块等操作。 以下是一个示例代码,可以连接到以太坊节点并监听每个区块中的 NFT 转移事件: ```php <?php require_once 'vendor/autoload.php'; use Ethereum\Ethereum; $nftAbi = '[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"}]'; $nftAddress = '0x1234567890123456789012345678901234567890'; // 这里需要替换为 NFT 合约的地址 $web3 = new Ethereum('http://localhost:8545'); // 这里需要替换为你的节点地址 $fromBlock = 0; // 从第 0 个区块开始监听 $web3->eth_subscribe('logs', [ 'address' => $nftAddress, 'topics' => ['0x' . hash('sha3', 'Transfer(address,address,uint256)')], 'fromBlock' => '0x' . dechex($fromBlock) ], function ($error, $result) use ($web3, $nftAddress) { if ($error) { echo 'Error: ' . $error . "\n"; return; } $log = $result['data']; $from = $web3->eth_hexToAddress($log['topics'][1]); $to = $web3->eth_hexToAddress($log['topics'][2]); $tokenId = $web3->eth_hexToNumber($log['topics'][3]); echo 'NFT ' . $tokenId . ' transferred from ' . $from . ' to ' . $to . "\n"; $owner = $web3->eth_call([ 'to' => $nftAddress, 'data' => '0x6352211e' . str_pad($web3->eth_numberToHex($tokenId), 64, '0', STR_PAD_LEFT) // 这里调用 ownerOf 方法,需要根据 ABI 获取方法 ID ]); echo 'Owner of NFT ' . $tokenId . ': ' . $owner . "\n"; $metadata = $web3->eth_call([ 'to' => $nftAddress, 'data' => '0x6352211e' . str_pad($web3->eth_numberToHex($tokenId), 64, '0', STR_PAD_LEFT) // 这里调用 tokenURI 方法,需要根据 ABI 获取方法 ID ]); echo 'Metadata of NFT ' . $tokenId . ': ' . $metadata . "\n"; }); ``` 在这个示例代码中,首先定义了 NFT 合约的 ABI 和地址。然后创建了一个 Ethereum 对象,并连接到以太坊节点。接着使用 `eth_subscribe` 方法订阅 `logs` 事件,过滤出 NFT 合约中的 `Transfer` 事件,并指定从第 0 个区块开始监听。 在事件处理函数中,首先从事件日志中解析出转移前后的账户地址和 NFT ID。然后使用 `eth_call` 方法查询 NFT 的拥有者和元数据链接。每当有一次 NFT 转移时,都会在控制台输出 NFT 的详细信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值