Ethereum

introduction

web3js_eth

There are a JavaScript library for developers which is web3.js,as some kind of portal or window of Ethereum network,can be usedd to send money,store data,deploy contracts or do essential what ever we want to do on the network

There are two options for consumers, which are Metamask(a broswer extension)、Mist Broswer(early beta)

Smart Contract

以太坊的核心是智能合约,智能合约就是一段可以通过人或者另一个合约发送消息来执行特定的操作的代码。

什么是智能合约 以太坊上的程序,是代码和数据(状态)的集合。 准图灵完备

典型应用:代币:EOS,游戏:迷恋猫

编程语言:Solidity Solidity 是一种用于编写智能合约的高级语言,运行在 Ethereum 虚拟机(以太坊虚拟机,EVM)之上 Solidity 语言的语法接近于 JavaScript,是一种面向对象的语言静态语言, .sol 后缀。

Solidity 是一种图灵完备的编程语言,所以编程的方式与 Java、C++类似。不过 Solidity 语言中并没有类的概念,但有一个合约的概念,用关键字 contract 表示。

Account

地址(Address):20 字节 状态(State)

账户分类:

外部账户(EOA) Externally owned account 合约账户: 当合约的字节码被部署到区块链时,便会有一个特定的地址来标识合约,这个地址便成为合约账户。

从 EVM 角度来说,这两个账户是一样的,但是他们还是有一些区别。

账户组成

三个部分都是以 16 进制存储

当我们在 Metamask 上面创建一个账户时,有三个主要组成部分: 三个部分都是以 16 进制存储

  1. Account Address Account Address is a unique identifier,like a email address or unique username. 一个账户适用于所有的以太坊网络,但是一个账户在不同网络中的以太币数量与该网络绑定的,即: 某个网络认为该地址有一定 ether, 另一个网络却认为它没有。
  2. Public Key
  3. Private Key

私钥、公钥和地址是如何生成的? 大体来说,地址的生成的流程是:私钥 -> 公钥 -> 地址。因此地址的生成需要三步:

生成一个随机的私钥(32 字节) 通过私钥生成公钥(64 字节) 通过公钥得到地址(20 字节)

私钥推导公钥 私钥是一组 64 位的 16 进制字符,通过私钥我们能够访问一个账户。以太坊的私钥生成是通过 secp256k1 椭圆曲线算法生成的,secp256k1 是一个椭圆曲线算法,同比特币。

公钥推导地址 和比特币相比,在私钥生成公钥这一步其实是一样的,区别在公钥推导地址第一部分,以太坊中非圧缩型公钥的处理就简单粗暴很多了,下图为 Public Key 生成 Address 的过程。

以太坊地址生成的过程 第一步:私钥 (private key)

伪随机数产生的 256bit 私钥示例(256bit 16 进制 32 字节)

18e14a7b6a307f426a94f8114701e7c8e774e7f9a47e2c2035db29a206321725

第二步:公钥 (public key)

  1. 采用椭圆曲线数字签名算法 ECDSA-secp256k1 将私钥(32 字节)映射成公钥(65 字节)(前缀 04+X 公钥+Y 公钥):

04    50863ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b2352    2cd470243453a299fa9e77237716103abc11a1df38855ed6f2ee187e9c582ba6

   2. 拿公钥(非压缩公钥)来hash,计算公钥的 Keccak-256 哈希值(32bytes):

fc12ad814631ba689f7abe671016f75c54c607f082ae6b0881fac0abeda21781

   3. 取上一步结果取后20bytes即以太坊地址:

1016f75c54c607f082ae6b0881fac0abeda21781

第三步:地址 (address)

0x1016f75c54c607f082ae6b0881fac0abeda21781

账户关系

消息只能由外部账户(EOA) 发起。未激活状态下,合约账户不能主动创建交易,只能被动触发。

account relationship

wallet

Geth(Go)、Mist、MetaMask

Transaction

作为后续做项目的准备,首先我们可以索取一些测试 Ether 到自己的钱包中,一些可以获得测试 Ether 的网址如下:

1
2
3
https://faucet.ropsten.be/
https://faucet.rinkeby.io/
https://www.rinkeby.io/#faucet

获得 Ether 的原理

  1. 大致过程 我们提交自己的地址,最终便会发生一笔向我们转入 Ether 交易, 其过程/原理如下: eth_transaction

  2. 一个 Transaction object 的结构: eth_transaction_header

v,r,s 由发送者私钥生成,进行数字签名。达到授权和认证的目的。

  1. Transaction object 与以太网络 We send the transaction to one specific node in The Ethereum Network。That node will communicating the rest of nodes in the network。 The node have one entire copy of blockchain. 由于节点众多,有时候一个节点可能会同时接受多个交易。 节点将同时收到的交易,打包成一个交易列表,也就是我们所称的 “区块”,然后节点运行 validation logic,也就是挖矿(mining)

挖矿

Anders discussion of blockchains and how they work is viewed as a 'must watch' video

Gas

交易手续费 Gas 费用:Gas 价格(用以太币计价)*Gas 数量

合约越复杂(计算、内存占用等),需要的 Gas 越多。任何一个特定的合约需要的 Gas 数量永远都是固定的。

愿意为这笔交易所付出的费用 限制一个合约运行的工作量,避免阻塞整个网络。

以太坊的单位:

最小单位:1Wei(伟) 109 Wei=1 Gwei 1012 Wei=1 szabo(萨博) 1015 Wei=1finey(芬尼) 10^18 Wei=1 Ether

以太坊网络

主网、测试网络、私有链、模拟环境

去中心化应用 Dapp

传统互联网应用 中心化,容易更新,数据完全掌控 去中心化应用 去中心化,按规则运行

去中心化应用架构 Dapp structure

参考推荐: 【Ethereum 基础】:账户、地址、私钥和公钥 以太坊账户管理之 keystore 文件(科普)