以太坊是什么?以太坊原理和以太坊入门教程

立即领取

最高 ¥2000 红包 限量领取

云服务器、主机等产品通用,可叠加官网常规优惠使用 | 限时领取

以太坊(Ethereum)是一个支持智能合约的区块链平台,它与比特币最大的不同是,以太坊通过一个虚拟机(EVM)可以运行智能合约。

以太坊是Vitalik Buterin(维塔利克·布特林,人称V神)在2013年提出的概念,Vitalik最早参与了比特币社区的开发,并希望比特币把功能受限的脚本扩展成图灵完全的编程环境,但没有得到比特币开发社区的认同,于是他决定另起炉灶,打造一个新的区块链平台,目标是运行去中心化的程序。

以太坊从2015年正式启动并运行,期间经历过DAO攻击造成的硬分叉。和比特币类似,以太坊也通过PoW进行挖矿,其挖出的平台币叫以太币(Ether),目前每个区块奖励是2 Ether,约13~15秒左右出一个块。

和比特币相比,以太坊在以下几点上有所不同:

账户模型

比特币使用的UTXO模型是一种对开发友好、易于实现清结算的模型,但对用户不友好,因为普通用户所认知的账户是一个账号、对应余额变动的模型。以太坊的账户模型和比特币不同,它就是余额模型,即交易引发账户余额的变动,这与传统金融账户一致。

智能合约

从比特币的支付原理可知,任何支付实际上都是在执行比特币脚本,只有脚本成功执行,支付才能成功。

以太坊的交易与之类似,并且更进一步,它实现了一个图灵完备的脚本语言,运行在EVM(Ethereum Virtual Machine,以太坊虚拟机)中,任何人都可以编写合法的脚本来执行任意逻辑(有很多限制),例如,定义一种新的代币,抵押贷款等。

以太坊账户负责存储用户的以太坊余额。对大多数普通用户来说,以太坊账户和银行账户非常类似,通常只需要一个账户即可。

确切地说,以太坊账户分为外部账户和合约账户两类:

  • 外部账户:即普通用户用私钥控制的账户;
  • 合约账户:一种拥有合约代码的账户,它不属于任何人,也没有私钥与之对应。

本节我们仅讨论普通用户使用的外部账户。

和比特币类似,一个以太坊账户就是一个公钥哈希后得到的地址,它是由一个私钥推导出对应的公钥,然后再计算出地址。其中,私钥与公钥算法与比特币完全相同,均为secp256k1椭圆曲线,但和比特币不同的是,以太坊采用非压缩公钥,然后直接对公钥做keccak256哈希,得到32字节的哈希值,取后20字节加上0x前缀即为地址:

以太坊地址算法

用代码实现如下:

const
    randomBytes = require('randombytes'),
    ethUtil = require('ethereumjs-util');

和比特币采用Base58或Bech32编码不同,以太坊对私钥和地址均采用十六进制编码,因此它没有任何校验,如果某一位写错了,仍然是一个有效的私钥或地址。

keccak256哈希算法在以太坊中也被称为SHA3算法,但是要注意,keccak算法原本是SHA3的候选算法,然而在SHA3最后的标准化时,对keccak做了改进,因此,标准的SHA3算法和keccak是不同的,只是以太坊在开发时就选择了尚未成为SHA3标准的keccak算法。后续我们在讨论以太坊的哈希算法时,一律使用keccak256而不是SHA3-256。

带校验的地址

因为以太坊的地址就是原始哈希的后20字节,并且以十六进制表示,这种方法简单粗暴,但没有校验。地址中任何数字出错都仍是一个有效地址。为了防止抄错,以太坊通过EIP-55实现了一个带校验的地址格式,它的实现非常简单,即对地址做一个keccak256哈希,然后按位对齐,将哈希值>=8的字母变成大写:

original addr = 0x29717bf51d8afca452459936d395668a576bce66
  keccak hash =   e72ecce2eb2ed0ffab5e05f043ee68fab3df759d...
checksum addr = 0x29717BF51D8AFcA452459936d395668A576Bce66

因此,以太坊地址就是依靠部分变成大写的字母进行校验,它的好处是带校验的地址和不带校验的地址对钱包软件都是一样的格式,缺点是有很小的概率无法校验全部小写的地址。

const ethUtil = require('ethereumjs-util');

HD钱包

因为以太坊和比特币的非对称加密算法是完全相同的,不同的仅仅是公钥和地址的表示格式,因此,比特币的HD钱包体系也完全适用于以太坊。用户通过一套助记词,既可以管理比特币钱包,也可以管理以太坊钱包。

以太坊钱包的派生路径是m/44'/60'/0'/0/0,用代码实现如下:

const
    bitcoin = require('bitcoinjs-lib'),
    bip39 = require('bip39'),
    ethUtil = require('ethereumjs-util');

因为以太坊采用账户余额模型,通常情况下一个以太坊地址已够用。如果要生成多个地址,可继续派生m/44'/60'/0'/0/1m/44'/60'/0'/0/2等。

小结

以太坊的私钥和公钥采用和比特币一样的ECDSA算法和secp256k1曲线,并且可以复用比特币的HD钱包助记词;

以太坊的地址采用对非压缩公钥的keccak256哈希后20字节,并使用十六进制编码,可以通过大小写字母实现地址的校验。

未经允许不得转载:独立站大学 » 以太坊是什么?以太坊原理和以太坊入门教程

赞 (0)