区块链之以太坊技术揭秘

21世纪技术官导读:在本篇文章中,我们将向各位介绍开放源代码区块链以太坊背后的主要概念,以及它是如何确保我们的交易安全的。

一、什么是以太坊?

以太坊(Ethereum)是一个开源的区块链平台,它可以构建和运行分布式的应用程序。以太坊是一个“单例(Singleton)”模式可缩放的计算机网络,我们可以理解成一台可供所有人用的单台电脑。也是一个几乎为零的公共区块链基础设施平台。

任何一个加入以太坊区块链的人都可以把程序上传到该平台上,并可以请求执行上传的程序。

二、以太坊虚拟机(Ethereum Virtual Machine)

EVM是以太坊的核心,它是一个可编程的区块链。开发者可以用它创建任何复杂的操作。EVM侧重于提供安全性,可以防止Dos(拒绝服务)等常见的网络攻击。

它可以用于加密数字货币,例如区块注册,银行交易等。它支持一个P2P网络,并确保通信可以毫无干扰的进行传输。

简而言之,开发者可以理解成一个智能合约的运行时环境,这与Java中的Java虚拟机原理一致。

三、以太坊客户端

以太坊客户端支持如下开发语言:

四、什么是矿工

它为用户提供计算处理能力。一旦你加入到网络,你就会在以太坊网络中拥有一个节点,节点可以接收事务,传播,验证事务并执行。它可以接收名为“Ether”(以太币)的小型加密货币,这是验证网络的交易费用。

我们来了解一些关于矿工的重要事项。

Ether(以太币):这是一个加密货币,用于折算区块链网络的计算贡献,可以兑换成比特币与美元。

工作量证明(Proof of Work):解决一个复杂的数学问题,以便成功的“挖掘”出一片街区被称为“工作量证明”。

五、以太坊如何工作?

以太坊的一切都是基于帐户的。在以太坊状态下有两种类型的帐户,并且都有一个帐户余额。

1)外部帐号(EOA)- 这些是用户控制的帐号。他们可以进行交易(转账或触发合约代码)。这通常由私钥控制,它不带有任何相关代码。

比如,钱包地址看起像这样:

0x2easdf8745dfgszxcvkhsdf543sfg5shhhkjha (公共密钥的版本)。

2)合约 - 这是一个系统或内部代码。它维护着一个存储数据,以来调用其它的合约。合约存储着多个用户之间正在进行的合约或关系。例如,合约的钱包地址如下代码所示:

0x9812dfgfdskjhgfgszxcvkhsdf543swg5shskkmh

以太坊内的每一项行为都是通过EOA发起的交易产生的,EOA可以触发与另一个EOA或合约的交易。合约代码由参与以太坊网络的每个节点的EVM执行。 合约可以执行交易/调用其它合约。

账户交互可以理解为如下图:

智能合约

智能合约是一种代码(使用协约账户),执行毫无风险的透明交易。可以通过下面的图例来理解。

以太坊密钥文件

私钥:这是一个包含64个字符的字符串。64位之外的字符串都是有效的密钥。

公钥或钱包地址:散列私钥的最后40个字符,前面以'ox'表示是十六进制格式。

让我们看看下面的密钥转换图(私有到公共)

现在在让我们再看一下以太坊的一些工具,这些工具可以用来代替以太坊。

etherscan.io

这是一个块浏览器。图中箭头指向的是一些重要的元素。

ethstats.net

以下是以太坊的仪表盘,用来显示以太坊的统计数据。

区块链交易

“一个签名数据包,用于存储从外部账号(EOA)发送到区块链上另一个账户的消息。

——Jameson”

想在区块链中做任何事情都须经过交易。在交易中包含以下属性:

1)To(收件人):收件人或合约地址

2)From(发件人):启动交易的发件人(帐号或合约地址)

3)Gas价格:EVM中的每个OpCode(我们希望执行的任何计算步骤都具有相同的OpCode)都有固定的价格。Gas是交易发件人需要为以太坊区块链上的每一项操作支付的执行费用。由于它是一种“加密燃料”,因此被命名为'Gas'。

4)Gas限制:最大可计算步骤交易被执行;这意味着每个事务都有限制数量的允许计算步骤。

5)Gas使用数:所有OpCodes执行的所有Gas的总和。

6)Value:已交易的Ether以太币Wei(乙太币的基本单位称为Wei )。

7)签名:用以识别发件人,以便可以验证发件人的意图。

8)Nonce:发送账户的交易顺序号码; 这有助于以正确的顺序对交易进行索引和处理。

9)块高度 :此处为唯一的块编号。

10)数据:有效载荷; 原始数据或合约。

如果你指定的gas过少,如果交易开始执行,但可能会用尽gas,并且会因“燃气”异常而停止。

