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