智能合约语言Solidity Solidity API
链客,专为开发者而生,有问必答!
此文章来自区块链技术社区,未经允许拒绝转载。
智能合约语言Solidity Solidity API
Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊、智能合约有所了解,如果你还不了解,建议你先看以太坊是什么?
Solidity API 主要表现为Solidity 内置的特殊的变量及函数,他们存在于全局命名空间里,主要分为以下几类:
有关区块和交易的属性
ABI编码函数
有关错误处理
有关数学及加密功能
地址相关
合约相关
下面详细讲解下
区块和交易的属性(Block And Transaction Properties)
用来提供一些区块链当前的信息。
blockhash(uint blockNumber) returns (bytes32):返回给定区块号的哈希值,只支持最近256个区块,且不包含当前区块。
block.coinbase (address): 当前块矿工的地址。
block.difficulty (uint):当前块的难度。
block.gaslimit (uint):当前块的gaslimit。
block.number (uint):当前区块的块号。
block.timestamp (uint): 当前块的Unix时间戳(从1970/1/1 00:00:00 UTC开始所经过的秒数)
gasleft() (uint256): 获取剩余gas。
msg.data (bytes): 完整的调用数据(calldata)。
msg.gas (uint): 当前还剩的gas(弃用)。
msg.sender (address): 当前调用发起人的地址。
msg.sig (bytes4):调用数据(calldata)的前四个字节(例如为:函数标识符)。
msg.value (uint): 这个消息所附带的以太币,单位为wei。
now (uint): 当前块的时间戳(block.timestamp的别名)
tx.gasprice (uint) : 交易的gas价格。
tx.origin (address): 交易的发送者(全调用链)
注意:msg的所有成员值,如msg.sender,msg.value的值可以因为每一次外部函数调用,或库函数调用发生变化(因为msg就是和调用相关的全局变量)。
不应该依据block.timestamp, now 和 block.blockhash来产生一个随机数(除非你确实需要这样做),这几个值在一定程度上被矿工影响(比如在赌博合约里,不诚实的矿工可能会重试去选择一个对自己有利的hash)。
对于同一个链上连续的区块来说,当前区块的时间戳(timestamp)总是会大于上一个区块的时间戳。
为了可扩展性的原因,你只能查最近256个块,所有其它的将返回0.
ABI编码函数
Solidity 提供了一下函数,用来直接得到ABI编码信息,这些函数有:
abi.encode(…) returns (bytes):计算参数的ABI编码。
abi.encodePacked(…) returns (bytes):计算参数的紧密打包编码
abi. encodeWithSelector(bytes4 selector, …) returns (bytes): 计算函数选择器和参数的ABI编码
abi.encodeWithSignature(string signature, …) returns (bytes): 等价于* abi.encodeWithSelector(bytes4(keccak256(signature), …)
通过ABI编码函数可以在不用调用函数的情况下,获得ABI编码值,下面通过一段代码来看看这些方式的使用:
pragma solidity ^0.4.24;contract testABI { function abiEncode() public constant returns (bytes) { abi.encode(1); // 计算 1 的ABI编码 return abi.encodeWithSignature(“set(uint256)”, 1); //计算函数set(uint256) 及参数1 的ABI 编码 }}
错误处理
assert(bool condition)用于判断内部错误,条件不满足时抛出异常
require(bool condition):用于判断输入或外部组件错误,条件不满足时抛出异常
require(bool condition, string message)同上,多了一个错误信息。
revert():终止执行并还原改变的状态
revert(string reason)同上,提供一个错误信息。
之前老的错误处理方式用throw 及 if … throw,这种方式会消耗掉所有剩余的gas。目前throw 的方式已经被弃用。
数学及加密功能
addmod(uint x, uint y, uint k) returns (uint):计算(x + y) % k,加法支持任意的精度且不会在2**256处溢出,从0.5.0版本开始断言k != 0。
mulmod(uint x, uint y, uint k) returns (uint):计算(x y) % k, 乘法支持任意的精度且不会在2*256处溢出, 从0.5.0版本开始断言k != 0。
keccak256(…) returns (bytes32):使用以太坊的(Keccak-256)计算HASH值。紧密打包参数。
sha256(…) returns (bytes32):使用SHA-256计算hash值,紧密打包参数。
sha3(…) returns (bytes32):keccak256的别名
ripemd160(…) returns (bytes20):使用RIPEMD-160计算HASH值。紧密打包参数。
ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) returns (address):通过椭圆曲线签名来恢复与公钥关联的地址,或者在错误时返回零。可用于签名数据的校验,如果返回结果是签名者的公匙地址,那么说明数据是正确的。
ecrecover函数需要四个参数,需要被签名数据的哈希结果值,r,s,v分别来自签名结果串。r = signature[0:64]s = signature[64:128]v = signature[128:130]其中v取出来的值或者是00或01。要使用时,我们先要将其转为整型,再加上27,所以我们将得到27或28。在调用函数时v将填入27或28。
用javascript表达如下:
var msg = '0x8CbaC5e4d803bE2A3A5cd3DbE7174504c6DD0c1C’var hash = web3.sha3(msg)var sig = web3.eth.sign(address, h).slice(2)var r = 0x${sig.slice(0, 64)}
var s = 0x${sig.slice(64, 128)}
var v = web3.toDecimal(sig.slice(128, 130)) + 27
紧密打包参数(tightly packed)意思是说参数不会补位,是直接连接在一起的,下面几个是相等的。
keccak256(“ab”, “c”)keccak256(“abc”)keccak256(0x616263) // hexkeccak256(6382179)keccak256(97, 98, 99) //ascii
如果需要填充,可以使用显式类型转换:keccak256(“\x00\x12”) 与keccak256(uint16(0x12))相同。
注意,常量将使用存储它们所需的最少字节数来打包,例如keccak256(0) == keccak256(uint8(0))和keccak256(0x12345678) == keccak256(uint32(0x12345678))
在私链(private blockchain)上运行sha256,ripemd160或ecrecover可能会出现Out-Of-Gas报错。因为私链实现了一种预编译合约,合约要在收到第一个消息后才会真正存在(虽然他们的合约代码是硬编码的)。而向一个不存在的合约发送消息,所以才会导致Out-Of-Gas的问题。一种解决办法(workaround)是每个在你真正使用它们之前先发送1 wei到这些合约上来完成初始化。在官方和测试链上没有这个问题。
地址相关
.balance (uint256):Address的余额,以wei为单位。
.transfer(uint256 amount):发送给定数量的ether到某个地址,以wei为单位。失败时抛出异常。
.send(uint256 amount) returns (bool):发送给定数量的ether到某个地址,以wei为单位, 失败时返回false。
.call(…) returns (bool):发起底层的call调用。失败时返回false。
.callcode(…) returns (bool):发起底层的callcode调用,失败时返回false。不鼓励使用,未来可能会移除。
.delegatecall(…) returns (bool):发起底层的delegatecall调用,失败时返回false
更多信息参考地址篇。
警告:send() 执行有一些风险:如果调用栈的深度超过1024或gas耗光,交易都会失败。因此,为了保证安全,必须检查send的返回值,如果交易失败,会回退以太币。如果用transfer会更好。
合约相关
this(当前合约的类型):表示当前合约,可以显式的转换为Address
selfdestruct(address recipient):销毁当前合约,并把它所有资金发送到给定的地址。
suicide(address recipient):selfdestruct的别名
另外,当前合约里的所有函数均可支持调用,包括当前函数本身。
相关文章:

PHP PSR-4 Autoloader 自动加载(中文版)
引用:https://segmentfault.com/a/1190000002521658 Autoloader 关键词 “必须”("MUST")、“一定不可/一定不能”("MUST NOT")、“需要”("REQUIRED")、“将会”("SHALL")、“不会”("SHALL NOT")、“应该”(&q…

236. Lowest Common Ancestor of a Binary Tree
原题链接:https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/description/ 代码实现如下: import java.util.LinkedList; import java.util.Queue; import java.util.Stack;/*** Created by clearbug on 2018/2/26.*/ public clas…

python中append的用法_Python 列表 append() 使用方法及示例
Python 列表 append() 使用方法及示例 append()方法将一个项目添加到列表的末尾。 append()方法将单个项目添加到列表的末尾。 append()方法的语法为:list.append(item) append()参数 该方法有一个参数item -要添加到列表末尾的项目 该项目可以是数字,字…

Web3与智能合约交互实战
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 Web3与智能合约交互实战 以太坊中智能合约和web3交互实战 最近区块链、以太坊十分的火,所有就会有许多人去进入区块链这个工作&#x…

BZOJ 4595 SHOI2015 激光发生器 射线,线段,偏转
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id4595 题意概述: 给出一条射线和N条线段,射线遇到线段会发生反射,令入射角alpha,出射角beta,则betaalpha*phi_i(即对于每条线段phi是…

实现一个 能在O(1)时间复杂度 完成 Push、Pop、Min操作的 栈
一,问题描述 实现一个栈(元素遵守先入后出顺序),能够通过 min 方法在 O(1)时间内获取栈中的最小元素。同时,栈的基本操作:入栈(Push)、出栈(Pop),也是在O(1)时间内完成的。 二,问题分…

华为js面试题_四面腾讯与华为,大厂前端面试真BT!
今年算是经历颇多的一年了,腾讯和华为都走了几趟(一共面试了四个部门),拿了两个offer。(开心.png),但还是挂了两次,有点遗憾。面试题总结面试完之后,赶紧总结了一波&…

你和区块链的距离就差这篇文章!
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 近年来,“区块链”逐渐成为热门话题,2018年各种关于区块链的行业资讯、投融资创业、技术和应用探索等集中爆发,…

Browser Security-超文本标记语言(HTML)
重要的4个规则: 1 &符号不应该出现在HTML的大部分节点中。 2 尖括号<>是不应该出现在标签内的,除非为引号引用。 3 在text节点里面,<左尖括号有很大的危害。 4 引号在标签内可能有危害,具体危害取决于存在的位置&…

NestedScrolling CoordinatorLayout
Android NestedScrolling机制完全解析 带你玩转嵌套滑动 一步一步深入理解CoordinatorLayout 源码看CoordinatorLayout.Behavior原理 转载于:https://www.cnblogs.com/cornellbox/p/8649891.html

python下载电脑版本不对_初学Python,因为某些原因电脑只能装3.1版本,现遇到这个小问题求解答...
#!/usr/bin/env python # -*- coding: utf-8 -*-任务: 假设用户输入的英文名字不规范,没有按照首字母大写,后续字母小写的规则, 请利用map()函数,把一个list(包含若干不规范的英文名字)变成一个包含规范英文…

以太坊是什么?
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 以太坊是一个全新开放的区块链平台,它允许任何人在平台中建立和使用通过区块链技术运行的去中心化应用。就像比特币一样,以…

前端相关html和css
#请参考http://www.cnblogs.com/pycode/p/5792142.html #html css 和js说明 ##1.什么是html? HTML(HyperText MarkUp Language)超文本标记语言,通过使用标记来描述文档结构和表现形式的一种语言,由浏览器进行解析,然后把结果显示在网页上,通俗的讲它就是…

编写五子棋的完整python代码_python制作简单五子棋游戏
本文实例为大家分享了python五子棋游戏的具体代码,供大家参考,具体内容如下 #五子棋 ‘” 矩阵做棋盘 16*16 “” 打印棋盘 for for 游戏是否结束 开始下棋 while 游戏是否结束: 黑白交替 player0 p%20 1 p1 下棋动作一样 但是棋子不一样 ‘”…

新建JRapid项目(idea创建maven多模块项目)
1、第一步,新建项目(Create New Project) 2、parent项目,不勾选“Crate from archetype”,直接单击“Next”。 3、groupid填写com.codingwhy,ArtifactId填写JRapid。 4、Project name 填写 JRapidÿ…

这个美国议员候选人想发币,联邦选举委员会还答应了
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 佛罗里达州的一名国会候选人想给竞选志愿者发放基于以太坊的代币,以激励他们的工作,这是一项实验性的举措,而联邦…

day8 函数
写代码先画流程图 复习: 什么是文件? 文件操作 read() with open()as f: 取代close() 文件的打开模式 t:text文本模式 只能操作文本 b:bytes字节模式 视频音频图片,也…

SQL Server中的分页查询
分页查询很简单,具体代码如下: --分页查询--查询1-3行数据 select top 3 * from emp order by sal desc;--查询4-6行数据 select top 3 *from empwhere empno not in (select top 3 empno from emp order by sal desc)order by sal desc;--查询7-9行数据…

python数据库建表_mysql数据表如何创建
在 MySQL 中,可以使用 CREATE TABLE 语句创建表。其语法格式为:CREATE TABLE <表名> ([表定义选项])[表选项][分区选项]; 其中,[表定义选项]的格式为:<列名1> <类型1> [,…] <列名n> <类型n> CREAT…

行情分析:下杀或不可持续,市场大概率继续震荡
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 美联储主席杰罗姆鲍威尔周三在众议院金融服务委员会的听证会上表示,在Facebook详细说明如何处理一系列监管问题之前,不应允许…

水平,垂直居中的15种方法
一.水平居中 1.文字水平居中 <div class"one">测试居中</div><style>.one{width: 200px;height: 100px;border:1px solid red;text-align: center;}</style>2.盒子居中 <div class"one">是盒子居中</div><style>…

Hadoop葵花宝典(一)
1. 描述如何安装配置Hadoop 参考:http://www.cnblogs.com/xia520pi/archive/2012/04/08/2437875.html 安装Linux(虚拟机上)—CentOS:创建用户,关闭防火墙,PS:不关防火墙无法访问Web管理页面,删除和增加节点…

stata命令汇总_第九届高级计量经济学及stata应用研讨会在京顺利举办
二零一九,寒假佳时,近30余所高校的师生齐聚北京,参加了计量经济学服务中心举办的第九届“高级计量经济学及Stata应用”现场研讨班。本届研讨班于2019年1月19日-1月22日在北京国际温泉酒店顺利举办,现场学员既有博士、硕士…

下轮牛市高峰可能在2020年,以太坊是关键
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 “用自己一颗宁静的内心去感受市场真正的趋势,一旦发现趋势便全力跟随之。—刘强《期货大作手风云录》” 文章导读: 驱动这…

jQuery中的事件机制深入浅出
昨天呢,我们大家一起分享了jQuery中的样式选择器,那么今天我们就来看一下jQuery中的事件机制,其实,jQuery中的事件机制与JavaScript中的事件机制区别是不大的,只是,JavaScript中调用是原生的函数方法,而jQuery中调用的绑定的是jQuery中的对象方法,那么在昨天的第一篇中,我们已经…

滑动加载商品列表
商品列表htmL 所绑定的js事件 后台代码 $(function () { //滚动加载 var stop true; var start 2; // $.ajaxSetup({async:false}); function getData(url){ // console.log(url); $.ajax({ type:"get",//跨域访问时只能用get url:url,//要访问的api地址 dataType:…

mac 怎么查找大于200m的文件_U盘无法拷贝大于4GB的文件怎么办?
相信在经常使用U盘的用户手中,都会或多或少的存有几个U盘,有时候如果我们需要重装系统的时候,就会发现下载的系统居然无法拷贝到U盘当中,这究竟是怎么回事呢?U盘主要有三种格式:FAT32:缺点&…

以太坊今日大涨7.5%,芝商所备战“以太坊期货”
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 据The Block报道,芝加哥商品交易所(CME)预计将于7月15日改变以太坊相关的参考利率和指数,消息人士称…

python package_Python之package、module
一、模块: 1.简单的描述:一个.py文件 2.好处:大大提高代码的可维护性 3.模块三种:1.python标准库 2.第三方模块 3.应用程序自定义模块(*****) 4.import实质就是:1.执行对应文件 2.引入变量名 在…

C# Timer使用方法示例
实例化一个timer: // 每5分钟执行一次,每次执行的间隔毫秒时长 System.Timers.Timer timer new System.Timers.Timer(5*60*1000);为timer设置事件和任务循环回调方法: //到达时间的时候执行事件timer.Elapsed new System.Timers.ElapsedEventHandler(T…