EOS测试网先睹为快

in #cn7 years ago

EOS测试网先睹为快

EOS作为币村的希望,主网还有两个月多才会上线。上线时间大概是六月初,也就是差不多在高考的时候。

现阶段,我们只有测试网可以玩。 现在的测试网部署的是EOS DAWN2.0版本。
具可靠消息,官方将在近期上线EOS DAWN 3.0的测试网。
并停用现有EOS DAWN2.0的测试网。

eos1.jpeg
eos2.jpeg

4月6号,EOS的运营团队block.one将在香港举行发布会。所以3.0近在眼前了。

为了迎驾这新Dapp开发平台,本文罗列出EOS的一些基本要素以及和以太坊做一个比较:

  • key pair
  • wallet
  • account
  • smart contract
  • DPOS

准备工作

  • clone EOS源码进行编译:https://github.com/EOSIO/eos
  • 编译成功后,生成了build目录,到build目录下的install/bin 可以看到编译出来的可执行文件:

➜  bin git:(bcb5bf75) ✗ pwd
/Users/joe/Workspace/eos/build/install/bin
➜  bin git:(bcb5bf75) ✗ ls
abi_gen       codegen       embed_genesis eos-walletd   eosc          eoscpp        eosd          launcher

  • 为了方便调用,把这个路径加入到环境变量了:
export PATH=$PATH:/Users/joe/Workspace/eos/build/install/bin
  • 这些就是EOS的主要执行文件了:
    • eosd: 节点启动程序
    • eosc: 和eos节点的交互程序
    • eos-walletd: 钱包启动程序
    • eoscpp: 智能合约的编译命令,可以把c++文件编译成wasm文件和abi
    • launcher: 快捷模拟程序。在本地创建多个节点。

由于要演示的是基于测试网,所以只需要用到eosceoscpp 即可。
eosc 通过指定 -H testnet1.eos.io -p 80 可以与测试网节点通讯。

  • 运行 /path_to_eos/scripts/start_npnode.sh, 创建节点进程以及钱包后台进程。(节点程序会不断的和测试网进行区块同步,这是一个漫长的过程,所以我们后面玩到智能合约和account的时候,通过指定 -H testnet1.eos.io -p 80 直接和测试网节点通讯,不经过本地节点。)

wallet

钱包是EOS中第一个重要的元素。
EOS本身就已经实现了钱包。
调用 eosc wallet create 创建钱包

不指定参数 则创建名为default的钱包
$ eosc wallet create
Creating wallet: default
Save password to use in the future to unlock this wallet.
Without password imported keys will not be retrievable.
"A MASTER PASSWORD"

创建成功会返回给你一串密码,需要好好保存。

指定-n 参数, 可以给钱包起一个名字: 
$ eosc wallet create -n periwinkle
Creating wallet: periwinkle
Save password to use in the future to unlock this wallet.
Without password imported keys will not be retrievable.
"A MASTER PASSWORD"


查看已创建的钱包:
$ eosc wallet list
Wallets:
[
  "default *",
  "periwinkle *"
]
注意到钱包后有个*号,那表示钱包是已解锁的状态。

锁定第二个钱包,通过lock命令以及-n指定钱包名字

$ eosc wallet lock -n periwinkle
Locked: 'periwinkle'


锁定之后,再看第二个钱包的*号已经不见了,此时表示是锁定状态。
$ eosc wallet list
Wallets:
[
  "default *",
  "periwinkle"
]

解锁:
$ eosc wallet unlock -n periwinkle
输入创建钱包时返回的密码。就能成功解锁。
解锁之后,*号回来了。
$ eosc wallet list
Wallets:
[
  "default *",
  "periwinkle *"
]

当重启钱包后台进程之后,在查看钱包:

$ eosc wallet list
Wallets:
[]
会发现钱包列表空了。不见了么?

使用钱包首先需要打开钱包,由于重启了,所以钱包默认是关闭的,开启钱包:

$ eosc wallet open
$ eosc wallet list
Wallets:
[
  "default"
]

$ eosc wallet open -nperiwinkle
$ eosc wallet list
Wallets:
[
  "default",
  "periwinkle"
]
打开之后的钱包,是锁定状态的,要使用的话,别忘了解锁:

