关闭

【Solidity】4.单位和全局可变量 - 深入理解Solidity

标签: eth智能合约区块链技术
2125人阅读 评论(0) 收藏 举报
分类:

索引

单位和全局可变量

Ether单元

一个字面上的数字可以带有wei,finney,szabo或者以太网的后缀,可以在以太网的子目录之间进行转换,其中没有后缀的以太网货币号被假定为魏。 2 ether == 2000 finney评估为true。

时间单位

可以使用文字数字后的秒,分,小时,天,周和年份进行后缀转换,其中以秒为单位,以下列方式将单位视为天真的时间单位:

  • 1 == 1 seconds
  • 1 minutes == 60 seconds
  • 1 hours == 60 minutes
  • 1 days == 24 hours
  • 1 weeks == 7 days
  • 1 years == 365 days

如果您使用这些单位执行日历计算,请小心,因为不是每年等于365天,甚至每天都没有24小时,因为闰秒。 由于无法预测闰秒的事实,必须由外部的oracle更新精确的日历库。

这些后缀不能应用于变量。 如果你想解释某些输入变量,例如。 天,你可以通过以下方式做到:

function f(uint start, uint daysAfter) {
    if (now >= start + daysAfter * 1 days) {
      // ...
    }
}

特殊变量和函数

有一些特殊的变量和函数总是存在于全局命名空间中,主要用于提供关于块链的信息。

块和事务属性

  • block.blockhash(uint blockNumber) returns (bytes32) 给定块的哈希 - 仅适用于256个不包括当前最新块
  • block.coinbase (address) 当前块矿工地址
  • block.difficulty (uint) 当前块难度
  • block.gaslimit (uint) 当前块gaslimit
  • block.number (uint) 当前数据块号
  • block.timestamp (uint) 当前块时间戳从unix纪元开始为秒
  • msg.data (bytes) 完整的calldata
  • msg.gas (uint) 剩余gas
  • msg.sender (address) 该消息(当前呼叫)的发送者
  • msg.sig (bytes4) 呼叫数据的前四个字节(即功能标识符)
  • msg.value (uint) 发送的消息的数量
  • now (uint) 当前块时间戳(block.timestamp的别名)
  • tx.gasprice (uint) gas价格的交易
  • tx.origin (address) 交易的发送者(全调用链)

msg的所有成员的值(包括msg.sender和msg.value)可以针对每个外部函数调用进行更改。 这包括对库函数的调用。

如果要使用msg.sender在库函数中实现访问限制,则必须手动提供msg.sender的值作为参数。

错误处理

assert(bool condition):
如果条件不满足,则抛出 - 用于内部错误。
require(bool condition):
如果条件不满足,则抛出 - 用于输入或外部组件中的错误。
revert():
中止执行并恢复状态更改

数学和加密功能

addmod(uint x, uint y, uint k) returns (uint)
计算(x + y)%k,其中以任意精度执行加法,并且不在2 ** 256处围绕

mulmod(uint x, uint y, uint k) returns (uint)
计算(x * y)%k,其中乘法以任意精度执行,并且不会在2 ** 256处循环。

keccak256(...) returns (bytes32)
计算的(紧凑)参数的Ethereum-SHA-3(Keccak-256)的散列

sha256(...) returns (bytes32)
计算(紧密包装)参数的SHA-256散列

sha3(...) returns (bytes32)
keccak256的别名

