Solidity学习-知识整理
智能合约的创建和运行
- 智能合约的代码写完后,要编译成bytecode,是一个图灵完备的编程模型
- 创建合约:外部账户发起一个转账交易到0x0的地址
- 转账的金额是0,但是要支付gas费
- 合约的代码放在data域里
- 智能合约运行在EVM上
- EVM有256位寻址空间
- 以太坊是一个交易驱动的状态机
- 调用智能合约的交易发布到区块链上后,每个矿工都会执行这个交易,从当前状态确定性地转移到下一个状态
什么是Gas?
错误处理
- 智能合约中不存在自定义的try-catch结构
- 一旦遇到异常,除特殊情况外,本次执行操作全部回滚
- 可以抛出错误的语句:
- assert(bool condition): 如果条件不满足就抛出一个用于内部错误
- require(bool condition): 如果要条件不满足就抛出一个用于输入或者外部组件引起的错误。
function bit() public payable { //对于能接收以太币的函数,keyword: payable是必要的 //for example:判断拍卖活动是否已结束 require(now <= auctionEnd); }
- revert(): 终止运行并回滚状态变动
- 详细解释:
智能合约可以获得的区块信息
block.blockhash(uint blockNumber) returns (bytes32)
:指定区块的区块哈希——仅可用于最新的 256 个区块且不包括当前区块;而 blocks 从 0.4.22 版本开始已经不推荐使用,由blockhash(uint blockNumber)
代替block.coinbase
(address
): 挖出当前区块的矿工地址block.difficulty
(uint
): 当前区块难度block.gaslimit
(uint
): 当前区块 gas 限额block.number
(uint
): 当前区块号block.timestamp
(uint
): 自 unix epoch 起始当前区块以秒计的时间戳
智能合约可以获得的调用信息
gasleft() returns (uint256)
:剩余的 gasmsg.data
(bytes
): 完整的 calldatamsg.gas
(uint
): 剩余 gas - 自 0.4.21 版本开始已经不推荐使用,由gesleft()
代替msg.sender
(address
): 消息发送者(当前调用)msg.sig
(bytes4
): calldata 的前 4 字节(也就是函数标识符)msg.value
(uint
): 随消息发送的 wei 的数量now
(uint
): 目前区块时间戳(block.timestamp
)tx.gasprice
(uint
): 交易的 gas 价格tx.origin
(address
): 交易发起者(完全的调用链)
详情查看
重入攻击分析
Solidity好的编程方式 安全考量
- 先要判断条件,如使用require
- 然后改变条件
- 最后再跟别的合约发生交互
很不错的Solidity学习网站