$ eosc wallet unlock 
$ eosc wallet unlock -n periwinkle

key pair, 生成并向钱包导入私钥

和所有区块链钱包的概念一样,钱包不是放钱不是存放资产,而是管理私钥。
有了钱包,我们可以开始向钱包当中倒入私钥了。

首先生成EOS key pair, 一对key pair包含公钥和私钥。

$ eosc create key
Private key: 5JpWt1ZcqCLFaxnXgJz3xuHpD4qCQg1SmZymxAikibg2xmju6bq
Public key: EOS7Fu52r9NKLB37Tzjm4Sdde8kWr3b8PwsPMXr4MwQPKRS6oHipQ

$ eosc create key
Private key: 5J8DwCjUykgWvZ2VpfCwx1VSUrLHDX3TfmesnRSNprhSRDhcCWj
Public key: EOS6r7SrFUNRSmeuhpComoaWH8ZAcfYWyYHLY9RLBcDeG8aGsTkrx

现在我们有两对EOS key pair了。现在它们只是两对平凡普通的公私钥对,没有任何权限控制。
于是,我们将它们导入到钱包中,这样钱包的密码机制就能提供一层保护。

$ eosc wallet import 5JpWt1ZcqCLFaxnXgJz3xuHpD4qCQg1SmZymxAikibg2xmju6bq
imported private key for: EOS7Fu52r9NKLB37Tzjm4Sdde8kWr3b8PwsPMXr4MwQPKRS6oHipQ
$ eosc wallet import 5J8DwCjUykgWvZ2VpfCwx1VSUrLHDX3TfmesnRSNprhSRDhcCWj
imported private key for: EOS6r7SrFUNRSmeuhpComoaWH8ZAcfYWyYHLY9RLBcDeG8aGsTkrx

利用eosc wallet import导入私钥,记住是私钥噢,根据私钥能推导出公钥,所以导入成功,会提示打印出对应的公钥。

列出解锁状态的钱包 管理的所有key pair 
$ eosc wallet keys
[[
    "EOS6....",
    "5KQwr..."
  ],
  [
    "EOS3....",
    "5Ks0e..."
  ]
]

备份钱包

钱包保存着我们的私钥和公钥。所以备份钱包文件是个好习惯。以防不可避免的钱包丢失,比如硬盘损坏。

钱包文件是高强度加密的,没有密码的话,钱包里面的keys几乎不可能被破解(或许几十年之后,量子计算机研发成功了,可能可以暴力破解)。

钱包可以在以下目录中找到:后缀为.wallet 就是钱包文件。将它们拷贝到你认为安全的地方。

$ cd /path_to_eos/build/programs/nodeos && ls
blockchain   blocks   config.ini   default.wallet   periwinkle.wallet

创建 Account

Account,在EOS中,有了账户的概念,这样的设计,对于区块链应用的普及和推广是个好事,如果像比特币和以太坊那样,转账交易都基于一串超长难以记忆的公钥的话,也太不方便了,让不熟悉技术的人情以何堪。 有了账户,就可以方便很多了。
根据白皮书描述,账户具有以下特点:

  • 一个人类可读的、存储在区块链的名字
  • 最多12个字符
  • 由账户创建者自己选择命名。(不像公钥,想生成一个靓号,全看脸)

EOS在账户这一层级,还提供了更多的权限控制,让账户安全。

账户的创建命令,4个参数,

  • creator: 父级账户名。(目前的设定,一个账户需要由另一个账户来帮忙创建)
  • name: 要创建的账户的账户名
  • OwnerKey: 公钥,账户主,拥有此账户全部权限
  • ActiveKey: 公钥,拥有平时使用该账户的操作权限
$ eosc create account
Create a new account on the blockchain
Usage: eosc create account [OPTIONS] creator name OwnerKey ActiveKey

如果还没有账户,目前2.0测试网的账户,需要到这里申请:https://docs.google.com/forms/d/e/1FAIpQLSel3HVFb22zYaAJfUtu_IzFgIJ4OATb0jQ3H2FV-HbwnJ090g/viewform

