【老董直播答疑】

Q1. 想问下solidity如何判断mapping里面是否存在某个key呀?以及return时候我可以返回一个mapping结构吗?以及return时候我可以返回一个mapping结构吗?

  • 只能通过查看这个mapping里面对应的key的值是不是那个值的类的默认值来决定。return map是做不到的。

Q2. function的内部运行原子操作,那么在function内部,多次获取now,会是相同的么?

  • now = 当前这个区块被创建的时候的timestamp,在程序中是不可靠的。设计到转账的操作尽量避免使用时间戳。

Q3. 函数里面有支付的语句:employee.transfer(),那为什么函数不加payable呢?

  • payable只在你调用这个函数的同时给这个合约付钱的时候才会加

Q4. transfer和send有哪些差别

  • transfer会抛出异常,send只会return true 或者是false。异常要自己捕捉。

Q5. 请问老师:solidity error handling中,什么时候应该用掉所有gas,什么时候应该吧没用掉的gas还给user?

  • assert()会消耗所有的gas,当你觉得,程序如果碰触到assert,一定是我程序出了大bug,那么你就应该消耗掉所有的gas

Q6. transaction cost 和execution cost的区别

  • trasnaction cost包括value trasnfer的cost,data transfer的cost,但是execution cost只限于合约执行

Q7. 一个contract能不能对不同的data specify特定的address才能访问,比如说我在不同的getter里面require不同的address. 但有一个问题是合约都是部署在public chain上面的,那合约中的storage是不是谁都可以看得到呢?

  • 隐私在公链上面是不存在的,因为都可以在storage里面看到,除非使用ZKSNARK/STARK

Q8. 在自己制作的网站中调取智能合约的函数如何才能不消耗用户的eth?比如能否预存一些eth给合约使用,就不要求用户通过metamask这样的插件提供eth了。

  • 这个比较复杂,需要存一定的ETH,然后让用户调用这个函数之后,这个函数返还ETH给用户

Q9. 实验环境每次消耗的总gas(transaction gas 和execution gas的和)是一定的,这个是为什么?

  • 因为你每次的gas limit是一样的哈

Q10. 能否仔细讲讲remove数组元素的过程Frank有个小技巧把要删除的元素赋值给数组最后一个值是怎么回事

  • 缩小length之后,相当于最后那个元素就被释放了

Q11. 刚解答第二个问题中提到,旧合约升级,旧数据迁移,具体是如何迁移的呢?

  • 做一个数据的snapshot,然后在数据合约当中,就要有设计好migrate的接口

Q12. 以太坊的地址是可以随便设置的吗?比如0x35256776ad344这样?btc有校验的,这样如果不小心,eth会打错地方

  • 不可以,公钥私钥都是配对的
posted on 2019-01-14 16:19  王庆东mas  阅读(577)  评论(0编辑  收藏  举报