私有、内部、公共和外部函数之间的区别
private:私有,当前合约对象可见,继承合约不可见
internal:内部,当前合约以及继承合约可见
public:公共,内外均可见,会自动生成getter方法获值
external:外部,只对外可见,gas消耗少,减少evm上下文切换
智能合约大小大约可以有多大?
无硬性限制大小,过大可能需要多区块部署
以太坊:理想情况下小于500k,极少数情况可能允许达到几MB
Binance: 要求相对宽松,推荐不超过1MB
Solana: 由于其独特的高性能架构,可以支持更大的合约
一个典型的合约大小应该控制在24k以内:
较小合约小于16kb,可以很好地传播和执行
中等合约16-24kb,部署和执行需要更多gas
超过24k,可能会遇到gas不足或无法部署的问题
性能消耗:可根据部署gas消耗,区块gas限制,区块大小等因素调整,使用合适的数据结构来进行优化,较大的合约意味着较大成本以及网络延时
create和create2之间有什么区别?
1.地址确定性:
create部署新合约,新合约由创建者地址,创建者的nonce值以及部署合约的字节码通过一个确定性的计算得到,因为nonce在变化,所以无法预先确定新合约的地址
create2部署新合约,新合约由4个参数通过一个hash函数确定:创建者地址,盐值salt,初始化代码和部署合约的字节码
2.重新部署:
create无法保证同一份字节码连续部署两次会得到同一个地址
create2,只要4个参数相同就会得到同一个新的合约地址,在可重入地址场景非常有用
3.版本:
create指令在EVM最初版就有了,
create2实在EVM的Byzatine分支中引入的,用于增加地址确定性。对于一些复杂的智能合约应用状态分片,钻石模式等非常有用
solidity 0.8.0对算术运算有什么改变?
1.上溢和下溢不再环绕,而是直接revert
2.除数为0会revert,不再是返回0
3.引入新的位移运算编码:
`>>>` 无符号右移
`<<` 左移
`&` 按位与
`|` 按位或
`^`按位异或
`~`按位取反
以太坊主要使用什么hash函数?
1.keccak256:基于keccak256算法,输出长度为256位(32字节)的哈希值
计算交易和区块的哈希值
计算状态树的节点哈希
生成账户地址
构造合约地址
其他需要加密哈希的场合,数字签名等
设计目标是抵御各种密码学攻击,如长度扩展攻击,冲突攻击
2.rlp:编码哈希方案,用于对复杂的非规则数据结构(字符串,列表等)进行编码和解码,
rlp常用于编码区块头,交易数据等复杂数据结构的哈希值计算,保证该复杂数据结构在网络传输和存储是保持一致性和不可篡改性
3.sha256:用于挖矿过程中的工作量证明
solidity数据结构:
int 有符号整型
uint 无符号整型
bool 布尔类型默认false
address 地址类型
bytes 字节类型
mapping 映射
struct 结构体
emnu 枚举类型
array 包含定长不定长数组
静态类型语言:即在编译时可确定变量数据类型如solidity,java等
动态类型语言:在运行时确定数据类型的语言如python
什么是Gas费用,如何优化Gas消耗?
Gas 费用是执行合约操作的计算资源的度量单位,每个操作都有对应的 Gas 成本。Gas 费用直接影响合约的执行效率和用户的交易成本
优化:
减少链上存储
优化合约代码:
优化合约计算逻辑
使用更合适的数据结构

