zksyncEra上的一个开发提示
2023-4-7 11:52:27 Author: Web3安全手册(查看原文) 阅读量:4 收藏

看到撸毛大军已经到zksyncEra上去了。有个老哥说某个团队赚了921个以太,但是在 zkSync 上的资金无法正常转移,可能是由于 zkSync 协议与 Ethereum 虚拟机(EVM)不兼容导致。

以太坊智能合约中:

payable(address).call[value: <X>]("")payable(address).transfer(amount)都是以太坊智能合约中用于发送以太币的方法,但是它们之间有一些区别。
payable(address).transfer(amount) 是 Solidity 中的一个原生函数,它用于将合约余额中的ETH发送到指定地址。这个函数是在 EIP-1884 中引入的,它会将发送的ETH数量作为函数的参数传入,同时也会在函数调用过程中检查合约余额是否充足。
payable(address).call[value: <X>]("")则是 Solidity 中的一种函数调用方式,它可以在调用指定的函数时,向目标地址发送一定数量的ETH。在这种方式下,value 参数用于指定要发送的ETH数量,<X> 为具体的ETH数量。这个方法适用于调用其他合约的函数并在调用过程中发送ETH。
其次,两者的安全性不同。在使用 payable(address).transfer(amount) 函数时,如果目标地址的合约执行过程中出现了异常,那么发送的ETH就会被退回到原合约中。但是,在使用 payable(address).call[value: <X>]("") 函数时,如果目标合约执行过程中出现了异常,发送的ETH可能会被卡在目标合约中,从而无法被退回。使用send() 或transfer() 可以通过制定gas值来预防可重入。
最后,两者的适用范围也不同。payable(address).transfer(amount) 适用于发送少量ETH,例如支付交易费用或者向指定地址转移一定数量的ETH。而 payable(address).call[value: <X>]("") 则适用于向其他合约发送ETH,例如在支付或调用其他智能合约函数时。

zkSyncEra上的不同:

zkSync 是语言兼容的,而不是 EVM 等效的。为Ethereum主网编写的所有代码在zkSyncEra上的运行方式不同。zkSync 中的编译器似乎没有标记任何不兼容性,因此请在生产中使用之前测试您的代码。
zkSync上转ETH,需要用payable(address).call[value: <X>]("")
payable(address).transfer(amount)这种方式不知道为什么是不支持的。
Zksync也出了Bug修复,还是在转移ETH的时候,提醒开发者用payable(address).call[value: <X>]("")


文章来源: http://mp.weixin.qq.com/s?__biz=MzI3MjkyNTExMA==&mid=2247483838&idx=1&sn=a5fc4c79f2477a9399cd266c6c71a9e3&chksm=eb2a6967dc5de0711e48d4e5158bca88f229357d2530492475fd6784fa986a680893513314e5#rd
如有侵权请联系:admin#unsafe.sh