您正在查看: Surou 发布的文章

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"

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

后台运行nodeos,避免ssh掉线

问题:

怎么后台运行 nodeos 呢,我用xshell 连接的,但是 xshell 总断,断的时候有时会引起 nodeos 退出

解决方案

需要的程序 Tmux

  1. 安装Tmux
    sudo apt-get update
    sudo apt-get install tmux
  2. 开始使用
    tmux
  3. 返回会话
    tmux a

多个会话

  1. 新建会话
    tmux new -s 会话名字
  2. 切换(查看)会话
    tmux a - t 会话名字
  3. 删除会话
    tmux kill-session -t first

    问题收集自 eosfans

EOS 块数据结构:块内通信和跨链

一、 块主要结构


block 是区块链中最重要的数据结构,EOS 在 block 结构中设计了 7 个参数,
下面我们将一一进行分析解释。

previous

previous 为指向前一个区块的 hash 值,EOS 采用的 hash 算法是 SHA。

timestamp

timestamp 为时间戳,该区块的生成时间。

transaction_merkle_root

transaction_merkle_root 为该区块内所有交易的 merkle 根,用于快速验证交
易的完整性。

producer

producer 为该区块的生成者。EOS 采用 DPOS 共识机制,预计每 3 秒生成一
个区块。任何时刻,只有一个生成者被授权生成区块。

producer_changes

EOS架构中区块的产生是以21个区块为一个周期,在每个出块周期开始前,
21 个区块生成者会被投票选出。producer_change 就记录了未来的 21 个出块者。

producer_signature

producer_signature 是该区块的生成者对该区块的签名。EOS 采用的是 ECDSA
签名算法,使用的椭圆曲线参数是 secp256k1。

cycles

EOS 设计的目标之一是使得两个账户(合约)能够在单个区块内来回交换消
息(交易),而不必在每个消息之间等待 3 秒。为了实现这一点,EOS 将块内的
消息分成了 cycle 来顺序处理。cycles 就是 cycle 的一个顺序向量,那么 A 发给 B
的消息在 cycles[1]中处理,B 返回的消息就可以在后续的 cycles[4]中进行处理。
区块生成器将不断把 cycle 添加到区块中,直到最长的区块时间间隔达到,或者
没有新的可传送交易生成。

二、 Cycles 主要结构

前面提到了 EOS 为了提升消息交互的效率,在 block 中设计了 cycle 结构来
实现了一条“小链”。而在 cycle 内部,EOS 设计了 threads 来实现消息、交易的
快速并行处理。

相比较 cryptonomex 中的设计,EOS 的这种设计将更好的支持高并发管理,
利于提升 EOS 的整体效率。

generated_input

generated_input 包含了一组 GeneratedTransaction 的 id,用于顺序查找和处
理 GeneratedTransaction。我们将在后面对 transaction 的类别进行详细的解释和
分析。这些 transaction 将被顺序处理。

user_input

user_input 包含了一组 ProcessedTransaction,这些是已经被处理过的交易。

thread

不同的 thread 将会根据主机的实际情况被并行处理。在同一个 cycle 内,当
两笔交易 A 和 B 同时涉及到同一个账户时,这两笔交易将会被放在同一个 thread
下进行处理。

三、 Transaction 结构

EOS 中主要使用三种 transaction 结构。其中 SignedTransaction 是由用户发出
的交易请求,ProcessedTransaction 是由区块生成者处理完用户发出的交易请求后
生成的交易实体,GeneratedTransaction 是由区块链生成的交易请求,特别的是由
智能合约生成的交易请求。

Transaction

Transaction 作为所有 transaction 的父类,包含了 5 个参数。refBlockNum 用
于指定之前的一个块,其中将包含一个由该交易签名者申明的已知状态申明,作
为该交易执行的上下文。refBlockNum 只使用 16 个 bit,所以只能回溯到两天前
的 65,536 个块。refBlockPrefix 就是被指定的块的 hash 的前 4 个字节(32 个比
特)。expiration 给出了交易的内存过期时间,这样将保证节点的内存不用保存过
多的交易。
scope 内将记载此次交易涉及到的账户信息。
messages 内将记载此次交易的实质内容,它可以包含多个消息。在设计上,
只有所有的消息都被接受了,整个交易才会被接受,任何一个消息被拒绝都会导
致此笔交易失败。这些消息将会在同一个线程里面顺序执行,因此将多个消息放
到一笔交易里面在性能上并不理想(比如同时给两个人转账)。而且 EOS 会根据
交易涉及到的用户数量数来收取手续费,因此涉及到多个账户的交易的时候,最
好采用原子交易来进行(每笔交易只包含一个接收账户)。

SignedTransaction

SignedTransaction 比 Transaction 多了一个参数 signatures,将用于保存用户
对该交易涉及的所有签名,每一个 message 至少对应一个 signature。
ProcessedTransaction
ProcessedTransaction 比 SignedTransaction 又多了一个参数 output,用于记录
对用户发出的 SignedTransaction 进行处理后的输出。特别的,这个输出包含一条
或多条交易信息 GeneratedTransaction。

GeneratedTransaction

GeneratedTransaction 是由区块链生成的交易,比如智能合约。它 比
Transaction 多了一个参数 id,用于方便查找到该交易。