ripemd160(...) returns (bytes20)
计算(紧密包装)参数的RIPEMD-160哈希值

ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) returns (address)
从椭圆曲线签名中恢复与公钥相关的地址,或者在错误时返回零(示例使用

在上面,“紧密包装”意味着参数是无连接的连接。 这意味着以下内容完全相同:

keccak256("ab", "c")
keccak256("abc")
keccak256(0x616263)
keccak256(6382179)
keccak256(97, 98, 99)

如果需要填充,可以使用显式类型转换:keccak256("\x00\x12")keccak256(uint16(0x12))相同。

请注意,常量将使用存储它们所需的最少字节数来打包。 这意味着,例如keccak256(0) == keccak256(uint8(0))keccak256(0x12345678) == keccak256(uint32(0x12345678))

这可能是你在一个私人的块上遇到了sha256,ripemd160或ecrecover的Out-of-Gas。 这样做的原因是那些被实现为所谓的预编译合同,这些合同在收到第一条消息之后才真正存在(尽管他们的合同代码是硬编码的)。 对非现有合约的消息更昂贵,因此执行将会进入“Out-of-Gas”错误。 这个问题的解决方法是首先发送例如 在您将实际合同中使用这些合约之前,每个合约1 Wei。 官网或测试网不是问题。

地址相关

<address>.balance (uint256)
平衡地址在Wei

<address>.transfer(uint256 amount)
发送一定量wei向地址,抛出失败

<address>.send(uint256 amount) returns (bool)
发送一定量wei向地址,失败时返回false

<address>.call(...) returns (bool)
发出低级CALL,失败返回false

<address>.callcode(...) returns (bool)
发出低级CALLCODE,失败时返回false

<address>.delegatecall(...) returns (bool)
发出低级DELEGATECALL,失败返回false

有关详细信息,请参阅地址部分。

使用send有一些危险:如果调用堆栈深度为1024(这可以始终被呼叫者强制),则传输失败,如果接收方耗尽gas,则传输失败。 所以为了使安全的以太网传输,始终检查发送的返回值,使用转移甚至更好:使用接收方提取钱的模式。

不鼓励使用callcode,将来会被删除。

合约相关

this
当前合约,明确转换为地址

selfdestruct(address recipient)
摧毁目前的合同,将资金送到给定的地址

suicide(address recipient)
selfdestruct的别名

此外,当前合约的所有功能都可以直接调用,包括当前的功能。

0
0
查看评论

区块链基础:散列法(Hashing)

原文:https://medium.com/@ConsenSys/blockchain-underpinnings-hashing-7f4746cbd66b#.94m1n6n3b 作者:Joseph Chow(ConsenSys). 图片:Bogdan Burcea 翻译:洒脱喜 稿源(译)...
  • lucky_greenegg
  • lucky_greenegg
  • 2016-07-14 16:40
  • 3133

【Solidity】6. 合约 - 深入理解Solidity

合约Solidity的合约类似于面向对象语言的类。 它们包含可以修改这些变量的状态变量和函数中的持久性数据。 在不同的合同(实例)上调用函数将执行EVM函数调用,从而切换上下文以使状态变量无法访问。创建合约合同可以从“外部”或“固定”合同中创建。 当创建合同时,其构造函数(与合同名称相同的函数)将被...
  • diandianxiyu
  • diandianxiyu
  • 2017-09-14 15:42
  • 2449

【Solidity】7. 部件 - 深入理解Solidity

Solidity 部件Solidity定义了一种也可以在没有Solidity的情况下使用的汇编语言。 此汇编语言也可以用作Solidity源代码中的“内联汇编”。 我们从描述如何使用内联汇编以及它与独立程序集的区别开始,然后指定程序集本身。TODO:编写内联汇编的范围规则有点不一样,例如使用库的内部...
  • diandianxiyu
  • diandianxiyu
  • 2017-09-15 11:03
  • 4235

区块链-智能合约简单脚本编写方法(solidity)

“一个智能合约是一套以数字形式定义的承诺(promises) ,包括合约参与方可以在上面执行这些承诺的协议。”协议是技术实现(technical implementation),在这个基础上,合约承诺被实现,或者合约承诺实现被记录下来。选择哪个协议取决于许多因素,最重要的因素是在合约履行期...
  • jeason29
  • jeason29
  • 2016-06-03 13:53
  • 3938

【Solidity】5.表达式和控制结构 - 深入理解Solidity

表达式和控制结构输入参数和输出参数与Javascript一样,函数可以将参数作为输入; 与Javascript和C不同,它们也可以返回任意数量的参数作为输出。输入参数输入参数的声明方式与变量相同。 作为例外,未使用的参数可以省略变量名称。 例如,假设我们希望我们的合约接受一种具有两个整数的外部调用,...
  • diandianxiyu
  • diandianxiyu
  • 2017-09-13 12:54
  • 2082

区块链-智能合约简单脚本编写方法(solidity)

“一个智能合约是一套以数字形式定义的承诺(promises) ,包括合约参与方可以在上面执行这些承诺的协议。”协议是技术实现(technical implementation),在这个基础上,合约承诺被实现,或者合约承诺实现被记录下来。选择哪个协议取决于许多因素,最重要的因素是在合约履行期...
  • AAA123524457
  • AAA123524457
  • 2016-10-17 10:28
  • 1461

[以太坊源代码分析]III. 挖矿和共识算法的奥秘

作为本系列的第三篇,这篇文章介绍了以太坊中如何"挖矿"产生一个新区块的完整过程,以及Ethash(PoW)和Clique(PoA)两种不同共识算法的实现方案;同时对于各处代码实现中的精巧设计,也作了较详细的讲解。
  • teaspring
  • teaspring
  • 2017-09-21 11:46
  • 1956

以太坊智能合约编程之菜鸟教程

手把手带你走上智能合约编程之路 译注:原文首发于ConsenSys开发者博客,原作者为Eva以及ConsenSys的开发团队。如果您想要获取更多及时信息,可以访问ConsenSys首页点击左下角Newsletter订阅邮件。本文的翻译获得了ConsenSys创始人Lubin先生的授权。 有些人说以太...
  • fidelhl
  • fidelhl
  • 2016-01-08 11:55
  • 33265

【Solidity】注意事项

安全注意事项虽然通常很容易构建按预期工作的软件,但是更难检查没有人可以以预期的方式使用它。在Solidity中,这更重要,因为您可以使用智能合同来处理令牌,或者甚至更有价值的东西。 此外,每次执行智能合同都会在公共场合发生,除此之外,源代码通常是可用的。当然,你总是必须考虑到多少问题:您可以将智能合...
  • diandianxiyu
  • diandianxiyu
  • 2017-09-19 09:44
  • 2113

solidity官方文档中文版

  • 2018-01-11 12:45
  • 1.60MB
  • 下载
    个人资料
    • 访问:648891次
    • 积分:9113
    • 等级:
    • 排名:第2456名
    • 原创:298篇
    • 转载:13篇
    • 译文:4篇
    • 评论:82条
    博客专栏
    微信订阅号
    欢迎加入QQ群
    玩家老黄历(微信小程序)
    谢谢支持~
    最新评论