<a href="http://blog.csdn.net/diandianxiyu_geek/article/details/77877841" target="_blank">【Solidity】1.一个Solidity源文件的布局</a>
<a href="http://blog.csdn.net/diandianxiyu_geek/article/details/77892188" target="_blank">【Solidity】2.合约的结构体</a>
<a href="http://blog.csdn.net/diandianxiyu_geek/article/details/77930835" target="_blank">【Solidity】3.类型</a>
<a href="http://blog.csdn.net/diandianxiyu_geek/article/details/77942459" target="_blank">【Solidity】4.单位和全局可变量</a>
<a href="http://blog.csdn.net/diandianxiyu_geek/article/details/77964409" target="_blank">【Solidity】5.表达式和控制结构</a>
<a href="http://blog.csdn.net/diandianxiyu_geek/article/details/77981249" target="_blank">【Solidity】6. 合约</a>
<a href="http://blog.csdn.net/diandianxiyu_geek/article/details/77989384" target="_blank">【Solidity】7. 部件</a>
<a href="http://blog.csdn.net/diandianxiyu_geek/article/details/78016231" target="_blank">【Solidity】8. 杂项</a>
一个字面上的数字可以带有wei,finney,szabo或者以太网的后缀,可以在以太网的子目录之间进行转换,其中没有后缀的以太网货币号被假定为魏。 2 ether == 2000 finney评估为true。
可以使用文字数字后的秒,分,小时,天,周和年份进行后缀转换,其中以秒为单位,以下列方式将单位视为天真的时间单位:
<code>1 == 1 seconds</code>
<code>1 minutes == 60 seconds</code>
<code>1 hours == 60 minutes</code>
<code>1 days == 24 hours</code>
<code>1 weeks == 7 days</code>
<code>1 years == 365 days</code>
如果您使用这些单位执行日历计算,请小心,因为不是每年等于365天,甚至每天都没有24小时,因为闰秒。 由于无法预测闰秒的事实,必须由外部的oracle更新精确的日历库。
这些后缀不能应用于变量。 如果你想解释某些输入变量,例如。 天,你可以通过以下方式做到:
有一些特殊的变量和函数总是存在于全局命名空间中,主要用于提供关于块链的信息。
<code>block.blockhash(uint blockNumber) returns (bytes32)</code> 给定块的哈希 - 仅适用于256个不包括当前最新块
<code>block.coinbase (address)</code> 当前块矿工地址
<code>block.difficulty (uint)</code> 当前块难度
<code>block.gaslimit (uint)</code> 当前块gaslimit
<code>block.number (uint)</code> 当前数据块号
<code>block.timestamp (uint)</code> 当前块时间戳从unix纪元开始为秒
<code>msg.data (bytes)</code> 完整的calldata
<code>msg.gas (uint)</code> 剩余gas
<code>msg.sender (address)</code> 该消息(当前呼叫)的发送者
<code>msg.sig (bytes4)</code> 呼叫数据的前四个字节(即功能标识符)
<code>msg.value (uint)</code> 发送的消息的数量
<code>now (uint)</code> 当前块时间戳(block.timestamp的别名)
<code>tx.gasprice (uint)</code> gas价格的交易
<code>tx.origin (address)</code> 交易的发送者(全调用链)
msg的所有成员的值(包括msg.sender和msg.value)可以针对每个外部函数调用进行更改。 这包括对库函数的调用。
如果要使用msg.sender在库函数中实现访问限制,则必须手动提供msg.sender的值作为参数。
<code>assert(bool condition)</code>:
如果条件不满足,则抛出 - 用于内部错误。
<code>require(bool condition)</code>:
如果条件不满足,则抛出 - 用于输入或外部组件中的错误。
<code>revert()</code>:
中止执行并恢复状态更改
<code>addmod(uint x, uint y, uint k) returns (uint)</code>
计算(x + y)%k,其中以任意精度执行加法,并且不在2 ** 256处围绕
<code>mulmod(uint x, uint y, uint k) returns (uint)</code>
计算(x * y)%k,其中乘法以任意精度执行,并且不会在2 ** 256处循环。
<code>keccak256(...) returns (bytes32)</code>
计算的(紧凑)参数的Ethereum-SHA-3(Keccak-256)的散列
<code>sha256(...) returns (bytes32)</code>
计算(紧密包装)参数的SHA-256散列
<code>sha3(...) returns (bytes32)</code>
keccak256的别名
<code>ripemd160(...) returns (bytes20)</code>
计算(紧密包装)参数的RIPEMD-160哈希值
<code>ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) returns (address)</code>
在上面,“紧密包装”意味着参数是无连接的连接。 这意味着以下内容完全相同:
如果需要填充,可以使用显式类型转换:<code>keccak256("\x00\x12")</code> 与<code>keccak256(uint16(0x12))</code>相同。
请注意,常量将使用存储它们所需的最少字节数来打包。 这意味着,例如<code>keccak256(0) == keccak256(uint8(0))</code>和<code>keccak256(0x12345678) == keccak256(uint32(0x12345678))</code>
这可能是你在一个私人的块上遇到了sha256,ripemd160或ecrecover的Out-of-Gas。 这样做的原因是那些被实现为所谓的预编译合同,这些合同在收到第一条消息之后才真正存在(尽管他们的合同代码是硬编码的)。 对非现有合约的消息更昂贵,因此执行将会进入“Out-of-Gas”错误。 这个问题的解决方法是首先发送例如 在您将实际合同中使用这些合约之前,每个合约1 Wei。 官网或测试网不是问题。
<code><address>.balance (uint256)</code>
<code><address>.transfer(uint256 amount)</code>
发送一定量wei向地址,抛出失败
<code><address>.send(uint256 amount) returns (bool)</code>
发送一定量wei向地址,失败时返回false
<code><address>.call(...) returns (bool)</code>
发出低级CALL,失败返回false
<code><address>.callcode(...) returns (bool)</code>
发出低级CALLCODE,失败时返回false
<code><address>.delegatecall(...) returns (bool)</code>
发出低级DELEGATECALL,失败返回false
使用send有一些危险:如果调用堆栈深度为1024(这可以始终被呼叫者强制),则传输失败,如果接收方耗尽gas,则传输失败。 所以为了使安全的以太网传输,始终检查发送的返回值,使用转移甚至更好:使用接收方提取钱的模式。
不鼓励使用callcode,将来会被删除。
<code>this</code>
当前合约,明确转换为地址
<code>selfdestruct(address recipient)</code>
摧毁目前的合同,将资金送到给定的地址
<code>suicide(address recipient)</code>
selfdestruct的别名
此外,当前合约的所有功能都可以直接调用,包括当前的功能。