区块链系列十八:solidity的一些问题(续)

最近开发solidity遇到的一些问题。

合约如何接受eth

contract中function被payable修饰, 则可以接受eth, solidity中可以通过msg.value获得transfer的eth。

每个contract有一个匿名函数,如果调用合约找不到匹配的函数, 就会调用此函数, 设置为payable即可接受eth。 注意, solidity每个版本的文档都有点不一样, 建议参考对应或者最新版本的文档。

能否由contract支付gas

额, 目前而言还不能, 估计等到SERENITY可以吧。 当然, 目前也可以通过refund方式, 由调用者支付了gas, contract里面再退给调用者eth或者等价的token吧。

tx.gasprice可以获取到gasprice, 而消耗的gas数量, 可以提前预估出来(remix中把鼠标放在某个函数前,右上角就有Execution cost), 当然预估不一定完全准确,比如如果有动态分配内存或者访问数组之类的, 可能就不准。

如果contract再调用contract, 第二次调用的gas谁出?

最开始的调用者, 即tx.origin!

如果contract再调用contract, 第二个contract里的msg.sender是谁

msg.sender是前一个合约, tx.origin是最开始的发起方。

tx.origin有些问题, 建议不要使用: https://github.com/ethereum/solidity/issues/683