学区块链做的笔记Day2,大部分内容来自《精通以太坊》。

全功能节点的好处和弊端

好处:

  • 为以太坊的可扩展性和防审查机制提供更强的支持。
  • 可信的验证所有交易。
  • 可以跟以太坊主网上的所有合约进行交互,并不需要任何中间角色。
  • 可以在以太坊主网上直接部署合约,并不需要任何中间角色。
  • 可以在需要时离线查询(只读形式)区块链的状态,例如:账户,合约。

弊端:

  • 需要大量并且不断增长的硬件以及带宽资源。
  • 需要数小时甚至数天的时间才能完成区块链数据的同步。
  • 必须持续地维护,升级,保持节点在线才能保证区块链数据的同步。

公共测试网络的好处和弊端

好处:

  • 测试网络节点只需要同步和保存大约10G的区块链数据(2018年4月)。
  • 测试网络节点的区块数据同步只需要数小时就能完成。
  • 在测试网络上部署合约或发起交易所需要的以太币是没有成本的,(可以免费获取)。
  • 测试网络是一个包含众多其他用户和合约的正在实际运行的公共区块链。

弊端;

  • 不能测试网络上使用真实以太币。同样,无法在测试网络上检测安全性,因为并没有黑客对这些没有价值的交易和合约感兴趣。
  • 有些针对主网功能的测试无法在测试网络上完成,例如:交易手续费(虽然对于在主网上发送交易来说仍是必须的)在测试网络上往往会被忽略,因为gas是免费的。还有,测试网上不会出现主网上有时遭遇的拥堵情形。

本地区块链模拟器的好处和弊端

好处:

  • 不需要同步区块链数据,几乎不会占用硬盘空间。开发者自己完成第一个区块的挖矿。
  • 不需要设法获得测试以太币,开发者在挖矿时可以给自己“奖励’’以太币并用于测试。
  • 没有其他用户。
  • 没有其他合约,只有你在私有区块链启动之后在其上部署的合约。

弊端:

  • 没有其他用户意味着跟公链上有区别。私有区块链上并没有交易打包空间或交易打包顺序的竞争。
  • 只有你一个人挖矿,意味着挖矿行为的可预测性,因此没有办法测试在公链上跟挖矿有关的一些场景。
  • 没有其他合约意味着你必须部署测试所需要的所有依赖合约和各种合约库。
  • 无法重建一些公链上的合约并使用它们在公链上的地址进行特殊测试,如:DAO合约

运行以太坊客户端

这里虽然我也很想运行全功能节点的客户端,但是硬件实在有限。

作者写书的时候(2018年4月)写的硬盘的要求才只需要80G

到了现在(2023年12月)以太坊主网的大小已经到了345G

Ethereum / Ether (ETH) statistics - Price, Blocks Count, Difficulty, Hashrate, Value (bitinfocharts.com)

image-20231206232858061

Ethereum Classic也要55G

Ethereum Classic (ETC) statistics - Price, Blocks Count, Difficulty, Hashrate, Value (bitinfocharts.com)

image-20231206232958901

所以这段只能先跳过,如果后面要用到大概也不会用以太坊主网做教学吧(?

所以后面能用测试网络还是就用测试网络吧。。。

JSON-RPC接口

以太坊客户端的API是一组远程过程调用(RPC)命令,并采用JSON格式编码。这被称为JSON-RPCAPI。最基本的,JSON-RPCAPI作为一个接口,允许程序员编写代码,把以太坊客户端作为进入以太坊网络和区块数据的大门(网关)。

RPC的接口通常使用8545端口以HTTP协议的方式对外服务,出于安全考虑,这个API只允许本机访问。

在Ganache中可以从这里查看RPC开放的端口。

image-20231206234126079

如果客户端已经运行好了。

可以通过命令查看回显

1
curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":1}' http://127.0.0.1:7545

image-20231206234804788

这里报了个恶心的错误,它说我的单引号不规范(我看着也不规范,看着就是全角的),但是我确实是用英文输入法输入的,上面代码框里这段就是我直接从cmd里复制过来的,可以看到确实是英文的单引号,这里用双引号加转移符是可以访问成功的。

1
curl -X POST -H "Content-Type: application/json" --data "{\"jsonrpc\":\"2.0\",\"method\":\"web3_clientVersion\",\"params\":[],\"id\":1}" http://127.0.0.1:7545

image-20231206235054901

但是每次都写转移真的太麻烦了,这里也可以用其他方法,这段其实就是发送POST请求,所以我直接用浏览器发也是可以成功的。也可以用POSTMAN,BP啥的反正能用就行(如果没有这些工具也可以先接着往下看

image-20231206235214038

获取当前gas的价格

1
{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":1}

调用成功

1
{"id":1,"jsonrpc":"2.0","result":"0x4a817c800"}

关于接口的更多信息访问ethereum.github.io/execution-apis/api-documentation/查看

里面甚至直接内置了POST插件

image-20231207000329071