Snip20180324_1.png

填写申请表,申请成功后,会邮箱通知。申请到的developer测试账户,里面有不少EOS可以用于测试。

有了自己的账户号后,也可以随意的创建账号了。
一个账号是什么样的结构呢?
让我们来看一下,比如我申请的测试账号叫: ayana1joe,
通过 eosc get account 可以查看账户信息, 需要连接测试网,所以别忘了加 -H testnet1.eos.io -p 80 因为本地节点很可能还没有同步下来。

$ eosc -H testnet1.eos.io -p 80 get account ayana1joe
{
  "account_name": "ayana1joe",
  "eos_balance": "100.0000 EOS",
  "staked_balance": "0.0001 EOS",
  "unstaking_balance": "0.0000 EOS",
  "last_unstaking_time": "1969-12-31T23:59:59",
  "permissions": [{
      "perm_name": "active",
      "parent": "owner",
      "required_auth": {
        "threshold": 1,
        "keys": [{
            "key": "EOS7BNvtNAAGjKmzfcyJ64M2cwRmQDtZGbCnZyofXpcKeNez2Cheg",
            "weight": 1
          }
        ],
        "accounts": []
      }
    },{
      "perm_name": "owner",
      "parent": "",
      "required_auth": {
        "threshold": 1,
        "keys": [{
            "key": "EOS7BNvtNAAGjKmzfcyJ64M2cwRmQDtZGbCnZyofXpcKeNez2Cheg",
            "weight": 1
          }
        ],
        "accounts": []
      }
    }
  ]
}

但从结构上来看,有账户余额等信息,以及最重要的权限信息,目前有active,owner两种权限,分别指向了创建时候给的参数: OwnerKey和ActiveKey 。 也就是说,只有持有OwnerKey、ActiveKey对应私钥的人,才有权限对这个账户进行操作。 而私钥又是由钱包管理的,钱包可以解锁和锁定,钱包管理者我们的私钥,只有解锁才可以使用,解锁时需要密码。

所以总结并整理下:这些元素之间的关系:

  • 钱包密码(创建钱包时系统给你的,需妥善保存)
  • 钱包: 可以管理多对私钥、公钥。当需要使用私钥进行签名时,首先需要先用钱包密码解锁钱包。
  • 账户:人类可读的存在于区块链当中的唯一识别名,可以在创建的时候,赋予active,owner权限。持有OwnerKey、ActiveKey对应私钥的人,可以操作这个账户。

继续创建子账户

当我申请了ayana1joe 这个测试账户后,之后再创建账户就不需要在去官网申请了,自己也能创建了,当然,这样创建出来的账户里面是没有余额的。

$ eosc -H testnet1.eos.io -p 80 create account ayana1joe joeswallet EOS7f5rRAswgqr2fff5EVRWpenpUKCoGZQqHck55WqqRMF7dnoh5u EOS7BNvtNAAGjKmzfcyJ64M2cwRmQDtZGbCnZyofXpcKeNez2Cheg
{
  "transaction_id": "1211dd50d9d1e1c7c7397f8da2675a53eb510a601899ed098fd86ac156f0f2a0",
  "processed": {
    "ref_block_num": 38715,
    "ref_block_prefix": 1571712708,
    "expiration": "2018-03-27T17:03:28",
    "scope": [
      "ayana1joe",
      "eos"
    ],
    "signatures": [
      "201e02063785ac51da63bc6246c2c8938d63ebdc3fa56049d80d9127f88467a5536a51f04e11f3574b1bb0ecfe446910a25448a36484177694516098e0c34a965e"
    ],
    "messages": [{
        "code": "eos",
        "type": "newaccount",
        "authorization": [{
            "account": "ayana1joe",
            "permission": "active"
          }
        ],
        "data": {
          "creator": "ayana1joe",
          "name": "joeswallet",
          "owner": {
            "threshold": 1,
            "keys": [{
                "key": "EOS7f5rRAswgqr2fff5EVRWpenpUKCoGZQqHck55WqqRMF7dnoh5u",
                "weight": 1
              }
            ],
            "accounts": []
          },
          "active": {
            "threshold": 1,
            "keys": [{
                "key": "EOS7BNvtNAAGjKmzfcyJ64M2cwRmQDtZGbCnZyofXpcKeNez2Cheg",
                "weight": 1
              }
            ],
            "accounts": []
          },
          "recovery": {
            "threshold": 1,
            "keys": [],
            "accounts": [{
                "permission": {
                  "account": "ayana1joe",
                  "permission": "active"
                },
                "weight": 1
              }
            ]
          },
          "deposit": "0.0001 EOS"
        },
        "hex_data": "000050f405338d37004056311a8e157d0100000001036ca671905f004097bf266c7173ee9443797667198b01f2d70c68bde8766da7880100000100000001032dbdc517aed5ab66f8e558b4a80f79d574f5e3d7f64e81816e40f958d4ffaeb5010000010000000001000050f405338d3700000000a8ed32320100010000000000000004454f5300000000"
      }
    ],
    "output": [{
        "notify": [],
        "deferred_trxs": []
      }
    ]
  }
}

