初学solidity时的疑惑点及对应理解

  • zhtkeepup
  • 更新于 2024-04-20 10:16
  • 阅读 984

1.什么是合约的部署?2.什么是调用合约?3.如何理解转账

全角空格:[  ] (读者请忽略本行)

1. 什么是合约的部署?

  以普通非区块链程序员的视角来理解,我想可以是这样:\   首先可以认为EVM是一个永不重启的虚拟机(就假设它是一个永不重启的程序),而EVM里的智能合约可以当成是这个虚拟机里的内存对象。部署合约,可以理解成外部世界向EVM发送创建一个内存对象(合约)的指令,该内存对象遵循一定的逻辑规则,即我们编写的solidity代码。每个内存合约对象在EVM内有唯一的ID(即address),合约对象一旦创建,其内部的规则逻辑即不可篡改。\   所以,相同的solidity代码,部署两次,就生成两个EVM内的合约对象,且两者相互独立没有任何关联,除非程序员在合约代码内实现一些有相互关联的逻辑。

2. 什么是调用合约?

  调用合约就是类似于下面的语法(ContractBank表示solidity代码里的一个Contract类型):\   ContractBank(0x123abc).func123();\   如果在方法func123()内部对合约对象里的变量进行修改,即发生了状态改变,则永久生效,不存在“重新部署或者重启恢复”的说法,若要名义上的恢复,应该重新调用某个已经实现的方法来修改变量(达到让它恢复的效果)。\   转账是特殊的调用,使用固定的方法名transfer(...), 如 ContractBank(0x123abc).transfer(120000000000000000) 。\   (表示向地址为0x123abc的合约转账1.2个ETH,从当前发起调用的地址的账户中扣除1.2个ETH)   

3. 如何理解转账?

  (基于solidity代码部署的)EVM里的合约对象,虽然开发者在solidity代码里没有明确写明,但按照个人理解,每个合约对象都有一个隐含的transfer(...)方法,在合约代码里,其它合约对象或者EOA可以通过语法 payable(address(0x123abc)).transfer(120000000000000000)来调用这个方法,其目的是将调用者拥有的以太币转账给0x123abc这个地址对应的合约或者EOA,也就是只能将自己的钱给别人,不能把别人的钱转给自己(还想无中生有?想啥呢buddy)。当transfer()方法完成后,调用者的余额自动减少,0x123abc的余额自动增加。\   两个账户的余额的增加与减少,不需要开发者处理,EVM内部自动会完成这个操作。同时,开发者可以通过 address(0x123abc).balance 来查询指定地址(0x123abc)的账户余额。\   同时 ,若0x123abc是一个合约对象的地址,其transfer(...) 内部还有额外的处理规则,如下:\   1. (再次说明:首先系统默认具备两个账户间的金额转移功能, 因此开发者无需处理余额的变化)\   2. (接收金额的)合约对象的transfer(...)被调用时,在transfer()内部会默认尝试调用合约对象的receive() 方法,若该合约对象内没有receive()方法,则再去尝试调用fallback()方法,若也没有fallback()方法,则系统处理失败。因此当合约需要接收其他账户的转账时,合约代码里应该实现receive方法或fallback方法时,并且对应方法需要用payable修饰。\   3. 若合约内的非transfer方法被外部调用的同时,需要接受外部账户的转账,则该方法也应该用payable修饰)。

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
zhtkeepup
zhtkeepup
0x61bd...dc91
江湖只有他的大名,没有他的介绍。