1. 没有声明 storage 为什么 bool public publicValue; address public addressValue; function setPublicValue(bool _value) external{ publicValue = _value; require(_value); } 能编译通过
  • 值类型(如 bool、address、uint 等)‌在函数参数和局部变量中‌直接传递值‌,无需指定 storage 或 memory
  • 引用类型(数组、结构体、映射)‌:必须显式声明 storage、memory 或 calldata,否则编译失败。
  1. view 的作用
    • 通过 view 修饰的函数在外部调用(如通过合约接口)时‌不消耗 Gas‌,因为无需矿工验证状态变更‌。 但在合约内部调用(如其他函数中调用)时,仍可能产生 Gas 消耗‌
    • view 允许读取状态变量,而 pure 函数‌既不能读取也不能修改状态变量‌,仅依赖输入参数进行纯计算‌。
  2. indexed 的作用
    • 支持快速检索,方便在浏览器或工具查看
    • 语法限制每个事件最多有 3 个 indexed 参数
    • 仅存储 32 字节的哈希值,若参数数据超过 32 字节(如长字符串),需结合链下数据库存储完整信息‌
  3. 事件
    • 只支持记录,相比成员变量节省Gas
  4. 多继承
    • a -> b, a -> c , b+c ->d super函数a 只会执行一次
  5. 访问关键字
    • 合约的关系
    • 有继承 - 无继承 - private 内部,internal 有继承 public 无继承, external 外部访问
  6. 调用不存在的函数
    • call 函数,调用的函数签名错误, 会执行fallback函数
  7. 发送以太
    • 接收方可以是普通地址,也可以是合约地址
    • 普通 address 类型无法直接转账 ETH,需通过 payable(address) 强制转换为可支付地址‌
    • 需要在部署时,给发送的合约 以太币
  8. send 为什么消耗所有gas,还跟当前网络有关
    • 不会消耗所有gas,可有手动选择gas的消耗值
  9. 合约接受到以太,是不是存在合约仓库里,合约所有人手里
    • 可以手动设置owner,构造函数中owner = msg.sender; 是用户的原始地址
    • 在contract a中调用send,在receive中收到的是msg.sender contract a的地址
  10. Contract的value 有什么特殊意义
    • 在 Remix 部署或调用合约时,通过设置 value 字段可向合约地址发送指定数量的 ETH,该值直接影响合约的 address(this).balance(即合约持有的 ETH 余额)
    • 测试环境value值不受限制,连接主网需要关联钱包
  11. 签名和验签
    • 信息- hash - 使用地址进行签名
    • 得到 信息和签名,信息 - hash + 签名 - recover - 对比地址是否正确
  12. 什么时候使用storage
    • 当函数中的变量 非 合约的成员变量,即入参或者从合约的成员变量抽出来的item,需要修改后同步的,要声明storage
    • 合约的成员变量直接使用,不需要声明也没有地方声明
  13. pure 和view
    • Gas 消耗规则 ‌ 本地调用‌ 当通过本地节点(如调用本地 RPC)直接查询合约的 view 或 pure 函数时,‌不产生 Gas 消耗‌,因为这些函数仅读取链上数据且不修改状态‌1。

‌ 交易中的调用‌ 若通过交易(Transaction)调用 view/pure 函数(例如在另一个合约中调用),由于交易需写入区块,‌可能产生 Gas 消耗‌‌

  1. 比特币会不会从POW转为POE 不会,因为权益组织抵制和基础建设改造
  2. 51%攻击是什么意思
    • 获取51%算力或者权益来获取交易主导权
    • 可以阻止交易,双花攻击,交易篡改
  3. 以太坊的基础建设
  4. 硬分叉
  5. ICO众筹
  6. Blob 交易