进行账户之间的转账:

$ eosc -H testnet1.eos.io -p 80 transfer ayana1joe joeswallet 1
{
  "transaction_id": "345adb2ef93c9165bdee655d20a242c5a509074213726e698fb2a8fb431811b9",
  "processed": {
    "ref_block_num": 38715,
    "ref_block_prefix": 1571712708,
    "expiration": "2018-03-27T17:03:28",
    "scope": [
      "ayana1joe",
      "joeswallet"
    ],
    "signatures": [
      "1f6995a7545d762cc0d815813eb22840765720c37272a5a69589f16682c19062b26d152e48535b6dbb1f8789aee11f5bcb1296778928a22103497f548de4104cdc"
    ],
    "messages": [{
        "code": "eos",
        "type": "transfer",
        "authorization": [{
            "account": "ayana1joe",
            "permission": "active"
          }
        ],
        "data": {
          "from": "ayana1joe",
          "to": "joeswallet",
          "amount": 1,
          "memo": ""
        },
        "hex_data": "000050f405338d37004056311a8e157d010000000000000000"
      }
    ],
    "output": [{
        "notify": [{
            "name": "joeswallet",
            "output": {
              "notify": [],
              "deferred_trxs": []
            }
          },{
            "name": "ayana1joe",
            "output": {
              "notify": [],
              "deferred_trxs": []
            }
          }
        ],
        "deferred_trxs": []
      }
    ]
  }
}

智能合约

这是重头戏。大家对EOS的期望来自于,它号称的百万级TPS性能。

接下来我们看看EOS的智能合约以及和以太坊智能合约的不同之处。

目前EOS支持c++语言写的的智能合约,最终编译出wast文件

创建合约:

调用 eoscpp 生成合约模版。
$ eoscpp -n hello
$ cd hello
$ ls
hello.abi hello.hpp hello.cpp

看看hello.cpp内容:

$ cat hello.cpp

#include <hello.hpp>

/**
 *  The init() and apply() methods must have C calling convention so that the blockchain can lookup and
 *  call these methods.
 */
extern "C" {

    /**
     *  This method is called once when the contract is published or updated.
     */
    void init()  {
       eosio::print( "Init World!\n" );
    }

    /// The apply method implements the dispatch of events to this contract
    void apply( uint64_t code, uint64_t action ) {
       eosio::print( "Hello World: ", eosio::name(code), "->", eosio::name(action), "\n" );
    }

} // extern "C"

init: 可以理解过初始化函数
apply: 相当于分发器函数,可以根据外部传进来的action参数类型,进行程序逻辑上的无限扩展。

编译合约

➜  $ eoscpp -o hello.wast hello.cpp
/usr/local/wasm/bin/clang -emit-llvm -O3 --std=c++14 --target=wasm32 -ffreestanding -nostdlib -fno-threadsafe-statics -fno-rtti -fno-exceptions -I /Users/joe/Workspace/eos/build/install/include -I . -c hello.cpp -o /var/folders/80/m80ty1ms59n4gv257121dbn40000gn/T/tmp.mCLl7zio/built/hello.cpp
➜  $ ls
hello.abi  hello.cpp  hello.hpp  hello.wast


