区块链研习社使用PHP开发以太坊代币与合约以太坊

使用PHP开发以太坊代币与合约——关于以太坊

2019-07-04  本文已影响2人  有丫

我在一个早上时间写了两篇文章,这已经是第三篇,写到这里,有必要说一下关于以太坊我知道的一些事,作为采坑的经验而言,会对读者有多少的帮助。
我接触以太坊时间不是很久,也从来没有系统的去学习过,都是以实用为主,拿现有技术方案来用在项目中。在这期间,有很多东西,很多概念,我这里列出我认为可能对于新手有疑问的,或者我个人踩过坑的。

以太坊开发配件

以太坊开发环境首推的是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
在以太坊世界里,你可能耳熟能详的有这么几个单位:

  1. ether
  2. wei
  3. gwei
    你有多少个以太坊,以太坊现在的价格是多少,这里说的单位就是ether,如果以太坊价格一直走高,可能会产生另一种比ether小的单位:pwei,别认为不可能,在比特币钱包中,已经开始使用mBtc了。
    以太坊的最小单位是wei,是为了纪念制定了现代加密货币的戴维,当然,其实每个单位都有俚语。
    在查看手续费时,经常以gwei为单位,在以太坊拥堵时,手续费可能高达10-20左右。

以太坊中的手续费

手续费的设计在我看来似乎就是云计算厂商做的按量计费,只不是以太坊上的手续费更精确,只有写入才会收费,读取因为可以直接从本地节点读取,所以不收费。
你在开发中经常会看到这两个配置项:

  1. gasPrice
  2. gasLimit
    你可能在很多地方,很多文章中看到把gasLimit设置为0x52080x15F900x5208其实就是gasLimit的最小值。
    但是调高gasLimit并不能影响交易执行速度,想让交易尽快被打包确认,需要调高gasPrice

在很多类库中,不指定gasPrice是会自动调用以太坊的gasPrice函数计算当前合适的gasPrice,但是我因为使用公共节点,在发送交易时,需要指定gasPrice,这时候有两种选择,一种选择是调用gasPrice获取,另一种是根据某种算法去估算。
在业务系统中,很多时候因为以太坊拥堵,发送交易时,手续费为1gwei,发布后一直处于Pending状态,通过https://etherscan.io/chart/pendingtx可以直观看到以太坊现在的拥堵情况。这时候如果只有一个公共钱包进行充币、提币操作,这一笔1gwei的交易可能会把所有交易卡几个小时,在我们项目中,卡3个小时已经出现了不止一次。

因为手续费的问题我可能还要再写一篇文章来说明,我遇到的问题和我的解决方案。

关于以太坊要写的东西感觉有很多,但是写着写着又不能所有全部细说,写在这里先停止吧,欢迎留言交流讨论,个人QQ:275零9696七

上一篇下一篇

猜你喜欢

热点阅读