3分钟漫谈以太坊The DAO事件,浅入浅出区块链(4)

这片博文主要是继续的简要的介绍一下The DAO事件,以及ETH和ETC的关系。

  • 3分钟漫谈以太坊The DAO事件,浅入浅出区块链(4)>> 你在这里
  • 3分钟漫谈以太坊The DAO事件,浅入浅出区块链(3)
  • 3分钟漫谈以太坊The DAO事件,浅入浅出区块链(2)
  • 3分钟漫谈以太坊The DAO事件,浅入浅出区块链(1)

这是一系列关于区块链的漫谈博客。用讲故事的方法,漫聊一下区块链。其中也会穿插一些区块链相关概念,以及编程的介绍。主要目的是漫谈,每个主题之间相对独立,在阅读的时候,可以选择你有兴趣的部分阅读。

虽然目的是漫谈,但准确的信息是博文的基本,如果有不准确的地方,请留言或者发消息,我会及时订正。

复习一下DAO

DAO是Decentralized Autonomous Organization的简称。
可以理解为:去中心化自治组织。任何符合以下特征的组织,都可以被成为DAO组织。
DAO组织的操作过程:发布智能合约,发行代币(ICO),众筹资金,运营和投资众筹的资金。这整个过程也被成为DAO项目。

复习一下The DAO事件

德国一家专注“智能锁”的公司发布了一个DAO项目,黑客利用一个DAO项目的漏洞,转移了一笔巨款,然后以太坊的白帽黑客们,通过软分叉,和硬分叉的方法拿回了被盗的以太币。

复习一下msg.sender 等全局变量

在学习以太坊DApp编程的时候,我们经常会看到 msg.sender 等的使用,但是我们没有定义这些变量,这些变量是什么意思呢?
msg.sender 等这样的变量或者函数,是以太坊区块链默认提供的,其中包含了在处理请求的时候,请求方的相关信息。

  • msg.sender : 返回请求发送方的地址。
  • msg.data : 包含了所有请求发送方的信息。这个数据是不可变的,也不会永久性的存储到区块链里面。
  • msg.gas : 请求发送方剩余的gas数量。
  • msg.sig : 发送方需要的处理函数的地址的前4个bytes。(智能合约可以提供很多种功能,很多时候我们只需要使用其中的一个功能的时候,我们可以指定智能合约分配个每个功能的ID:opcodes来实现。)
  • msg.value : 我们发送给这个智能合约的Ether,以wei为单位。可以附带发送信息。(wei是描述Ether的最小单位,就好像一分钱是人民币最小的单位一样)

全部的函数和变量可以在下方官网查看:

  • Special Variables and Functions

transfer vs send vs call

如果我们想给最可爱的五月天发送一笔500wei的ether,让他们可以“私奔到月球”,我们可以通过这三个方法实现:

  • msg.sender.transfer(500)
  • msg.sender.send(number)
  • msg.sender.call.value(500)()

这里的 msg.sender 将返回五月天“私奔到月球”智能合约的地址

那这三种方式的发送又有什么不同呢?
address-related相关的函数

  • .transfer(uint256 amount):
    send given amount of Wei to Address, reverts on failure, forwards 2300 gas stipend, not adjustable
    发送Wei到某个地址,如果失败,发出例外,消耗固定的2300gas。

  • .send(uint256 amount) returns (bool):
    send given amount of Wei to Address, returns false on failure, forwards 2300 gas stipend, not adjustable
    发送Wei到某个地址,如果失败,返回false,消耗固定的2300gas。

  • .call(bytes memory) returns (bool, bytes memory):
    issue low-level CALL with the given payload, returns success condition and return data, forwards all available gas, adjustable
    发送Wei到某个地址,如果失败,返回false,可以接受可变的gas,用于执行其他的函数。

privat key vs address 密匙和地址的关系

在上面我们漫谈了3个关于地址操作的函数,我们顺便介绍一下地址和私钥的关系。

There are three main steps to get from private -> address:

  • Create a random private key (64 (hex) characters / 256 bits / 32 bytes)
  • Derive the public key from this private key (128 (hex) characters / 512 bits / 64 bytes).
  • Derive the address from this public key. (40 (hex) characters / 160 bits / 20 bytes) Take the Keccak-256 hash of the public key.

从产生密匙到生成公共地址,需要这个三个步骤。(通过密匙,可以操作账号哦,要绝对保密,地址则是公开的)

  • 用算法得到一个随机数(64位16进制),作为密匙
  • 从密匙派生出公匙(128位16进制)
  • 从公匙派生出地址(40位16进制)

Account Types 账号类型

在以太坊上,有两种账号类型:

  • Externally owned accounts (EOAs) 可以认为是个人账号
  • Contract accounts 智能合约账号

两种账号的区别:
Externally owned accounts (EOAs)

  • has an ether balance 可以保存ether
  • can send transactions (ether transfer or trigger contract code), 可以交易ether
  • is controlled by private keys, 通过私钥来控制
  • has no associated code. 没有处理请求的代码

Contract accounts

  • has an ether balance, 可以保存ether
  • has associated code, 有处理请求的代码
  • code execution is triggered by transactions or messages (calls) received from other contracts. 其他智能合约可以通过transactions or messages (calls)来执行代码
  • when executed - perform operations of arbitrary complexity (Turing completeness) - manipulate its own persistent storage 代码相对复杂,可以操作所属的区块链
  • can call other contracts 可以向其他智能合约发出请求

图片来源

图片来自网络

相关链接

  • HiBlock区块链技术布道 GitHub
  • 为什么会有ETH和ETC?the DAO攻击事件2周年祭
  • Understanding The DAO Hack for Journalists By David Siegel
  • 【全纪录】震惊全球的The DAO黑客事件全程回顾

你可能感兴趣的:(3分钟漫谈以太坊The DAO事件,浅入浅出区块链(4))