BCSkill (Block chain skill ) 技术社区
社区QQ群:791420381
推荐论坛:https://eosfans.io
Telegram: https://t.me/bcskill

EOS error bad alloc

问题跟进中,等测试结束,会删除此提示

当在config.ini中开启 filter-on = * 并且激活 history_plugin插件时,运行一段时间后会出现以下错误

terminate called after throwing an instance of 'boost::interprocess::bad_alloc'
  what():  boost::interprocess::bad_alloc

或者

2018-08-09T07:21:22.037 thread-0   producer_plugin.cpp:331       on_incoming_block    ] Received block adaceec950230d1e... #10209388 @ 2018-08-09T07:19:23.500 signed by helloeoscnbp [trxs: 254, lib: 10209272, conf: 0, latency: 118537 ms]                                       
terminate called after throwing an instance of 'std::bad_alloc'                                                                           
terminate called recursively                                                                                                              
  what():  std::bad_alloc

原因是由于filter-on = *,共享内存映射文件已满。(github

解决方案是

  • 增加 chain-state-db-size-mb 来提高 shared_memory_size,确保您的硬件与您设置的较高值兼容。

还有种错误如下

1733735ms thread-0   controller.cpp:625            push_scheduled_trans ] 3050003 eosio_assert_message_exception: eosio_assert_message assertion failure
assertion failure with message: refund request not found
    {"s":"refund request not found"}
    thread-0  wasm_interface.cpp:930 eosio_assert
pending console output: 
    {"console":""}
    thread-0  apply_context.cpp:61 exec_one
1766924ms thread-0   controller.cpp:153            emit                 ] bad alloc

