核心考点概览
智能合约部分的赛题聚焦于Solidity开发能力、合约设计逻辑及系统集成测试,主要涵盖以下核心技能:
- Solidity语法与结构设计
- 安全编码与漏洞防范
- 合约功能实现与业务逻辑映射
- 测试工具使用与调试能力
- 区块链系统集成与权限管理
一、基础语法与合约结构
1.版本声明与编译指示
填空题常要求补全版本声明,例如:
pragma solidity 0.6.10; // 需严格匹配版本,避免语法不兼容
pragma experimental ABIEncoderV2; // 物流合约需启用ABI编码扩展
需注意版本兼容性,如
^
符号表示兼容该版本及以上以及区间合约版本的写法
2.函数修饰符与可见性
补全public
/private
/internal
/external
关键字,例如:
function get() public view returns (uint256) {
}
涉及权限控制的题目可能要求补全
onlyOwner
修饰符,需结合modifier
定义
3.数据类型与存储位置
区分storage
、memory
、calldata
的使用场景,例如:
function process(uint[] memory data) public {
}
考察动态数组或映射的声明,如
mapping(address => uint) balances;
4.函数实现方面
function newMaterial(
string memory _name,
string memory _id,
string memory _memo
) public returns (address) {
require(!materials[_id].exist, "Material already exists"); // 唯一性检查
materials[_id] = Material(msg.sender, _name, _id, _memo, block.timestamp, true);
return address(this);
}
二、安全实践与漏洞防范
1.输入验证与错误处理
补全require
、assert
、revert
语句,例如:
require(msg.value > 0, "Value must be positive");
防范重入攻击时需补全
检查-效果-交互
模式代码
三、例题
填空题示例1
function withdraw(uint amount) public {
require(balances[msg.sender] >= amount, "Insufficient balance");
balances[msg.sender] -= amount;
payable(msg.sender).______; // 补全转账语句
}
填空题示例2
modifier onlyOwner() {
______; // 补全权限检查
_;
}
1.答案:
transfer(amount)
(注意优先使用call
+重入防护)2.答案:
require(msg.sender == owner, "Not owner")
总体建议
- 强化Solidity基础:重点掌握0.6.x版本语法、数据结构及安全实践。
- 模拟业务场景:针对溯源需求设计合约字段(如时间戳、地理位置)。
- 工具链熟练度:掌握WeBASE-Front调试、JAVA-SDK集成与测试框架。
- 安全与性能平衡:在功能实现中兼顾Gas优化与漏洞防范(如重入攻击防护)
- 漏洞合约:熟悉常见合约漏洞