说明:以太坊加密算法并不是基于RSA加密。 相反它采用了Elliptic Curve Cryptography(ECC)算法。

什么是OpCode?

这是一个机器语言指令,指示机器执行特定的操作。 因此,OpCode可以被理解为汇编语言。

无论我们将哪些代码编写为智能合约或交易的一部分,它都会被EVM(以太坊虚拟机)编译和解释,并生成等效的OpCode,以便EVM可以执行。

这些操作中的每一个都有一些成本,会以“gas”为单位来衡量。任何交易中所有OpCode的累计总和就是该交易的总成本。

一些以太坊操作码及其意义如下。

停止和算术操作:

0x00 STOP Halts execution

0x01 ADD Addition operation

0x02 MUL Multiplication operation

0x03 SUB Subtraction operation

0x04 DIV Integer division operation

0x05 SDIV Signed integer

0x06 MOD Modulo

0x07 SMOD Signed modulo

0x08 ADDMOD Modulo

0x09 MULMOD Modulo

0x0a EXP Exponential operation

0x0b SIGNEXTEND Extend length of two's complement signed integer

比较和按位逻辑操作:

0x10 LT Lesser-than comparison

0x11 GT Greater-than comparison

0x12 SLT Signed less-than comparison

0x13 SGT Signed greater-than comparison

0x14 EQ Equality comparison

0x15 ISZERO Simple not operator

0x16 AND Bitwise AND operation

0x17 OR Bitwise OR operation

0x18 XOR Bitwise XOR operation

0x19 NOT Bitwise NOT operation

0x1a BYTE Retrieve single byte from word

SHA3:

0x20 SHA3 Compute Keccak-256 hash

环境信息:

0x30 ADDRESS Get address of currently executing account

0x31 BALANCE Get balance of the given account

0x32 ORIGIN Get execution origination address

0x33 CALLER Get caller address. This is the address of the account that is directly responsible for this execution

0x34 CALLVALUE Get deposited value by the instruction/transaction responsible for this execution

0x35 CALLDATALOAD Get input data of current environment

0x36 CALLDATASIZE Get size of input data in current environment

0x37 CALLDATACOPY Copy input data in current environment to memory This pertains to the input data passed with the message call instruction or transaction

0x38 CODESIZE Get size of code running in current environment

0x39 CODECOPY Copy code running in current environment to memory

0x3a GASPRICE Get price of gas in current environment

0x3b EXTCODESIZE Get size of an account's code

0x3c EXTCODECOPY Copy an account's code to memory

块信息:

0x40 BLOCKHASH Get the hash of one of the 256 most recent complete blocks

0x41 COINBASE Get the block's beneficiary address

0x42 TIMESTAMP Get the block's timestamp

0x43 NUMBER Get the block's number

0x44 DIFFICULTY Get the block's difficulty

0x45 GASLIMIT Get the block's gas limit

堆栈,内存,存储和流程操作:

0x50 POP Remove item from stack

0x51 MLOAD Load word from memory

0x52 MSTORE Save word to memory

0x53 MSTORE8 Save byte to memory

0x54 SLOAD Load word from storage

0x55 SSTORE Save word to storage

0x56 JUMP Alter the program counter

0x57 JUMPI Conditionally alter the program counter

0x58 PC Get the value of the program counter prior to the increment

0x59 MSIZE Get the size of active memory in bytes

0x5a GAS Get the amount of available gas, including the corresponding reduction

0x5b JUMPDEST Mark a valid destination for jumps

系统操作:

0xf0 CREATE Create a new account with associated code

0xf1 CALL Message-call into an account

0xf2 CALLCODE Message-call into this account with alternative account's code

0xf3 RETURN Halt execution returning output data

0xf4 DELEGATECALL Message-call into this account with an alternative account's code, but persisting the current values for `sender` and `value`

我们不需要编写低级程序(使用OpCode),因为设计智能合约时有高级语言开发。

掌握交易成本

预计交易成本

If the GasLimit = 2100 and GasPrice =23.089 gWei

上面表达式的解释为 - “我们想以23.089gWei的价格买最多2100个天然气”

所以,估计的最大交易成本

= GasLimit * GasPrice = 2100 * 23.089

= 53104.7 gWei

实际交易成本

If the GasUsed = 2040 and GasPrice = 23.089gWei

上面表达式的解释为 -“我们花了2040Gas,价格为23.089gWei。”

所以,实际交易成本= GasUsed * GasPrice

= 2040 * 23.089

= 47101.56 gWei

我们希望本篇让大家更好地了解区块链和以太坊交易流程。

愉快地学习吧!

作者:志刚

来源:21世纪技术官编译

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180305G00BLI00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注腾讯云开发者

领取腾讯云代金券