解决方案

  • 同步似乎已超过可逆块日志的默认大小,即340 MB。通过添加reversible-blocks-db-size-mb = 500 MB(或任何更大的数字)来增加其大小config.ini。(github

注意
您将需要重新同步所有块,因为错误的alloc通常会导致数据库损坏。

如果config.ini开启 filter-on = * ,那么它实际上需要无限量。如果您正在连接到主网并且没有使用任何额外的插件,那么64 GB今天可以使用,但不会长期工作。

Ubuntu16.04下修改MySQL数据的默认存储位置

1.关闭 mysql 服务

/etc/init.d/mysql stop

2.创建新的数据库路径:

mkdir -p /mnt/mysql

3.复制MySQL原有的数据

cp -R /var/lib/mysql/* /mnt/mysql

4.修改权限

chown -R mysql:mysql /mnt/mysql

5.修改配置文件夹

    vi /etc/mysql/mysql.conf.d/mysqld.cnf

    //将 [mysqld] 组下的 datadir改为:
    datadir = /mnt/mysql

6.修改启动文件

    vi /etc/apparmor.d/usr.sbin.mysqld 

    把  
    /var/lib/mysql r  
    /var/lib/mysql/** rwk  
    修改成  
    /mnt/mysql r  
    /mnt/mysql/** rwk,  

7.重启服务

/etc/init.d/apparmor restart
/etc/init.d/mysql restart

参考原文

actions 中带transaction的status

查询笔记,稍后问题完结后,会重新整理

App开发的小伙伴想有个接口,根据账户名查询交易记录,并且每条交易记录都带有status。

了解到完成上面的数据需要三步

  1. 根据账户名查询actions表,查询出一些记录
  2. 根据记录的transaction id,查询所在block (不用此步,action 中已有block id)
  3. 根据block id查询所在块的此transaction id的status
    • 查看测试数据:
      curl 'https://api1.eosdublin.io/v1/chain/get_block' -H 'Referer: https://eostracker.io/transactions/91206e95c247e76e924bf2b3a75b0e894347de138e3a5e7b0b011c6b3e6b268b' -H 'Origin: https://eostracker.io' -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36' -H 'Content-Type: text/plain;charset=UTF-8' --data-binary '{"block_num_or_id":4265926}' --compressed

获取的actions数据

看第一步的,获取的actions数据中,同一个transaction id(91206e95c247e76e924bf2b3a75b0e894347de138e3a5e7b0b011c6b3e6b268b),会有多笔的交易。

查transaction id

那我们查下此transaction id,什么情况。(点击打开)

看下几个数据的链接

https://eostracker.io/actions/4265926/91206e95c247e76e924bf2b3a75b0e894347de138e3a5e7b0b011c6b3e6b268b/0
https://eostracker.io/actions/4265926/91206e95c247e76e924bf2b3a75b0e894347de138e3a5e7b0b011c6b3e6b268b/1
https://eostracker.io/actions/4265926/91206e95c247e76e924bf2b3a75b0e894347de138e3a5e7b0b011c6b3e6b268b/0?parentId=4926446
https://eostracker.io/actions/4265926/91206e95c247e76e924bf2b3a75b0e894347de138e3a5e7b0b011c6b3e6b268b/1?parentId=4926446
https://eostracker.io/actions/4265926/91206e95c247e76e924bf2b3a75b0e894347de138e3a5e7b0b011c6b3e6b268b/2
https://eostracker.io/actions/4265926/91206e95c247e76e924bf2b3a75b0e894347de138e3a5e7b0b011c6b3e6b268b/0?parentId=4926449

明显的树形结构,


再看下具体的数据
https://api.eostracker.io/transactions/91206e95c247e76e924bf2b3a75b0e894347de138e3a5e7b0b011c6b3e6b268b/actions?page=1&size=10

得出,在相同的transaction id和blockId情况下,

  • seq和parentId都为0,此节点为顶级节点。
  • parentId为0,seq不为0,为二级顶节点。
  • parentId不为0,则为对应id二级节点的三级节点。

对于这些交易,App那边更期望,查询此transaction id后,界面显示此任务为顶级节点所做的事,查看详情后才显示二,三级数据。

首先查下status,有哪些类型
eos\libraries\chain\include\eosio\chain\block.hpp

struct transaction_receipt_header {
      enum status_enum {
         executed  = 0, ///< succeed, no error handler executed
         soft_fail = 1, ///< objectively failed (not executed), error handler executed
         hard_fail = 2, ///< objectively failed and error handler objectively failed thus no state change
         delayed   = 3, ///< transaction delayed/deferred/scheduled for future execution
         expired   = 4  ///< transaction expired and storage space refuned to user
      };

用VS Code和CLion进行EOS Dapp开发

每一个开发人员都需要一个良好的IDE,EOS开发也是一样,为项目开发过程构建一个良好的IDE环境是第一步。这就是为什么我们要写这个如何使用VS Code或者CLion进行EOS开发的快速教程的原因。

我们还为VS Code创建了一些脚本,这些脚本将你在终端中使用的一些命令自动化。

设置Visual Studio Code

首先,如果你还没有这些VS Code扩展的话,安装一下。对于EOS Dapp开发,它们将非常有帮助:

  • C/C++ - VS Code的智能感知、调试和代码浏览
  • CMake - Visual Studio Code的CMake语言支持
  • CMake Tools - Visual Studio Code扩展CMake支持
  • WebAssembly - 用于WebAssembly文本表示的语法高亮显示

当我们开发EOSIO dApps时,我们需要编写.hpp和.cpp文件中的代码。然而,这是整个过程中很小的一部分。大多数时候,我们需要生成一些其他文件,这些文件将用于在区块链上部署合约,进行单元测试等等。这就是CMake有用的地方。

CMake是用于控制软件编译过程的命令行工具。一旦它在你的IDE内正确设置的话,会使整个开发过程更加容易。

既然我们要使用CMake工具,我们应该对我们的项目结构做一些改变。我们将重用EOSIO项目的构架,因为它拥有我们所需要的一切。当然,我们有一些小的变化。

我们有一张图片,展示了新的项目结构。让我们看一看。

首先,我们有了build文件夹。这是放置所有构建内容的地方。你所使用的每一个生成文件都在那里。接下来是CMakeModules,它包含一些有用的Cmake模块,这些自定义模块用于编译过程。

contracts是我们的核心文件夹。这就是我们要放置智能合约的地方。目前,eosiolib, libc++和musl默认存在这里用于编译。紧接着是externals和libraries。两个文件夹都包含用于使整个编译过程更容易的库。

项目结构中最后一个重要的东西是配置文件CMakeLists.txt。每个目录都有自己的带有命令的CMakeLists.txt文件。

可以在我们的repo中找到所有的文件夹和脚本的新项目结构。

CMakeLists

让我们看一些配置文件,因为你需要知道如何使用它们。
1.CMakeLists.txt(4)

这是设置编译过程的主要配置文件。你应该知道,当你开发Dapp时,你需要设置项目名称。版本和语言是可选的。

    # Set the minimum required version of cmake for a project
    cmake_minimum_required(VERSION 3.5)

    # Set a name, version, and enable languages for the entire project.
    project( ProjectName )

    list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/libraries/fc/CMakeModules")
    list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules")

    # Load and run CMake code from a file or module.
    include( GNUInstallDirs )
    include( SetupTargetMacros )

    # Set a normal, cache, or environment variable to a given value
    set( CMAKE_CXX_STANDARD 14 )
    set( CMAKE_CXX_EXTENSIONS ON )
    set( CXX_STANDARD_REQUIRED ON)

    set( CLI_CLIENT_EXECUTABLE_NAME cleos )
    set( GUI_CLIENT_EXECUTABLE_NAME eosio )

    set(CMAKE_EXPORT_COMPILE_COMMANDS "ON")


    # add defaults for openssl
    if ("${OPENSSL_ROOT_DIR}" STREQUAL "")
       if (NOT "$ENV{OPENSSL_ROOT_DIR}" STREQUAL "")
          set(OPENSSL_ROOT_DIR $ENV{OPENSSL_ROOT_DIR})
          set(OPENSSL_INCLUDE_DIR ${OPENSSL_ROOT_DIR}/include)
       elseif (APPLE)
          set(OPENSSL_ROOT_DIR "/usr/local/opt/openssl")
          set(OPENSSL_INCLUDE_DIR "/usr/local/opt/openssl/include")
       elseif(UNIX AND NOT APPLE)
          set(OPENSSL_ROOT_DIR "/usr/include/openssl")
          set(OPENSSL_INCLUDE_DIR "/usr/include/openssl/include")
       else()
          message(FATAL_ERROR "openssl not found and don't know where to look, please specify OPENSSL_ROOT_DIR")
       endif()
    endif()

    if(UNIX)
      if(APPLE)
        set(whole_archive_flag "-force_load")
        set(no_whole_archive_flag "")
      else()
        set(whole_archive_flag "--whole-archive")
        set(no_whole_archive_flag "--no-whole-archive")
      endif()
    else()
      set(whole_archive_flag "--whole-archive")
      set(no_whole_archive_flag "--no-whole-archive")
    endif()

    SET( Boost_USE_STATIC_LIBS ON CACHE STRING "ON or OFF" )
    IF( WIN32 )
      SET(BOOST_ROOT $ENV{BOOST_ROOT})
      set(Boost_USE_MULTITHREADED ON)
      set(BOOST_ALL_DYN_LINK OFF) # force dynamic linking for all libraries
    ENDIF(WIN32)
    FIND_PACKAGE(Boost 1.66 REQUIRED COMPONENTS
        thread
        date_time
        filesystem
        system
        program_options
        signals
        serialization
        chrono
        unit_test_framework
        context
        locale
        iostreams)

    # Add a subdirectory to the build.
    add_subdirectory(externals)

    include(wasm)

    add_subdirectory(libraries)
    add_subdirectory(contracts)

2.CMakeLists.txt (3)
第二个配置文件在contracts文件夹内。每一个新的智能合约都应该作为这个配置中的子目录来添加。重要的是不要忘了这一步合约不会编译。CMake不知道。

    set(DEFAULT_SYSTEM_INCLUDE_FOLDERS ${CMAKE_SOURCE_DIR}/contracts/libc++/upstream/include ${CMAKE_SOURCE_DIR}/contracts/musl/upstream/include ${Boost_INCLUDE_DIR})
    set(STANDARD_INCLUDE_FOLDERS ${CMAKE_SOURCE_DIR}/contracts ${CMAKE_SOURCE_DIR}/externals/magic_get/include)

    add_subdirectory(eosiolib)
    add_subdirectory(musl)
    add_subdirectory(libc++)

    # Your contracts (add the name of the folder which contains you smart contract)
    add_subdirectory(Players)

3.CMakeLists.txt(2)

每个智能合约都有自己的配置文件。这里需要注意的是,每个合约都有不同的TARGET,大部分情况下,它就是文件夹的名称。

file(GLOB ABI_FILES "*.abi")
configure_file("${ABI_FILES}" "${CMAKE_CURRENT_BINARY_DIR}" COPYONLY)

# Change "Players" with the name of the folder containing your smart contracts
add_wast_executable(TARGET Players
  INCLUDE_FOLDERS "${STANDARD_INCLUDE_FOLDERS}"
  LIBRARIES libc libc++ eosiolib
  DESTINATION_FOLDER ${CMAKE_CURRENT_BINARY_DIR}
)

现在,当我们有了新的项目结构时,我们必须定制命令来编译和构建我们所做的每一件事。但是怎么开始呢?幸运的是,VS Code有一些很酷的东西叫做Tasks。它帮助我们自动化每个命令,只需点击几下。

VS Code的Tasks

首先,我们必须生成包含我们的自定义命令的tasks.json文件。按⇧+⌘+P打开VS代码中的command palette,然后键入““Tasks”并选择“Configure Task”。

然后下一步选择Create tasks.json file from template,然后Others:

VS code将创建一个名为“.vscode”的文件夹,在里面,你可以找到tasks.json。现在我们需要添加命令。复制并粘贴下面的代码到tasks.json:

{
    "version": "2.0.0",
    "reveal": "always",
    "options": {
        "cwd": "${workspaceRoot}"
    },
    "tasks": [
        {
            "label": "CMake",
            "type": "shell",
            "command": "sh ${workspaceRoot}/.vscode/scripts/compile.sh"
        },
        {
            "label": "Build",
            "type": "shell",
            "command": "sh ${workspaceRoot}/.vscode/scripts/build.sh"            
        },
        {
            "label": "Generate ABI",
            "type": "shell",
            "command": "sh ${workspaceRoot}/.vscode/scripts/generate.sh ${fileDirname} ${fileBasenameNoExtension}",
        }
    ]
}

我们已经创建了三个自定义命令,命名为CMake、Build和Generate ABI。它们执行三个shell脚本compile.sh,build.sh和generate.sh。前两个脚本基本上都是相同的,除了build.sh还进行了编译以外。可能大多数时候你会使用第二个。

compile.sh

# Create a build folder if it doesn't exist
mkdir -p build

# Change the current directory to "build"
cd build

# Create all the build files needed
cmake -G 'Unix Makefiles' -DCMAKE_BUILD_TYPE=Debug ..

build.sh

# Create a build folder if it doesn't exist
mkdir -p build

# Change the current directory to "build"
cd build

# Create all the build files needed
cmake -G 'Unix Makefiles' -DCMAKE_BUILD_TYPE=Debug ..

# Build
make

另一方面,使用第三个脚本generate.sh(生成智能合约ABI)。在生成过程中需要生成一些文件。必须在合约文件夹内执行命令。选择一个.cpp文件并运行它。

generate.sh

echo "Current working directory -" $1
cd $1

eosiocpp -g $2.abi $2.cpp

令人惊叹的!我们已经准备好了VS Code。为了使整个开发变得更容易,我们将为我们的命令创建快捷方式。当你仍然在VS代码中时,点击Preferences – Keyboard Shortcuts。快捷方式窗口找到并打开keybindings.json(它在顶部):

一旦keybindings.json打开,我们将创建快捷方式。对于我们的命令,我们选择了cmd+e、cmd+r和cmd+i,但是你可以选择其他。这是你必须添加的json:

一旦你已经完成了所有的设置,现在准备在VS Code上开发EOS DApps吧.

CLion 设置

与VS Code相比,设置CLion非常简单。当加载CLion中的架构时,IDE会自动在cmake-build-debug文件夹中创建所有生成文件。一旦准备就绪,就可以使用“⌘+F9”快捷方式执行实际构建。这就是你需要做的一切,太简单了吧?

但是,如果你想为CMake设置附加项,可以从Preferences – Build, Execution, Deployment中选择。

汇智网原创翻译,转载请标明出处。

EOS系统智能合约升级

用eosio.msig合约间接升级

Cleos目前提供工具来与osio.msig合约的交互,但它不提供一个方便的接口来实现自定义交易。
因此,目前很难提出一个具有多个动作的原生交易(例如eosio::setcode,然后再eosio::setabi)。
eosio.msig方法的优点在于,它使得协调变得更容易,并且不会对签名集合设置严格的时间限制(小于9小时)。
eosio.msig方法的缺点是要求发起者有足够的RAM来提交交易,而目前cleos又没有方便的工具来使用它,比如像原生系统升级所必需的定制交易。
所以目前,建议采用直接的方法升级系统合约。

直接升级(避免使用eosio.msig合约)

前21个区块生产者(超级节点)中的每一个都应该做以下工作:
1.获取当前系统合约以供以后比较(主哈希和ABI在主网区块链上会有所不同):

$ programs/cleos/cleos get code -c original_system_contract.wast -a original_system_contract.abi eosio
code hash: cc0ffc30150a07c487d8247a484ce1caf9c95779521d8c230040c2cb0e2a3a60
saving wast to original_system_contract.wast
saving abi to original_system_contract.abi

2.生成升级系统合约的未签名交易:

cleos set contract -s -j -d eosio contracts/eosio.system | tail -n +4 > upgrade_system_contract_trx.json

生成的文件的前几行应该类似于(除了expiration, ref_block_num和ref_block_prefix,应该不同外):

{
   "expiration": "2018-06-15T22:17:10",
   "ref_block_num": 4552,
   "ref_block_prefix": 511016679,
   "max_net_usage_words": 0,
   "max_cpu_usage_ms": 0,
   "delay_sec": 0,
   "context_free_actions": [],
   "actions": [{
      "account": "eosio",
      "name": "setcode",
      "authorization": [{
          "actor": "eosio",
          "permission": "active"
        }
      ],

最后几行应该是:

     }
   ],
   "transaction_extensions": [],
   "signatures": [],
   "context_free_data": []
}

应该选择一个超级节点来引导升级过程。这个超级节点应该使用他们生成的upgrade_system_contract_trx.json,将其重命名为upgrade_system_contract_official_trx.json,并执行以下操作:

  • 修改upgrade_system_contract_official_trx.json中的expiration时间戳到未来足够大的时间,以提供足够的时间来收集所有必要的签名,但不超过交易生成时间9小时。此外,请记住,如果不超过当前时间1小时,交易将不被接受到区块链中。
  • 将upgrade_system_contract_official_trx.json文件传递到所有其他21个超级节点。

然后,前21个超级节点中的每一个都应该做如下操作:

  • 将生成的upgrade_system_contract_official_trx.json文件与主网区块链提供的upgrade_system_contract_official_trx.json进行比较。唯一的区别应该是expiration,ref_block_num,ref_block_prefix,例如:
      $ diff upgrade_system_contract_official_trx.json upgrade_system_contract_trx.json
      2,4c2,4
      <   "expiration": "2018-06-15T22:17:10",
      <   "ref_block_num": 4552,
      <   "ref_block_prefix": 511016679,
      ---
      >   "expiration": "2018-06-15T21:20:39",
      >   "ref_block_num": 4972,
      >   "ref_block_prefix": 195390844,
  • 如果比较好,则每个区块生产者应该继续用必要的密钥来签署官方升级交易,以满足他们的active许可。如果区块生产者在其区块生成帐户的active许可中只有一个密钥(即“active密钥”),那么它们只需要使用该active密钥生成一个签名。此签名过程可以离线进行,以获得更好的安全性。

首先,区块生产者应收集所有必要的信息。假设生产者active密钥对是EOS5kBmh5kfo6c6pwB8j77vrznoAaygzoYvBsgLyMMmQ9B6j83i9c, 5JjpkhxAmEfynDgSn7gmEKEVcBqJTtu6HiQFf4AVgGv5A89LfG3。区块生产者需要它们的active私钥5JjpkhxAmEfynDgSn7gmEKEVcBqJTtu6HiQFf4AVgGv5A89LfG3(在这个例子中是这个值),upgrade_system_contract_official_trx.json和chain_id是d0242fb30b71b82df9966d10ff6d09e4f5eb6be7ba85fd78f796937f1959315e(在这个例子中是这个值),可以通过cleos get info获得相关信息。
然后,在一台安全的计算机上,生产者可以签署交易(超级节点将需要在粘贴他们的私人密钥时,进行提示):

cleos sign --chain-id d0242fb30b71b82df9966d10ff6d09e4f5eb6be7ba85fd78f796937f1959315e upgrade_system_contract_trx.json | tail -n 5
private key:   "signatures": [
    "SIG_K1_JzABB9gzDGwUHaRmox68UNcfxMVwMnEXqqS1MvtsyUX8KGTbsZ5aZQZjHD5vREQa5BkZ7ft8CceLBLAj8eZ5erZb9cHuy5"
  ],
  "context_free_data": []
}

确保使用chain_id将交易提交到实际主网区块链,而不是上面提供的示例的chain_id。
输出应该包括签名(在这种情况下)SIGIKK1JZABB9GZDGXHUMMOXQUVXQMVXQS1MVTYXUX8KGTBZZ55AZQZJHD5VRQA5BKZ7FT8CCELBAJA8EZ5ErZB99CUY5,然后超级节点应该发送给生产者。
当超级节点收集到15个生产者签名时,超级节点应做以下工作:

  • 复制upgrade_system_contract_official_trx.json,然后调用upgrade_system_contract_official_trx_signed.json,修改upgrade_system_contract_official_trx_signed.json,因此签名字段包括所有15个收集的签名。所以upgrade_system_contract_official_trx_signed.json尾部应该看起来像这样:
    $ cat upgrade_system_contract_official_trx_signed.json | tail -n 20
    "transaction_extensions": [],
    "signatures": [
     "SIG_K1_JzABB9gzDGwUHaRmox68UNcfxMVwMnEXqqS1MvtsyUX8KGTbsZ5aZQZjHD5vREQa5BkZ7ft8CceLBLAj8eZ5erZb9cHuy5",
     "SIG_K1_Kj7XJxnPQSxEXZhMA8uK3Q1zAxp7AExzsRd7Xaa7ywcE4iUrhbVA3B6GWre5Ctgikb4q4CeU6Bvv5qmh9uJjqKEbbjd3sX",
     "SIG_K1_KbE7qyz3A9LoQPYWzo4e6kg5ZVojQVAkDKuufUN2EwVUqtFhtjmGoC6QPQqLi8J7ftiysBp52wJBPjtNQUfZiGpGMsnZ1f",
     "SIG_K1_KdQsE7ahHA9swE9SDGg4oF6XahpgHmZfEgQAy9KPBLd9HuwrF6c8m6jz43zizK2oo32Ejg1DYuMfoEvJgVfXo81jsqTHvA",
     "SIG_K1_K6228Hi2z1WabgVdf5bk2UdKyyDSVFwkMaagTn9oLVDV8rCX7aQcjY94c39ah2CkLTsTEqzTPAYknJ8m2m9B7npPkHaFzc",
     "SIG_K1_Jzdx75hBCA2WSaXgrupmrNbcQocUCsP8r1BKkPXMreiAKPZDwX9J3G8fS1HhyqWjc7FbukwZf8sVRdS3wKbJVpytqXe7Nn",
     "SIG_K1_KW7Qu2SdPD3zuQKh2ziFLzn9QbKqeMpeiemULky5Bbg1Mst6ijbCX3k2AVFGNFLkNLA36PM1WAT5oipzu1B1K7ymRxTx1Z",
     "SIG_K1_KXJf1KZNpz73YFKKE7u6jFgsQ8XcX3yA7rDX6ZmG1Qfnc9FLLmT1WViv4bwcPbxaEYfR6SNWfk5cCR9eao2si1soqkXq92",
     "SIG_K1_JynjkHFT5UFGDpEcqdriXTzCGCwS36Xztq4UAWQHLQgRUZT2YFoLhUcc87kvUteqCUGVxsmSbfgWv1KLy24voKN4Qs5zTe",
     "SIG_K1_JxhfCaGBhuNShpDHn7j1CryG3iSebvfi7FUnJsfkXNTiwLyq2NDBkeakwjCMWFbzr6qqWuMDLjfXbzdtU17f1wCXMjKSgk",
     "SIG_K1_KcMSz89QG1ZRFNrXc69R63d5KXbJA8CBjNPYv1VEA3TRfjqVYuhyaHpGXQN4RSKDq4ygr3UTRYBQQVutkJnR6zZ4Ssgd7R",
     "SIG_K1_JuxT6bhUAbDs6Q2ppuKyKauduvbaJLxvh4gBH4e4A9yRhvUBT7w3DcvMyhdaor27Kbu29jnqhTbvXcb57QqKWQDpboLv7e",
     "SIG_K1_K8BuFYpCiC5FhpVK8ZAzc3VUg7vz6WwLoWBrGN6nnuqUjngGqvHp3UxDVzcwhqccHdv8kdPXvF6G1NszwF1dd3wjCrHBYw",
     "SIG_K1_KfH5ZirPwDk1RQKvJv2AGPfsJyPXvXLegZ7LvcPmRtjtMiErs1STXLNT8kiBfhZr4xkWRA5NR1kMF3d49DFMJiB2iWMXJc",
     "SIG_K1_KjJB8jtcqpVe3r5jouFiAa9wJeYqoLMh5xrUV6kBF6UWfbYjimMWBJWz2ZPomGDsk7JtdUESVrYj1AhYbdp3X48KLm5Cev"
    ],
    "context_free_data": []
    }
  • 提交签名交易到区块链
    cleos push transaction upgrade_system_contract_official_trx_signed.json
    {
    "transaction_id": "202888b32e7a0f9de1b8483befac8118188c786380f6e62ced445f93fb2b1041",
    "processed": {
      "id": "202888b32e7a0f9de1b8483befac8118188c786380f6e62ced445f93fb2b1041",
      "receipt": {
        "status": "executed",
        "cpu_usage_us": 4909,
        "net_usage_words": 15124
      },
      "elapsed": 4909,
      "net_usage": 120992,
      "scheduled": false,
      "action_traces": [{
    ...

如果你得到下面的错误提示信息:

Error 3090003: provided keys, permissions, and delays do not satisfy declared authorizations
Ensure that you have the related private keys inside your wallet and your wallet is unlocked.

这意味着所提供的签名中至少有一个是不对的。这可能是因为生产者签署了错误的交易,使用了错误的私钥,或者使用了错误的chainid。
如果得到如下错误消息:

Error 3090002: irrelevant signature included
Please remove the unnecessary signature from your transaction!

这意味着不必要的签名包括在内。如果有21个active生产者,则只需要来自这21个active生产者的15个签名。
如果得到如下错误消息:

Error 3040006: Transaction Expiration Too Far
Please decrease the expiration time of your transaction!

这意味着在提交的截止时间超过当前时间1小时,你需要等待一段时间才能被允许提交交易。
如果得到如下错误消息:

Error 3040005: Expired Transaction
Please increase the expiration time of your transaction!

这意味着已签署的交易的截止时间已经过去,整个过程必须从步骤1重新启动,再来一遍(汗汗汗):
假设交易成功执行,那么每个人都可以验证新智能合约是否已就位:

    cleos get code -c new_system_contract.wast -a new_system_contract.abi eosio
    code hash: 9fd195bc5a26d3cd82ae76b70bb71d8ce83dcfeb0e5e27e4e740998fdb7b98f8
    saving wast to new_system_contract.wast
    saving abi to new_system_contract.abi
    $ diff original_system_contract.abi new_system_contract.abi
    584,592d583
    <         },{
    <           "name": "deferred_trx_id",
    <           "type": "uint32"
    <         },{
    <           "name": "last_unstake_time",
    <           "type": "time_point_sec"
    <         },{
    <           "name": "unstaking",
    <           "type": "asset"

汇智网原创翻译,转载请标明出处。原文