部署合约

部署合约需要指定一个账户,需要私钥签名,所以要确保把钱包打开并解锁。才能部署成功。

➜  $ eosc -H testnet1.eos.io -p 80 set contract ayana1joe  hello.wast hello.abi
Reading WAST...
Assembling WASM...
Publishing contract...
{
  "transaction_id": "6b141c4ff3701986c4b91c79d5f586d94bd2d0f7b8942fe9994e5c7b5a3863e4",
  "processed": {
    "ref_block_num": 38715,
    "ref_block_prefix": 1571712708,
    "expiration": "2018-03-27T17:03:28",
    "scope": [
      "ayana1joe",
      "eos"
    ],
    "signatures": [
      "2011f5dfc69a1602c36a449712d86f6f3112a8f9fb53a90f115d1638aca79245e8506994ab6a77df795fe6018b09ae72e791be71d71d4edffbe75629f242483d3d"
    ],
    "messages": [{
        "code": "eos",
        "type": "setcode",
        "authorization": [{
            "account": "ayana1joe",
            "permission": "active"
          }
        ],
        "data": {
          "account": "ayana1joe",
          "vm_type": 0,
          "vm_version": 0,
          "code": "0061736d0100000001110460017f0060017e0060000060027e7e00021b0203656e76067072696e746e000103656e76067072696e7473000003030202030404017000000503010001071903066d656d6f7279020004696e69740002056170706c7900030a21020600411010010b1800413010012000100041d00010012001100041e00010010b0b54050041040b04704000000041100b114a6f6520496e697420576f726c64210a000041300b1e48656c6c6f20576f726c642046726f6d204a6f652773204d5042203a20000041d0000b032d3e000041e0000b020a000029046e616d6504067072696e746e0100067072696e7473010004696e697400056170706c790201300131",
          "code_abi": {
            "types": [{
                "new_type_name": "account_name",
                "type": "name"
              }
            ],
            "structs": [{
                "name": "transfer",
                "base": "",
                "fields": {
                  "from": "account_name",
                  "to": "account_name",
                  "amount": "uint64"
                }
              },{
                "name": "account",
                "base": "",
                "fields": {
                  "account": "name",
                  "balance": "uint64"
                }
              }
            ],
            "actions": [{
                "action_name": "transfer",
                "type": "transfer"
              }
            ],
            "tables": [{
                "table_name": "account",
                "index_type": "i64",
                "key_names": [
                  "account"
                ],
                "key_types": [
                  "name"
                ],
                "type": "account"
              }
            ]
          }
        },
        "hex_data": "000050f405338d37000087020061736d0100000001110460017f0060017e0060000060027e7e00021b0203656e76067072696e746e000103656e76067072696e7473000003030202030404017000000503010001071903066d656d6f7279020004696e69740002056170706c7900030a21020600411010010b1800413010012000100041d00010012001100041e00010010b0b54050041040b04704000000041100b114a6f6520496e697420576f726c64210a000041300b1e48656c6c6f20576f726c642046726f6d204a6f652773204d5042203a20000041d0000b032d3e000041e0000b020a000029046e616d6504067072696e746e0100067072696e7473010004696e697400056170706c790201300131010c6163636f756e745f6e616d65046e616d6502087472616e7366657200030466726f6d0c6163636f756e745f6e616d6502746f0c6163636f756e745f6e616d6506616d6f756e740675696e743634076163636f756e740002076163636f756e74046e616d650762616c616e63650675696e74363401000000572d3ccdcd087472616e7366657201000000204f4d11320369363401076163636f756e7401046e616d65076163636f756e74"
      }
    ],
    "output": [{
        "notify": [],
        "deferred_trxs": []
      }
    ]
  }
}

部署成功的话,在eosd进程的log中可以看到以下输出:执行的是合约代码中init方法:

912018ms            wasm_interface.cpp:1023       load                 ] wasm_interface::load name = ayana1joe times llvm:7 ms, init:0 ms, abi:0 ms
Init World!

向合约中发送消息:

