Solidity初学
先了解一些以太坊中的术语
交易
区块链是全球共享的交易数据库。这意味着每个人都可以通过参与网络来读取数据库中的条目。如果要更改数据库中的某些内容,则必须创建一个必须被所有其他事务接受的所谓事务。事务一词表示您要进行的更改(假设您要同时更改两个值)要么根本没有完成,要么已完全应用。此外,在将事务应用于数据库时,没有其他事务可以更改它。
例如,假设有一个表以电子货币列出所有帐户的余额。如果请求从一个帐户转帐到另一个帐户,则数据库的交易性质可确保如果从一个帐户中减去该金额,则始终将其添加到另一个帐户中。如果由于某种原因无法将金额添加到目标帐户,则也不会修改源帐户。
此外,交易始终由发送方(创建者)进行加密签名。这使得保护访问数据库的特定修改变得很简单。在电子货币的示例中,简单的检查可确保只有持有该帐户密钥的人才能从该帐户中转移资金。
块
要克服的一个主要障碍是(用比特币术语)所谓的“双花攻击”:如果网络中存在两个都想清空一个账户的交易,会发生什么?只有一笔交易有效,通常是最先接受的一笔。问题在于,“第一”不是对等网络中的客观术语。
对此的抽象答案是您不必关心。将为您选择一个全球公认的交易顺序,以解决冲突。事务将被捆绑到一个所谓的“块”中,然后将它们执行并分布在所有参与节点之间。如果两笔交易相互矛盾,那么最后一笔交易将被拒绝,并且不会成为交易的一部分。
这些块在时间上形成线性序列,这就是“块链”一词的来源。区块以相当固定的间隔添加到链中-对于以太坊来说,这大约是每17秒一次。
作为“订单选择机制”(称为“挖矿”)的一部分,可能会不时地还原块,但只能在链的“尖端”进行。在特定块的顶部添加的块越多,还原该块的可能性就越小。因此可能是您的交易已还原甚至从区块链中删除,但是等待时间越长,发生的可能性就越小。
注意
不能保证将事务包含在下一个块或任何特定的将来的块中,因为这不是由事务的提交者决定的,而是由矿工确定将事务包括在哪个块中的。
如果要安排合同的未来调用,可以使用闹钟或类似的oracle服务。
以太坊虚拟机EVM
以太坊虚拟机或EVM是以太坊中智能合约的运行时环境。它不仅是沙盒,而且实际上是完全隔离的,这意味着在EVM中运行的代码无法访问网络,文件系统或其他进程。智能合约甚至无法访问其他智能合约。
帐户
以太坊有两种共享相同地址空间的账户:由公私钥对(即人)控制的外部账户和由与该账户一起存储的代码控制的合约账户。
外部帐户的地址是根据公钥确定的,而合同的地址是在创建合同时确定的(它是根据创建者的地址以及从该地址发送的交易次数得出的,即“随机数”)。
不管帐户是否存储代码,EVM均会平等对待这两种类型。
每个帐户都有一个永久键值存储,将256位字映射到256位字,称为storage。
此外,每个帐户都有以太币的余额(准确地说,以“ Wei”表示,1个以太币是10 ** 18 wei),可以通过发送包括以太币的交易来进行修改。
什么是Solidity?
以太坊Solidity是一种面向智能合约的高级语言,其语法与JavaScript类似。solidity是用于生成在EVM上执行的机器级代码的工具。solidity编译器获取高级代码并将其分解为更简单的指令。Solidity代码封装在Contracts中。
以太坊合约中的solidity
合约是以太坊去中心化应用程序的基本构建模块。所有变量和函数都是合约的一部分,这是所有项目的起点。一个名为MyFirst的空合约看起来像这样:
version pragma ^0.4.19;
contract MyFirst{
}
Solidity文件的布局
源文件可以包含任意数量的合约定义,包括指令和pragma指令。
Version Pragma
Version Pragma是定义代码使用的Solidity编译器版本的声明。
version pragma ^0.4.00;
注意:上面显示的源文件不会使用早于版本0.4.0的编译器进行编译,也不能在从版本0.5.0开始的编译器上运行。
导入其他源文件
Ethereum Solidity支持与JavaScript中可用的导入语句非常相似的导入语句,尽管Solidity不知道default export的概念。
在全局级别,可以使用以下形式的import语句:
import "filename";
上述语句将所有全局符号从filename导入当前全局范围。
import * as symbolName from "filename";
注释
就像任何其他语言一样,Solidity可以使用单行和多行注释。
// This is a single-line comment.
/*
This is a
multi-line comment
*/
现在,在我们进一步深入了解Solidity教程之前,应该知道以太坊有三个可以存储项目的区域。
- 存储Storage:所有合约状态变量所在的位置。每个合约都有自己的存储,并且在函数调用之间是持久的。
- 内存Memory:保存临时值并在(外部)函数调用之间擦除,并且使用起来更便宜。
- 堆栈Stack:保存小的局部变量并且几乎可以免费使用,但只能保存有限数量的值。
对于几乎所有类型,都无法指定它们应存储的位置,因为它们在每次使用时都会被复制。
好了,既然你已经知道以太坊Solidity中的存储位置,那么让我告诉你一般的值类型。
solidity中的值类型
以下类型也称为值类型,因为这些类型的变量将始终按值传递。
布尔
关键词:bool
值是常数,即true或false。
整型
关键字:int/uint(uint8到uint256,步长为8(无符号,最多为256位),int8为int256)
各种大小的有符号和无符号整数。
例:
contract MySample{
uint UnsignedInt =50;
}
在上面的语句中,我们创建了一个名为InsignedInt的uint并将其设置为50。
地址
关键字:address
保存一个20字节的值(以太坊地址的大小)。地址类型也有members,并作为所有合约的基础。
地址成员:balance与transfer
可以使用属性balance查询地址的余额,并使用transfer函数将以太网发送到地址。
address x = 0x123;
address myAddress = this;
if (x.balance < 10 && myAddress.balance > = 10)
x.transfer(10);