EOS智能合约开发与交互

本文详细介绍了EOS智能合约的开发流程,包括启动节点服务、初始化钱包和账户,以及逐步构建和部署计数器合约,展示了如何实现计数状态的持久化和账户隔离。通过实际操作示例,读者可以深入理解EOS智能合约的交互机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

EOS智能合约的开发、编译、部署与交互。

## 运行示例代码

### 1、启动节点服务

在1#终端启动nodeos,建议先清除历史数据:

```
~$ rm -rf ~/.local/share/eosio/nodeos/data
~$ nodeos
```

在2#终端启动keosd:

```
~$ keosd
```

### 2、初始化钱包和账户

进入3#终端,执行以下脚本初始化默认钱包,并创建三个账户:

```
~$ init-wallet.sh
~$ new-account.sh sodfans
~$ new-account.sh jack
~$ new-account.sh pony
```

### 3、基本计数器合约

在3#终端进入~/repo/chapter4目录,执行以下脚本构建并部署合约:

```
~$ cd ~/repo/chapter4
~/repo/chapter4$ build-contract.sh counter.cpp
~/repo/chapter4$ deploy-contract.sh sodfans build/counter
```

使用cleos与计数器合约交互:

```
~/repo/chapter4$ cleos push action sodfans increase '[]' -p sodfans
```

### 4、识别交易执行者

执行以下脚本构建并部署合约:

```
~/repo/chapter4$ build-contract.sh counter-with-id.cpp
~/repo/chapter4$ deploy-contract.sh sodfans build/counter-with-id
```

使用cleos与计数器合约交互:

```
~/repo/chapter4$ cleos push action sodfans increase '["sodfans"]' -p sodfans
```

### 5、计数状态持久化

执行以下脚本构建并部署合约:

```
~/repo/chapter4$ build-contract.sh counter-with-table.cpp
~/repo/chapter4$ deploy-contract.sh sodfans build/counter-with-table
```

使用cleos与计数器合约交互:

```
~/repo/chapter4$ cleos push action sodfans increase '["sodfans"]' -p sodfans
```

### 6、使用scope隔离不同账户的状态

执行以下脚本构建并部署合约:

```
~$ cd ~/repo/chapter4
~/repo/chapter4$ build-contract.sh counter-with-scope.cpp
~/repo/chapter4$ deploy-contract.sh sodfans build/counter-with-scope
```

使用cleos与计数器合约交互:

```
~/repo/chapter4$ cleos push action sodfans increase '["jack"]' -p jack
~/repo/chapter4$ cleos push action sodfans increase '["pony"]' -p pony
```

## 文件目录组织 

- counter.cpp:基本计数器合约,无持久化状态

#include <eosiolib/eosio.hpp>

class counter_contract:eosio::contract{
  public:
    counter_contract(account_name self):eosio::contract(self){}
    void increase(){
      eosio::print("INCREASE => ",value++);
    }
    void decrease(){
      eosio::print("DECREASE => ",value--);
    }
  private:
    uint64_t value;
};

EOSIO_ABI(counter_contract,(increase)(decrease))


- counter-with-id.cpp:检测交易执行账户的计数器合约

#include <eosiolib/eosio.hpp>

class counter_contract:eosio::contract{
  public:
    counter_contract(account_name self):eosio::contract(self){}
    void increase(account_name actor){
      eosio::require_auth(actor);
      eosio::print(eosio::name{actor} , " INCREASE => ",value++);
    }
    void decrease(account_name actor){
      eosio::print(eosio::name{actor} , " DECREASE => ",value--);
    }
  private:
    uint64_t value;
};

EOSIO_ABI(counter_contract,(increase)(decrease))


- counter-with-table.cpp:具有持久化状态的计数器合约

#include <eosiolib/eosio.hpp>

//@abi table
struct counter{
  uint64_t actor;
  uint64_t value;
  uint64_t primary_key() const { return actor; }
};
typedef eosio::multi_index<N(counter),counter> counter_table;

class counter_contract:eosio::contract{
  public:
    counter_contract(account_name self):eosio::contract(self){}
    void increase(account_name actor){
      eosio::require_auth(actor);
      value = get_value(actor);
      eosio::print(eosio::name{actor} , " INCREASE => ",value++);
      update_value(actor,value);
    }
    void decrease(account_name actor){
      eosio::print(eosio::name{actor} , " DECREASE => ",value--);
    }
  private:
    uint64_t value;
  
