EOS源码分析(3)案例分析

EOS 项目在建构了一套去中心化的可信网络的同时,提供的最重要的功能就是智能化合约,智能合约能够使用一种透明的方式来转移和交换资金或财产,而不需要通过中间人,接下来我们就一起通过一个案例分析下如何在EOS上建立智能合约。

attachments-2018-03-9MDlTgOS5aa74ab46b850.png

作者:尹成

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


EOS 项目在建构了一套去中心化的可信网络的同时,提供的最重要的功能就是智能化合约,智能合约能够使用一种透明的方式来转移和交换资金或财产,而不需要通过中间人,接下来我们就一起通过一个案例分析下如何在EOS上建立智能合约。

## 运行EOS节点

智能合约是在EOS节点中运行的,因此要首先把EOS节点运行起来,在这里,我们运行一个本地节点,命令如下:

```

cd path-to-eos/build/programs/eosiod/

./eosd

```

## 创建默认钱包

- 创建钱包

由于智能合约是与账号相关联的,因此在创建智能合约前,我们首先要创建账号,而账号的Key需要通过钱包来创建和保存,因此需要先创建钱包,如下:

    ```

    cd path-to-eos/build/programs/eosioc/

    ./eosioc wallet create # Outputs a password that you need to save to be able to lock/unlock the wallet

    ```

上面的命令会创建一个名称为default 的默认钱包,在创建钱包时,你也可以指定名称。钱包对应的密码需要保存,后续操作钱包状态的时候需要使用。

- 导入测试账号的Private key

钱包创建好之后,还不能直接创建账号,每个账号的创建需要一个Creator账号,在这里,我们使用`genesis.json`中的 `inita`账号作为Creator账号。作为Creator的账号,必须要把它的`Private key`导入到钱包中,否则在创建其他账号时,会提示权限不够,命令如下:

    ```

    ./eosioc wallet import 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3

    ```

## 创建账号

### 创建账号所需的key

每个账号的创建都需要`owner_key` 和`active_key` 两个key,我们通过以下命令创建key:

    ```

    cd path-to-eos/build/programs/eosioc/

    ./eosioc create key # owner_key

    ./eosioc create key # active_key

    ```


    以上命令会分别输出两组 `private key` 和 `public key`,如下:


    ```

    Private key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Public key: EOSXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    ```

    **千万保存好以上的key,后续需要使用**。

### 创建账号

创建账号的所有准备都已经齐备,现在可以开始创建账号了,账号创建的命令如下:

    ```

    ./eosioc create account inita currency PUBLIC_KEY_1 PUBLIC_KEY_2

    ```

在以上命令中,创建的当前账号名称为`currency`,创建当前账号的`Creator` 账号指定为 `inita`, 最后的两个`public key` 分别对应`currency`账号的 `owner_key`和`active_key`。当账号创建成功后,你将得到一个附带 `transaction ID`的 `JSON`反馈。

如果你之前没有导入过`inita`账号的`private key`,则会出现如下错误提示:

/Screen Shot 2018-02-21 at 10.36.38 PM.png


这主要是因为以上这条命令必须要有`inita`的`active`权限才能执行,如果没有导入私钥,则权限不够,从而会给出以上错误提示。


你也可以通过查询此账户的信息来确认账号是否创建成功:


```

./eosioc get account currency

```

以上命令将会返回如下结果:

```

{

"account_name": "currency",

"eos_balance": "0.0000 EOS",

"staked_balance": "0.0001 EOS",

"unstaking_balance": "0.0000 EOS",

"last_unstaking_time": "2035-10-29T06:32:22",

...

```

`currency`账号已经创建成功,但你目前还不能使用此账号进行智能合约等操作,因为系统中目前只有此账号的`public key`,而进行交易和智能合约等操作需要用到此账号的`active`权限,因此,我们需要把此账号对应的`active private key`导入到系统中,如下:

```

./eosioc wallet import XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

```

请使用你之前创建的`active private key` 替代以上命令中的 `xxx` 字符串。

## 部署智能合约

### 准备工作

在上传以前,首先确认`currency`账号下是没有智能合约的

```

./eosioc get code currency

code hash: 0000000000000000000000000000000000000000000000000000000000000000

```

### 部署智能合约

上传智能合约到currency 账号,此处的智能合约是EOS系统自带的测试合约

```

./eosioc set contract currency ../../contracts/currency/currency.wast ../../contracts/currency/currency.abi

```

当你得到一个带有`transaction_id`字段的JSON反馈后,说明智能合约已经上传成功。你还可以通过以下命令来验证合约是否上传成功。

```

./eosioc get code currency

```

以上命令应该会返回这样的结果:

```

code hash: 9b9db1a7940503a88535517049e64467a6e8f4e9e03af15e9968ec89dd794975

```

### 发行货币

在使用`currency`智能合约以前,你首先要发行货币,以下命令将向`currency`中发行10,000,000 的货币

```

./eosioc push action currency issue '{"to":"currency","quantity":"1000.0000 CUR"}' --permission currency@active

```

通过以下命令可以验证 currency 账号中目前确实已经有 10,000,000 的余额了

```

./eosioc get table currency currency account

{

"rows": [{

"currency": 1381319428,

"balance": 10000000

}

],

"more": false

}

```

### 转账

任何账号都可以在任何时间向任何智能合约发送消息,但如果权限不够的话,智能合约会拒绝消息的执行。更加准确的来说,消息并不一定是从某个账号发出来的,只要这条消息所关联的账号和权限等级是满足的,这条消息就能被执行。以下命令展示了如何向`currency`账号发送`transfer`消息,在这条命令中,需要从`currency`账号转账到其他账号,因此,需要`currency`账号权限才能完成此操作,具体命令如下:

```

./eosioc push action currency transfer '{"from":"currency","to":"inita","quantity":"20.0000 CUR","memo":"my first transfer"}' --permission currency@active

```

上面这条命令中,出现了三次`currency`, 第一次出现表示的是智能合约`currency`,第二次出现表示的转账账号`currency`,第三次出现则表示`currency`账号的权限; 如果我们换一个其他转出账号,则比较通用的命令格式应该如下:

```

./eosioc push action currency transfer '{"from":"${usera}","to":"${userb}","quantity":"20.0000 CUR","memo":""}' --permission ${usera}@active

```

以上命令是从usera 向userb转账,因此权限上面需要使用usera 的权限。此命令中`currency`只出现了一次,在这里表示智能合约的名称。


文章发布只为分享区块链技术内容,版权归原作者所有,观点仅代表作者本人,绝不代表区块链兄弟赞同其观点或证实其描述。

attachments-2018-02-kL1zBfXx5a7ffd0b78798.jpg

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论

作家榜 »

  1. 社区运营-小以 311 文章
  2. 社区运营-小链 214 文章
  3. 于中阳Mercina-zy 68 文章
  4. 涂晶 68 文章
  5. 吴寿鹤 36 文章
  6. 兄弟连区块链大牛 31 文章
  7. 李晓琼 30 文章
  8. John-smith 21 文章