1.什么是合约的部署?2.什么是调用合约?3.如何理解转账
全角空格:[ ] (读者请忽略本行)
以普通非区块链程序员的视角来理解,我想可以是这样:\ 首先可以认为EVM是一个永不重启的虚拟机(就假设它是一个永不重启的程序),而EVM里的智能合约可以当成是这个虚拟机里的内存对象。部署合约,可以理解成外部世界向EVM发送创建一个内存对象(合约)的指令,该内存对象遵循一定的逻辑规则,即我们编写的solidity代码。每个内存合约对象在EVM内有唯一的ID(即address),合约对象一旦创建,其内部的规则逻辑即不可篡改。\ 所以,相同的solidity代码,部署两次,就生成两个EVM内的合约对象,且两者相互独立没有任何关联,除非程序员在合约代码内实现一些有相互关联的逻辑。
调用合约就是类似于下面的语法(ContractBank表示solidity代码里的一个Contract类型):\
ContractBank(0x123abc).func123();
\
如果在方法func123()
内部对合约对象里的变量进行修改,即发生了状态改变,则永久生效,不存在“重新部署或者重启恢复”的说法,若要名义上的恢复,应该重新调用某个已经实现的方法来修改变量(达到让它恢复的效果)。\
转账是特殊的调用,使用固定的方法名transfer(...)
, 如 ContractBank(0x123abc).transfer(120000000000000000)
。\
(表示向地址为0x123abc的合约转账1.2个ETH,从当前发起调用的地址的账户中扣除1.2个ETH)
(基于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
修饰)。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!