  	uint64_t get_value(account_name actor){
      counter_table c(_self,_self);
      auto iter = c.find(actor);

      if(iter != c.end()) return iter->value;
      
      c.emplace(actor,[&](auto& record){
        record.actor = actor;
        record.value = 0;
      });
      
      return 0;      
    }
    
    void update_value(account_name actor,uint64_t value){
      counter_table c(_self,_self);
      auto iter = c.find(actor);
      c.modify(iter,actor,[&](auto& record){
        record.value = value;
      });
    }
};

EOSIO_ABI(counter_contract,(increase)(decrease))


- counter-with-scope.cpp:使用数据域隔离不同账户状态的计数器合约

#include <eosiolib/eosio.hpp>

//@abi table
struct counter{
  uint64_t actor;
  uint64_t value;
  uint64_t primary_key() const { return actor; }
};
typedef eosio::multi_index<N(counter),counter> counter_table;

class counter_contract:eosio::contract{
  public:
    counter_contract(account_name self):eosio::contract(self){}
    void increase(account_name actor){
      eosio::require_auth(actor);
      value = get_value(actor);
      eosio::print(eosio::name{actor} , " INCREASE => ",value++);
      update_value(actor,value);
    }
    void decrease(account_name actor){
      eosio::print(eosio::name{actor} , " DECREASE => ",value--);
    }
  private:
    uint64_t value;
  
  	uint64_t get_value(account_name actor){
      counter_table c(_self,actor);
      auto iter = c.find(actor);

      if(iter != c.end()) return iter->value;
      
      c.emplace(actor,[&](auto& record){
        record.actor = actor;
        record.value = 0;
      });
      
      return 0;      
    }
    
    void update_value(account_name actor,uint64_t value){
      counter_table c(_self,actor);
      auto iter = c.find(actor);
      c.modify(iter,actor,[&](auto& record){
        record.value = value;
      });
    }
};

EOSIO_ABI(counter_contract,(increase)(decrease))

1、玩过EOS的都知道,EOS本身更新迭代非常之快,所以有些知识点可能最新版有所出入,希望小伙伴理解!此文档适用于EOS-v1.0.5以上版本和v1.1.x版本,目前的v1.2.x可能会有极少部分出入,比如eosiocpp工具看更新说明再不用安装的状态下就能使用,目前还未测试。有兴趣的小伙伴可以留言交流。 2、当前文档目录结构介绍: #思考研究问题 1、如何保证EOS中发布的智能合约不被随意篡改? #玩转EOS智能合约代码 #玩转客户端cleos 1、先玩转智能合约相关的操作 #使用eosiocpp工具编译智能合约生成abi文件和wast文件 #编译合约(无法通过) #安装build/programs下工具 #重新编译合约 #部署合约到账户 #购买RAM #测试调用部署的合约 #更新\升级已经部署过的智能合约(相对空的合约) #更新添加新的函数接口(action)合约 #有关require_auth的合约测试 2、玩转智能合约数据库相关操作 #参考资料 #持久化API (Multi-Index) 1、一般来讲,对数据库的操作无外乎增删改查 2、表结构示例详解 3、Multi_index定义,建立数据表 4、实例化multi_index 5、操作数据,增删改查 #玩转table表 1、Table表producers 2、Table表global 3、Table表voters 4、Table表rammarket (获取RAM实时价格) 5、Table表refunds (查看账户退款信息) 6、Table表namebids (罗列参竞拍的账户信息) 3、启动nodeos节点出现脏数据 4、查看账户抵押资产,抵押token,赎回token #查看账户余额(可用余额) #查看SYS货币信息,eosio.token是经营货币的合约 #查看公钥对应账户 #查看子账户(控制账户) #查看账户信息 #查看账户抵押信息 #钱不够那就转账,随便耍 #get transaction无结果了解一下 #卖出RAM(卖给系统账户eosio.ram),字节bytes #抵押token获取CPU和net资源 #赎回抵押token,默认三天后到账,执行后可查看账户状态
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-每天进步一点点-

你的鼓励是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值