使用PHP开发以太坊代币与合约——关于以太坊
我在一个早上时间写了两篇文章,这已经是第三篇,写到这里,有必要说一下关于以太坊我知道的一些事,作为采坑的经验而言,会对读者有多少的帮助。
我接触以太坊时间不是很久,也从来没有系统的去学习过,都是以实用为主,拿现有技术方案来用在项目中。在这期间,有很多东西,很多概念,我这里列出我认为可能对于新手有疑问的,或者我个人踩过坑的。
以太坊开发配件
以太坊开发环境首推的是truffle
整个生态链,使用Ganache
启动一个本地以太坊测试链显然是最方便,也最好理解的一种。
智能合约类库肯定是openzeppelin
了,发行部署自己的ERC20代币很是方便。ERC721虽然还有很多代码要自己实现,但是总的比自己去做要容易的多。
但是具体开发智能合约,尤其是有复杂逻辑的智能合约,还是推荐使用https://remix.ethereum.org/
测试链因为没有打包、挖矿过程,一些复杂的逻辑在测试链做好,上生产后你会一脸懵逼,尤其对于时间敏感的合约调用,你可能现在发布的交易,成功已经是一两个小时后。
期间由于手续费等各种原因,致使本地测试环境与线上屡屡产生问题。
所以还是很推荐在以太坊官方的测试链上进行测试,比如说rinkeby
,因为从源头禁止了挖矿,算是比较稳定,而且有区块浏览器可以使用。
以太坊中的数值
在以太坊中是没有小数的,所有小数都只是表示形式,展示多少位小数,然后才对于数值进行小数展示。
比如以太坊是18位小数,又比如ERC20规范中,就有一项是Decimals。
不使用小数的原因主要是因为精度问题,众所周知的一些问题,比如0.1+0.2
很多编程语言中都有类似问题,只是某些编程语言从类库层面避免了此类问题,比如说神奇的PHP。
在智能合约中,接触最多的一个数值类型就是uint256,这是多么大的一个数字,你只要看看其他编程语言中的数据类型就知道了。所以在和以太坊交互中,各种编程语言类库都会做一个BigInteger
,在PHP中,我们使用这个composer包:
"phpseclib/phpseclib": "~2.0",
但这个包却是一个安全通信的包,里面有诸如RSA和AES等加密,我们仅仅使用其中的BigInteger
。
在以太坊世界里,你可能耳熟能详的有这么几个单位:
- ether
- wei
- gwei
你有多少个以太坊,以太坊现在的价格是多少,这里说的单位就是ether
,如果以太坊价格一直走高,可能会产生另一种比ether小的单位:pwei
,别认为不可能,在比特币钱包中,已经开始使用mBtc
了。
以太坊的最小单位是wei
,是为了纪念制定了现代加密货币的戴维,当然,其实每个单位都有俚语。
在查看手续费时,经常以gwei
为单位,在以太坊拥堵时,手续费可能高达10-20左右。
以太坊中的手续费
手续费的设计在我看来似乎就是云计算厂商做的按量计费,只不是以太坊上的手续费更精确,只有写入才会收费,读取因为可以直接从本地节点读取,所以不收费。
你在开发中经常会看到这两个配置项:
- gasPrice
- gasLimit
你可能在很多地方,很多文章中看到把gasLimit设置为0x5208
或0x15F90
,0x5208
其实就是gasLimit的最小值。
但是调高gasLimit
并不能影响交易执行速度,想让交易尽快被打包确认,需要调高gasPrice
。
在很多类库中,不指定gasPrice
是会自动调用以太坊的gasPrice
函数计算当前合适的gasPrice
,但是我因为使用公共节点,在发送交易时,需要指定gasPrice
,这时候有两种选择,一种选择是调用gasPrice
获取,另一种是根据某种算法去估算。
在业务系统中,很多时候因为以太坊拥堵,发送交易时,手续费为1gwei,发布后一直处于Pending
状态,通过https://etherscan.io/chart/pendingtx可以直观看到以太坊现在的拥堵情况。这时候如果只有一个公共钱包进行充币、提币操作,这一笔1gwei的交易可能会把所有交易卡几个小时,在我们项目中,卡3个小时已经出现了不止一次。
因为手续费的问题我可能还要再写一篇文章来说明,我遇到的问题和我的解决方案。
关于以太坊要写的东西感觉有很多,但是写着写着又不能所有全部细说,写在这里先停止吧,欢迎留言交流讨论,个人QQ:275零9696七