➜  $ eosc -H testnet1.eos.io -p 80  push message ayana1joe  hello '"abcd"' --scope ayana1joe
552337ms            main.cpp:1128                 operator()           ] Converting argument to binary...
{
  "transaction_id": "c15d281cc278ea15b448decae0e47cf7962a760b7c7dc599977bbfe99b7788da",
  "processed": {
    "ref_block_num": 10430,
    "ref_block_prefix": 921642592,
    "expiration": "2018-03-30T02:09:42",
    "scope": [
      "ayana1joe"
    ],
    "signatures": [],
    "messages": [{
        "code": "ayana1joe",
        "type": "hello",
        "authorization": [],
        "data": "abcd"
      }
    ],
    "output": [{
        "notify": [],
        "deferred_trxs": []
      }
    ]
  }
}

后台可以看到以下输入:执行的是apply方法:并且

Hello World: ayana1joe->hello

一开始这种方式有点难理解,毕竟和以太坊太不一样了。

不妨先看看EOS白皮书里对智能合约的描述:

每个账户都可以将结构化的操作发送给其他账户,并可以定义脚本来处理接收到的操作。EOS为每个账户提供了专用数据库,只能由自己的操作处理程序访问。动作处理脚本还可以将操作发送到其他账户。

操作(action,apply方法里的参数)和自动操作处理程序(apply方法中的代码)的组合正式EOS定义智能合约的方式。

那什么是结构化操作呢? 修改下上面的hello.cpp : 加入transfer结构体(struct, c++里的自定义类型)


#include <hello.hpp>

/**
 *  The init() and apply() methods must have C calling convention so that the blockchain can lookup and
 *  call these methods.
 */