值得注意的是,因为这个交易是由区块链(智能合约)产生的,它可以用于
EOS 上不同应用间的通信。但又是因为它由区块链(智能合约)产生,因此它并
不含有签名,所以它的验证必须要连同触发产生该交易的智能合约的交易一同被
验证。
例如,当多家大宗交易所、普通用户向 OraleChain(智能合约)提交了目前
的猪肉价格(以 SignedTransaction 形式)后,OraleChain 根据自己的 PoRD 机制
计算得到一个可信猪肉价格, 然 后 连同所有搜集到的价格 生成一个
GeneratedTransaction ,作为最后一个提交价格 的交易的处理结果
ProcessedTransaction 的输出信息,发送给另一个智能合约 AgriculturalInsurance,
AgriculturalInsurance 就可以根据这个可信猪肉价格进行保险赔偿等智能操作。
正是这样的巧妙设计,实现了 EOS 上不同的智能合约间的通信,也就是我们
常说的跨链,这将极大的丰富 EOS 的生态圈,为开发者开发更丰富的应用提供了
可能。

四、 Message 结构


Message 用于记录交易的主要内容,包含了 4 个参数。
code
code 指向了执行这个消息的智能合约。比如“eos”是指 EOS 自身自带的智
能合约,在前面系列指南里进行 eos 转账的操作,出发的就是这个合约。
type
type 指向需要执行的智能合约里的方法,比如“eos”里面的转账操作
“transfer”。
authorization
authorization 记录了处理该消息所需要的权限。EOS 里面目前设计了三种权
限:owner、active 和 recovery。owner 权限可以做所有事情,active 权限可以做
出了更改所有者之外的所有操作。recovery 可用于 EOS 用户在密钥被盗时恢复其
账户控制。
data
data 里面则存储了这个消息的其他参数。

五、 MessageOutput 结构


当智能合约处理一笔 SignedTransaction 时,有可能会生成一笔新的交易
GeneratedTransaction,它将被存储 MessageOutput 结构体中。
MessageOutput 包含了被通知对象集合 notify,在完成通知以后被应用了的
ProcessedTransaction 集合 sync_transactions,以及由智能合约生成的不带签名的
交易 GeneratedTransaction 集合 async_transactions。
通知对象集合结构 NotifyOutput 里面包含了被通知的对象 name 和一个输出
消息 MessageOutput。这和前面形成了一个嵌套关系,因为被通知的对象(合约)
还有可能生成新的交易,如此递归下去。
由于 EOS 代码中对 MessageOutput 和 NotifyOutput 的处理还没有完全完成,
我们会在后面的系列文章中做更详细的解释和分析。

六、 总结

EOS 在块内设计了 cycle 结构,实现了块内的通信,这样账户(合约)之间
的通信将变得更加快捷。
在设计上,EOS 是模块化的,每个人不应该运行所有的东西,因此不能假定
另一个账户(合约)的状态在同一台机器上是可访问的,这就意味着如果允许一
个合约同步调用另一个合约,但如果这个合约不在内存中,系统将会崩溃。因此,
EOS 要求所有账户间的通信都必须通过区块链上的交易进行传递。
为了实现跨链机制,EOS 特别设计了不带签名即可完成验证的交易机制,这
种验证是通过状态信任链来完成的:第一个带签名的交易触发合约产生了第二个
不带签名的交易,该交易又顺序产生了第三个不带签名的交易,依次下去,最后
所有的交易的验证都依赖于第一个交易的签名,和每一次合约执行后的状态。
从对 EOS 块数据的分析,我们可以看到 EOS 在设计上就已经考虑了高速、
融汇、跨链等区块链未来的发展方向,我们有理由相信 EOS 代表了区块链的一种
新的未来。
转载自oraclechain

ubuntu npm 升级到新版

sudo apt-get remove nodejs ^node-* nodejs-*
sudo apt-get autoremove
sudo apt-get clean
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install nodejs

print_floats.cpp:**undefined reference to `boost::program_options

编译EOS时出现以下错误

Scanning dependencies of target print_floats
......
[ 76%] Linking CXX executable print_floats
CMakeFiles/print_floats.dir/print_floats.cpp.o: In function `boost::program_options::typed_value<unsigned int, char>::name[abi:cxx11]() const':
print_floats.cpp: **undefined reference to `boost::program_options::arg[abi:cxx11]'**
......
print_floats.cpp:**undefined reference to `boost::program_options::validation_error::get_template[abi:cxx11]**(boost::program_options::validation_error::kind_t)'
print_floats.cpp:**undefined reference to `boost::program_options::options_description::m_default_line_length'**
print_floats.cpp:**undefined reference to `boost::program_options::options_description::options_description(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int, unsigned int)'**
print_floats.cpp:**undefined reference to `boost::program_options::options_description::add_options()'**
print_floats.cpp:**undefined reference to `boost::program_options::options_description_easy_init::operator()(char const*, char const*)'**
print_floats.cpp:**undefined reference to `boost::program_options::options_description_easy_init::operator()(char const*, boost::program_options::value_semantic const*, char const*)'**
......
collect2: error: ld returned 1 exit status
make[2]: *** [tools/print_floats] Error 1
make[1]: *** [tools/CMakeFiles/print_floats.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
[ 76%] Building CXX object libraries/fc/CMakeFiles/fc.dir/src/crypto/sha512.cpp.o
[ 76%] Building CXX object libraries/fc/CMakeFiles/fc.dir/src/crypto/dh.cpp.o
[ 76%] Building CXX object libraries/fc/CMakeFiles/fc.dir/src/crypto/blowfish.cpp.o

原因是之前手动安装过boost,但安装的不正确,或者文件缺失

解决方案,清理掉所有本地的boost文件,重新运行编译EOS,会自动下载依赖

cd ~/opt/
rm -rf boost*
cd eos_dir
rm -rf build

问题收集自 eosfans