extern "C" {

    /**
     *  This method is called once when the contract is published or updated.
     */
    void init()  {
       eosio::print( "Init World!\n" );
    }

    struct transfer {
       uint64_t from;
       uint64_t to;
       uint64_t quantity;
    };

    /// The apply method implements the dispatch of events to this contract
    void apply( uint64_t code, uint64_t action ) {
       eosio::print( "Hello World: ", eosio::name(code), "->", eosio::name(action), "\n" );
       if( action == N(transfer) ) {
            eosio::print( "Hello World: ", eosio::name(code), "->", eosio::name(action), "\n" );
       if( action == N(transfer) ) {
          auto message = eosio::current_message<transfer>();
          eosio::require_auth( message.from );
          eosio::print( "Transfer ", message.quantity, " from ", message.from, " to ", message.to, "\n" );
       }
    }

} // extern "C"

然后重新编译和部署:

eoscpp -o hello.wast hello.cpp 
eosc -H testnet1.eos.io -p 80 set contract ayana1joe hello.wast hello.abi

这里发现,EOS中的智能合约是支持重新部署的,这是和以太坊不一样的。以太坊,一旦部署,就不可修改,有bug的话只能废弃掉。而EOS支持改下代码,重新编译,重新部署,替换掉有问题的代码。这种机制好不好呢? 暂不讨论,毕竟“一旦部署就不可修改” 是当初ICO浪潮中经常被拿出来“讲道理”的一个特点。现在却完全被废弃了。

接下来调用下新部署的hello合约,

$ eosc push action ayana1joe transfer '{"from":"ayana1joe","to":"joeswallet","quantity":50}' --scope ayana1joe
{
  "transaction_id": "a777539b7d5f752fb40e6f2d019b65b5401be8bf91c8036440661506875ba1c0",
  "processed": {
    "ref_block_num": 20,
    "ref_block_prefix": 463381070,
    "expiration": "2017-09-14T01:05:49",
    "scope": [
      "ayana1joe"
    ],
    "signatures": [],
    "messages": [{
        "code": "ayana1joe",
        "type": "transfer",
        "authorization": [],
        "data": {
          "from": "ayana1joe",
          "to": "joeswallet",
          "quantity": 50
        },
        "hex_data": "00000079b822651d000000008040934b3200000000000000"
      }
    ],
    "output": [{
        "notify": [],
        "deferred_transactions": []
      }
    ]
  }
}

后台可以看到以下输出:

Hello World: ayana1joe->transfer
Transfer 50 from currency to joeswallet

这次调用,传入的是一个“结构体”, 也就是:


'{"from":"ayana1joe","to":"joeswallet","quantity":50}'

这是代码中定义的结构体的json格式。

所以可以理解为什么说 “每个账户都可以将结构化的操作发送给其他账户” 了,其实就是传入一段合约中定义好的数据类型。apply函数中,根据参数action名称进行分发,用不同的逻辑代码处理接收到的数据。

总结下,EOS智能合约的几个点:

  1. EOS智能合约是和账户绑定的,每个账户可以定义一份智能合约。创建合约的账户拥有对该合约的归属权。需要权限的地方可以使用:eosio::require_auth( message.from ); 来判断。
  2. 智能合约支持修改并重新部署
  3. 调用智能合约的方式,可以理解为,向一个账户发送消息。账户收到之后,根据其自定义的脚本进行处理。

DPOS

共识算法可以说是区块链的灵魂,它决定了区块链是否安全,是否公正,是否效率。
EOS采用了DPOS (Delegate Proof of Stake)

关于DPOS,EOS白皮书里一笑而过,没提到很多,有兴趣的可以看下这篇官文补充:
https://steemit.com/dpos/@dantheman/dpos-consensus-algorithm-this-missing-white-paper
或者译文:
http://me.tryblockchain.org/blockchain-dpos-bm-eos.html

常见共识算法:

PoW(Proof Of Work)

优点:简单,安全
缺点:浪费资源。算力集中导致过于中心化。
代表:比特币、以太坊(以太坊将在今年或明年改为新的共识算法Casper

PoS(Proof of Stake)

优点:节约电能,不需要消耗大量的算力。
缺点:规模和安全性不足。

DPoS(Delegate Proof of Stake) PoS的改进版

优点:节约电能,满足规模要求。
缺点:安全性不足。
代表:Steemit , BitShare , EOS

简单说说区块链1~4,

区块链1.0: 以比特币为首的区块链项目,实现了分布式账本、去除了第三方
开创了区块链先河。但是转账速度缓慢、交易手续费高、功能单一。

区块链2.0: 以太坊为首的区块链2.0项目,除了实现了比特币货币功能之外。还引入了智能合约,为世人打开了Dapp世界的大门。但是随着使用人数的增多。生态系统的日益臃肿,以太坊的问题也越来越明显。落后的共识算法Pow,拥堵的网络。缓慢的交易确认和相对封闭的生态系统。

区块链3.0: 以EOS为首的区块链项目3.0提供了更优化的共识算法DPos,更好的并发性,目标达到百万级/和对大规模商业应用更好的支持。尽管这些区块链3.0项目还未正式落地。

区块链4.0: 区块链3.0都还没落地呢 又来区块链4.0? 还真有这样一个项目,大家路过就了解一下 http://seele.pro/ , 元一,采用神经网络共识算法和异构森林网络的区块链。 逼格很高的概念,建议有兴趣自行到官网了解。

持续了一年的ICO,当前EOS无疑是值得期待的项目,是币王还是币妖,很快就能知道了。

总结

目前官方给出的智能合约开发资料还很少,Dapp开发示例则没有。EOS号称是以太坊杀手,未来的Dapp平台。离交卷还有两个多月。到底最终如何出招呢,让我们拭目以待。

想要在EOS DAWN3.0 测试网上线的第一时间,就对它进行测试和验证的,可以加我微信。 或telegram群 : https://t.me/joinchat/GgxZkQy_seHdGk5MP3-scg

测试内容:

  • 部署智能合约
  • 高频并发调用合约,简单测下TPS
  • 构建私服
  • 等等。。

qr.jpeg

Sort:  

Congratulations @jc1991! You received a personal award!

Happy Birthday! - You are on the Steem blockchain for 1 year!

You can view your badges on your Steem Board and compare to others on the Steem Ranking

Do not miss the last post from @steemitboard:

Are you a DrugWars early adopter? Benvenuto in famiglia!
Vote for @Steemitboard as a witness to get one more award and increased upvotes!

Coin Marketplace

STEEM 0.26
TRX 0.20
JST 0.038
BTC 95813.48
ETH 3663.41
USDT 1.00
SBD 3.83