一 运行eos客户端,启动私有网络
./nodeos -e -p eosio --plugin eosio::wallet_api_plugin --plugin eosio::chain_api_plugin --plugin eosio::account_history_api_plugin
eosio generated block bcc817bc... #637 @ 2018-05-10T09:22:13.000 with 0 trxs, lib: 636
eosio generated block 527d07ae... #638 @ 2018-05-10T09:22:13.500 with 0 trxs, lib: 637
二 创建合约代码
mkdir hello
cd hello
vim hello.cpp
输入合约内容,并保存
#include <eosiolib/eosio.hpp>
#include <eosiolib/print.hpp>
using namespace eosio;
class hello : public eosio::contract {
public:
using contract::contract;
/// @abi action
void hi( account_name user ) {
print( "Hello, ", name{user} );
}
};
EOSIO_ABI( hello, (hi) )
三 编译生成wast文件
eosiocpp -o hello.wast hello.cpp
In file included from hello.cpp:1:
In file included from /usr/local/include/eosiolib/eosio.hpp:7:
In file included from /usr/local/include/eosiolib/action.hpp:7:
In file included from /usr/local/include/eosiolib/datastream.hpp:9:
In file included from /home/li/opt/boost_1_66_0/include/boost/container/flat_map.hpp:26:
In file included from /home/li/opt/boost_1_66_0/include/boost/container/new_allocator.hpp:24:
/home/li/opt/boost_1_66_0/include/boost/container/throw_exception.hpp:56:21: warning:
address of array 'msg' will always evaluate to 'true'
[-Wpointer-bool-conversion]
BOOST_ASSERT(!msg);
~^~~
/home/li/opt/boost_1_66_0/include/boost/assert.hpp:60:36: note: expanded from
macro 'BOOST_ASSERT'
# define BOOST_ASSERT(expr) assert(expr)
^~~~
/usr/local/include/musl/upstream/include/assert.h:8:28: note: expanded from
macro 'assert'
#define assert(x) ((void)((x) || (__assert_fail(#x, __FILE__, __LINE__, ...
^
In file included from hello.cpp:1:
In file included from /usr/local/include/eosiolib/eosio.hpp:7:
In file included from /usr/local/include/eosiolib/action.hpp:7:
In file included from /usr/local/include/eosiolib/datastream.hpp:9:
In file included from /home/li/opt/boost_1_66_0/include/boost/container/flat_map.hpp:26:
In file included from /home/li/opt/boost_1_66_0/include/boost/container/new_allocator.hpp:24:
/home/li/opt/boost_1_66_0/include/boost/container/throw_exception.hpp:64:25: warning:
address of array 'msg' will always evaluate to 'true'
[-Wpointer-bool-conversion]
BOOST_ASSERT_MSG(!msg, str);
~^~~
/home/li/opt/boost_1_66_0/include/boost/assert.hpp:61:46: note: expanded from
macro 'BOOST_ASSERT_MSG'
# define BOOST_ASSERT_MSG(expr, msg) assert((expr)&&(msg))
^~~~
/usr/local/include/musl/upstream/include/assert.h:8:28: note: expanded from
macro 'assert'
#define assert(x) ((void)((x) || (__assert_fail(#x, __FILE__, __LINE__, ...
^
In file included from hello.cpp:1:
In file included from /usr/local/include/eosiolib/eosio.hpp:7:
In file included from /usr/local/include/eosiolib/action.hpp:7:
In file included from /usr/local/include/eosiolib/datastream.hpp:9:
In file included from /home/li/opt/boost_1_66_0/include/boost/container/flat_map.hpp:26:
In file included from /home/li/opt/boost_1_66_0/include/boost/container/new_allocator.hpp:24:
/home/li/opt/boost_1_66_0/include/boost/container/throw_exception.hpp:72:25: warning:
address of array 'msg' will always evaluate to 'true'
[-Wpointer-bool-conversion]
BOOST_ASSERT_MSG(!msg, str);
~^~~
/home/li/opt/boost_1_66_0/include/boost/assert.hpp:61:46: note: expanded from
macro 'BOOST_ASSERT_MSG'
# define BOOST_ASSERT_MSG(expr, msg) assert((expr)&&(msg))
^~~~
/usr/local/include/musl/upstream/include/assert.h:8:28: note: expanded from
macro 'assert'
#define assert(x) ((void)((x) || (__assert_fail(#x, __FILE__, __LINE__, ...
^
In file included from hello.cpp:1:
In file included from /usr/local/include/eosiolib/eosio.hpp:7:
In file included from /usr/local/include/eosiolib/action.hpp:7:
In file included from /usr/local/include/eosiolib/datastream.hpp:9:
In file included from /home/li/opt/boost_1_66_0/include/boost/container/flat_map.hpp:26:
In file included from /home/li/opt/boost_1_66_0/include/boost/container/new_allocator.hpp:24:
/home/li/opt/boost_1_66_0/include/boost/container/throw_exception.hpp:80:25: warning:
address of array 'msg' will always evaluate to 'true'
[-Wpointer-bool-conversion]
BOOST_ASSERT_MSG(!msg, str);
~^~~
/home/li/opt/boost_1_66_0/include/boost/assert.hpp:61:46: note: expanded from
macro 'BOOST_ASSERT_MSG'
# define BOOST_ASSERT_MSG(expr, msg) assert((expr)&&(msg))
^~~~
/usr/local/include/musl/upstream/include/assert.h:8:28: note: expanded from
macro 'assert'
#define assert(x) ((void)((x) || (__assert_fail(#x, __FILE__, __LINE__, ...
^
In file included from hello.cpp:1:
In file included from /usr/local/include/eosiolib/eosio.hpp:7:
In file included from /usr/local/include/eosiolib/action.hpp:7:
In file included from /usr/local/include/eosiolib/datastream.hpp:9:
In file included from /home/li/opt/boost_1_66_0/include/boost/container/flat_map.hpp:26:
In file included from /home/li/opt/boost_1_66_0/include/boost/container/new_allocator.hpp:24:
/home/li/opt/boost_1_66_0/include/boost/container/throw_exception.hpp:88:25: warning:
address of array 'msg' will always evaluate to 'true'
[-Wpointer-bool-conversion]
BOOST_ASSERT_MSG(!msg, str);
~^~~
/home/li/opt/boost_1_66_0/include/boost/assert.hpp:61:46: note: expanded from
macro 'BOOST_ASSERT_MSG'
# define BOOST_ASSERT_MSG(expr, msg) assert((expr)&&(msg))
^~~~
/usr/local/include/musl/upstream/include/assert.h:8:28: note: expanded from
macro 'assert'
#define assert(x) ((void)((x) || (__assert_fail(#x, __FILE__, __LINE__, ...
^
5 warnings generated.
查看已生成的文件
$ls
hello.cpp hello.wast
四 生成abi文件
eosiocpp -g hello.abi hello.cpp
Generated hello.abi ...
五 部署合约
cleos set contract bytemaster ../hello -p bytemaster
Reading WAST...
Assembling WASM...
Publishing contract...
executed transaction: 6b35885bcee249f2261246cc1f4c3a3373ea35e7f774de95c17016afb4cbe3b4 1632 bytes 2200576 cycles
# eosio <= eosio::setcode {"account":"bytemaster","vmtype":0,"vmversion":0,"code":"0061736d0100000001370b60027f7e0060027e7e006...
# eosio <= eosio::setabi {"account":"bytemaster","abi":{"types":[],"structs":[{"name":"hi","base":"","fields":[{"name":"user"...
注意:
(1)如钱包锁定,请使用命令解锁“ cleos wallet unlock --password 钱包私钥”,不然提示
Error 3030002: signatures do not satisfy declared authorizations
Ensure that you have the related private keys inside your wallet and you wallet is unlocked.
(2)用户用上一章创建的bytemaster,如未创建,参考《使用EOS3.0发行代币》创建用户。
六 执行合约
cleos push action bytemaster hi '["bytemaster"]' -p bytemaster
executed transaction: 5d139b060e83bdda2aec63c531587cf1877776034af7396d2822f99a70afca8a 232 bytes 102400 cycles
# bytemaster <= bytemaster::hi {"user":"bytemaster"}
>> Hello, bytemaster
七 总结
智能合约开发步骤
(1)运行eos客户端,启动私有网络
(2)编写合约cpp文件
(3)合约cpp编译为wast格式
(4)创建合约的abi
(5)解锁钱包
(6)部署合约
(7)执行合约
八 引用
https://github.com/EOSIO/eos/wiki/Tutorial-Hello-World-Contract《Tutorial Hello World Contract》
http://liyuechun.org/2018/04/18/eos-contract/ 《第三篇 - 从零到壹学习EOS - EOS DAWN-V3.0.0 智能合约开发之Hello World》
九 附hello.abi hello.wast 内容
hello.abi
{
"____comment": "This file was generated by eosio-abigen. DO NOT EDIT - 2018-05-16T15:10:08",
"types": [],
"structs": [{
"name": "hi",
"base": "",
"fields": [{
"name": "user",
"type": "account_name"
}
]
}
],
"actions": [{
"name": "hi",
"type": "hi",
"ricardian_contract": ""
}
],
"tables": [],
"clauses": []
}
hello.wast
(module
(type $FUNCSIG$vij (func (param i32 i64)))
(type $FUNCSIG$vjj (func (param i64 i64)))
(type $FUNCSIG$vi (func (param i32)))
(type $FUNCSIG$i (func (result i32)))
(type $FUNCSIG$iii (func (param i32 i32) (result i32)))
(type $FUNCSIG$vii (func (param i32 i32)))
(type $FUNCSIG$iiii (func (param i32 i32 i32) (result i32)))
(type $FUNCSIG$vj (func (param i64)))
(type $FUNCSIG$v (func))
(import "env" "action_data_size" (func $action_data_size (result i32)))
(import "env" "eosio_assert" (func $eosio_assert (param i32 i32)))
(import "env" "eosio_exit" (func $eosio_exit (param i32)))
(import "env" "memcpy" (func $memcpy (param i32 i32 i32) (result i32)))
(import "env" "printn" (func $printn (param i64)))
(import "env" "prints" (func $prints (param i32)))
(import "env" "read_action_data" (func $read_action_data (param i32 i32) (result i32)))
(import "env" "require_auth2" (func $require_auth2 (param i64 i64)))
(table 2 2 anyfunc)
(elem (i32.const 0) $__wasm_nullptr $_ZN5hello2hiEy)
(memory $0 1)
(data (i32.const 4) "`a\00\00")
(data (i32.const 16) "read\00")
(data (i32.const 32) "Hello, \00")
(data (i32.const 8448) "malloc_from_freed was designed to only be called after _heap was completely allocated\00")
(export "memory" (memory $0))
(export "_ZeqRK11checksum256S1_" (func $_ZeqRK11checksum256S1_))
(export "_ZN5eosio12require_authERKNS_16permission_levelE" (func $_ZN5eosio12require_authERKNS_16permission_levelE))
(export "apply" (func $apply))
(export "memcmp" (func $memcmp))
(export "malloc" (func $malloc))
(export "free" (func $free))
(func $_ZeqRK11checksum256S1_ (param $0 i32) (param $1 i32) (result i32)
(i32.eqz
(call $memcmp
(get_local $0)
(get_local $1)
(i32.const 32)
)
)
)
(func $_ZN5eosio12require_authERKNS_16permission_levelE (param $0 i32)
(call $require_auth2
(i64.load
(get_local $0)
)
(i64.load offset=8
(get_local $0)
)
)
)
(func $apply (param $0 i64) (param $1 i64) (param $2 i64)
(local $3 i32)
(i32.store offset=4
(i32.const 0)
(tee_local $3
(i32.sub
(i32.load offset=4
(i32.const 0)
)
(i32.const 32)
)
)
)
(block $label$0
(block $label$1
(br_if $label$1
(i64.ne
(get_local $1)
(get_local $0)
)
)
(i64.store offset=24
(get_local $3)
(get_local $1)
)
(br_if $label$0
(i64.ne
(get_local $2)
(i64.const 7746191359077253120)
)
)
(i32.store offset=20
(get_local $3)
(i32.const 0)
)
(i32.store offset=16
(get_local $3)
(i32.const 1)
)
(i64.store offset=8 align=4
(get_local $3)
(i64.load offset=16
(get_local $3)
)
)
(drop
(call $_ZN5eosio14execute_actionI5helloS1_JyEEEbPT_MT0_FvDpT1_E
(i32.add
(get_local $3)
(i32.const 24)
)
(i32.add
(get_local $3)
(i32.const 8)
)
)
)
)
(i32.store offset=4
(i32.const 0)
(i32.add
(get_local $3)
(i32.const 32)
)
)
(return)
)
(call $eosio_exit
(i32.const 0)
)
(unreachable)
)
(func $_ZN5hello2hiEy (type $FUNCSIG$vij) (param $0 i32) (param $1 i64)
(call $prints
(i32.const 32)
)
(call $printn
(get_local $1)
)
)
(func $_ZN5eosio14execute_actionI5helloS1_JyEEEbPT_MT0_FvDpT1_E (param $0 i32) (param $1 i32) (result i32)
(local $2 i32)
(local $3 i64)
(local $4 i32)
(local $5 i32)
(local $6 i32)
(set_local $6
(tee_local $4
(i32.sub
(i32.load offset=4
(i32.const 0)
)
(i32.const 16)
)
)
)
(i32.store offset=4
(i32.const 0)
(get_local $4)
)
(set_local $2
(i32.load offset=4
(get_local $1)
)
)
(set_local $5
(i32.load
(get_local $1)
)
)
(block $label$0
(block $label$1
(br_if $label$1
(i32.lt_u
(tee_local $1
(call $action_data_size)
)
(i32.const 513)
)
)
(set_local $4
(call $malloc
(get_local $1)
)
)
(br $label$0)
)
(i32.store offset=4
(i32.const 0)
(tee_local $4
(i32.sub
(get_local $4)
(i32.and
(i32.add
(get_local $1)
(i32.const 15)
)
(i32.const -16)
)
)
)
)
)
(drop
(call $read_action_data
(get_local $4)
(get_local $1)
)
)
(i64.store offset=8
(get_local $6)
(i64.const 0)
)
(call $eosio_assert
(i32.gt_u
(get_local $1)
(i32.const 7)
)
(i32.const 16)
)
(drop
(call $memcpy
(i32.add
(get_local $6)
(i32.const 8)
)
(get_local $4)
(i32.const 8)
)
)
(set_local $3
(i64.load offset=8
(get_local $6)
)
)
(block $label$2
(br_if $label$2
(i32.lt_u
(get_local $1)
(i32.const 513)
)
)
(call $free
(get_local $4)
)
)
(set_local $1
(i32.add
(get_local $0)
(i32.shr_s
(get_local $2)
(i32.const 1)
)
)
)
(block $label$3
(br_if $label$3
(i32.eqz
(i32.and
(get_local $2)
(i32.const 1)
)
)
)
(set_local $5
(i32.load
(i32.add
(i32.load
(get_local $1)
)
(get_local $5)
)
)
)
)
(call_indirect $FUNCSIG$vij
(get_local $1)
(get_local $3)
(get_local $5)
)
(i32.store offset=4
(i32.const 0)
(i32.add
(get_local $6)
(i32.const 16)
)
)
(i32.const 1)
)
(func $memcmp (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
(local $3 i32)
(local $4 i32)
(local $5 i32)
(set_local $5
(i32.const 0)
)
(block $label$0
(br_if $label$0
(i32.eqz
(get_local $2)
)
)
(block $label$1
(loop $label$2
(br_if $label$1
(i32.ne
(tee_local $3
(i32.load8_u
(get_local $0)
)
)
(tee_local $4
(i32.load8_u
(get_local $1)
)
)
)
)
(set_local $1
(i32.add
(get_local $1)
(i32.const 1)
)
)
(set_local $0
(i32.add
(get_local $0)
(i32.const 1)
)
)
(br_if $label$2
(tee_local $2
(i32.add
(get_local $2)
(i32.const -1)
)
)
)
(br $label$0)
)
)
(set_local $5
(i32.sub
(get_local $3)
(get_local $4)
)
)
)
(get_local $5)
)
(func $malloc (param $0 i32) (result i32)
(call $_ZN5eosio14memory_manager6mallocEm
(i32.const 40)
(get_local $0)
)
)
(func $_ZN5eosio14memory_manager6mallocEm (param $0 i32) (param $1 i32) (result i32)
(local $2 i32)
(local $3 i32)
(local $4 i32)
(local $5 i32)
(local $6 i32)
(local $7 i32)
(local $8 i32)
(local $9 i32)
(local $10 i32)
(local $11 i32)
(local $12 i32)
(local $13 i32)
(block $label$0
(br_if $label$0
(i32.eqz
(get_local $1)
)
)
(block $label$1
(br_if $label$1
(tee_local $13
(i32.load offset=8384
(get_local $0)
)
)
)
(set_local $13
(i32.const 16)
)
(i32.store
(i32.add
(get_local $0)
(i32.const 8384)
)
(i32.const 16)
)
)
(set_local $2
(select
(i32.sub
(i32.add
(get_local $1)
(i32.const 8)
)
(tee_local $2
(i32.and
(i32.add
(get_local $1)
(i32.const 4)
)
(i32.const 7)
)
)
)
(get_local $1)
(get_local $2)
)
)
(block $label$2
(block $label$3
(block $label$4
(br_if $label$4
(i32.ge_u
(tee_local $10
(i32.load offset=8388
(get_local $0)
)
)
(get_local $13)
)
)
(set_local $1
(i32.add
(i32.add
(get_local $0)
(i32.mul
(get_local $10)
(i32.const 12)
)
)
(i32.const 8192)
)
)
(block $label$5
(br_if $label$5
(get_local $10)
)
(br_if $label$5
(i32.load
(tee_local $13
(i32.add
(get_local $0)
(i32.const 8196)
)
)
)
)
(i32.store
(get_local $1)
(i32.const 8192)
)
(i32.store
(get_local $13)
(get_local $0)
)
)
(set_local $10
(i32.add
(get_local $2)
(i32.const 4)
)
)
(loop $label$6
(block $label$7
(br_if $label$7
(i32.gt_u
(i32.add
(tee_local $13
(i32.load offset=8
(get_local $1)
)
)
(get_local $10)
)
(i32.load
(get_local $1)
)
)
)
(i32.store
(tee_local $13
(i32.add
(i32.load offset=4
(get_local $1)
)
(get_local $13)
)
)
(i32.or
(i32.and
(i32.load
(get_local $13)
)
(i32.const -2147483648)
)
(get_local $2)
)
)
(i32.store
(tee_local $1
(i32.add
(get_local $1)
(i32.const 8)
)
)
(i32.add
(i32.load
(get_local $1)
)
(get_local $10)
)
)
(i32.store
(get_local $13)
(i32.or
(i32.load
(get_local $13)
)
(i32.const -2147483648)
)
)
(br_if $label$3
(tee_local $1
(i32.add
(get_local $13)
(i32.const 4)
)
)
)
)
(br_if $label$6
(tee_local $1
(call $_ZN5eosio14memory_manager16next_active_heapEv
(get_local $0)
)
)
)
)
)
(set_local $4
(i32.sub
(i32.const 2147483644)
(get_local $2)
)
)
(set_local $11
(i32.add
(get_local $0)
(i32.const 8392)
)
)
(set_local $12
(i32.add
(get_local $0)
(i32.const 8384)
)
)
(set_local $13
(tee_local $3
(i32.load offset=8392
(get_local $0)
)
)
)
(loop $label$8
(call $eosio_assert
(i32.eq
(i32.load
(i32.add
(tee_local $1
(i32.add
(get_local $0)
(i32.mul
(get_local $13)
(i32.const 12)
)
)
)
(i32.const 8200)
)
)
(i32.load
(tee_local $5
(i32.add
(get_local $1)
(i32.const 8192)
)
)
)
)
(i32.const 8448)
)
(set_local $13
(i32.add
(tee_local $6
(i32.load
(i32.add
(get_local $1)
(i32.const 8196)
)
)
)
(i32.const 4)
)
)
(loop $label$9
(set_local $7
(i32.add
(get_local $6)
(i32.load
(get_local $5)
)
)
)
(set_local $1
(i32.and
(tee_local $9
(i32.load
(tee_local $8
(i32.add
(get_local $13)
(i32.const -4)
)
)
)
)
(i32.const 2147483647)
)
)
(block $label$10
(br_if $label$10
(i32.lt_s
(get_local $9)
(i32.const 0)
)
)
(block $label$11
(br_if $label$11
(i32.ge_u
(get_local $1)
(get_local $2)
)
)
(loop $label$12
(br_if $label$11
(i32.ge_u
(tee_local $10
(i32.add
(get_local $13)
(get_local $1)
)
)
(get_local $7)
)
)
(br_if $label$11
(i32.lt_s
(tee_local $10
(i32.load
(get_local $10)
)
)
(i32.const 0)
)
)
(br_if $label$12
(i32.lt_u
(tee_local $1
(i32.add
(i32.add
(get_local $1)
(i32.and
(get_local $10)
(i32.const 2147483647)
)
)
(i32.const 4)
)
)
(get_local $2)
)
)
)
)
(i32.store
(get_local $8)
(i32.or
(select
(get_local $1)
(get_local $2)
(i32.lt_u
(get_local $1)
(get_local $2)
)
)
(i32.and
(get_local $9)
(i32.const -2147483648)
)
)
)
(block $label$13
(br_if $label$13
(i32.le_u
(get_local $1)
(get_local $2)
)
)
(i32.store
(i32.add
(get_local $13)
(get_local $2)
)
(i32.and
(i32.add
(get_local $4)
(get_local $1)
)
(i32.const 2147483647)
)
)
)
(br_if $label$2
(i32.ge_u
(get_local $1)
(get_local $2)
)
)
)
(br_if $label$9
(i32.lt_u
(tee_local $13
(i32.add
(i32.add
(get_local $13)
(get_local $1)
)
(i32.const 4)
)
)
(get_local $7)
)
)
)
(set_local $1
(i32.const 0)
)
(i32.store
(get_local $11)
(tee_local $13
(select
(i32.const 0)
(tee_local $13
(i32.add
(i32.load
(get_local $11)
)
(i32.const 1)
)
)
(i32.eq
(get_local $13)
(i32.load
(get_local $12)
)
)
)
)
)
(br_if $label$8
(i32.ne
(get_local $13)
(get_local $3)
)
)
)
)
(return
(get_local $1)
)
)
(i32.store
(get_local $8)
(i32.or
(i32.load
(get_local $8)
)
(i32.const -2147483648)
)
)
(return
(get_local $13)
)
)
(i32.const 0)
)
(func $_ZN5eosio14memory_manager16next_active_heapEv (param $0 i32) (result i32)
(local $1 i32)
(local $2 i32)
(local $3 i32)
(local $4 i32)
(local $5 i32)
(local $6 i32)
(local $7 i32)
(local $8 i32)
(set_local $1
(i32.load offset=8388
(get_local $0)
)
)
(block $label$0
(block $label$1
(br_if $label$1
(i32.eqz
(i32.load8_u offset=8534
(i32.const 0)
)
)
)
(set_local $7
(i32.load offset=8536
(i32.const 0)
)
)
(br $label$0)
)
(set_local $7
(current_memory)
)
(i32.store8 offset=8534
(i32.const 0)
(i32.const 1)
)
(i32.store offset=8536
(i32.const 0)
(tee_local $7
(i32.shl
(get_local $7)
(i32.const 16)
)
)
)
)
(set_local $3
(get_local $7)
)
(block $label$2
(block $label$3
(block $label$4
(block $label$5
(br_if $label$5
(i32.le_u
(tee_local $2
(i32.shr_u
(i32.add
(get_local $7)
(i32.const 65535)
)
(i32.const 16)
)
)
(tee_local $8
(current_memory)
)
)
)
(drop
(grow_memory
(i32.sub
(get_local $2)
(get_local $8)
)
)
)
(set_local $8
(i32.const 0)
)
(br_if $label$4
(i32.ne
(get_local $2)
(current_memory)
)
)
(set_local $3
(i32.load offset=8536
(i32.const 0)
)
)
)
(set_local $8
(i32.const 0)
)
(i32.store offset=8536
(i32.const 0)
(get_local $3)
)
(br_if $label$4
(i32.lt_s
(get_local $7)
(i32.const 0)
)
)
(set_local $2
(i32.add
(get_local $0)
(i32.mul
(get_local $1)
(i32.const 12)
)
)
)
(set_local $7
(i32.sub
(i32.sub
(i32.add
(get_local $7)
(select
(i32.const 65536)
(i32.const 131072)
(tee_local $6
(i32.lt_u
(tee_local $8
(i32.and
(get_local $7)
(i32.const 65535)
)
)
(i32.const 64513)
)
)
)
)
(select
(get_local $8)
(i32.and
(get_local $7)
(i32.const 131071)
)
(get_local $6)
)
)
(get_local $7)
)
)
(block $label$6
(br_if $label$6
(i32.load8_u offset=8534
(i32.const 0)
)
)
(set_local $3
(current_memory)
)
(i32.store8 offset=8534
(i32.const 0)
(i32.const 1)
)
(i32.store offset=8536
(i32.const 0)
(tee_local $3
(i32.shl
(get_local $3)
(i32.const 16)
)
)
)
)
(set_local $2
(i32.add
(get_local $2)
(i32.const 8192)
)
)
(br_if $label$3
(i32.lt_s
(get_local $7)
(i32.const 0)
)
)
(set_local $6
(get_local $3)
)
(block $label$7
(br_if $label$7
(i32.le_u
(tee_local $8
(i32.shr_u
(i32.add
(i32.add
(tee_local $5
(i32.and
(i32.add
(get_local $7)
(i32.const 7)
)
(i32.const -8)
)
)
(get_local $3)
)
(i32.const 65535)
)
(i32.const 16)
)
)
(tee_local $4
(current_memory)
)
)
)
(drop
(grow_memory
(i32.sub
(get_local $8)
(get_local $4)
)
)
)
(br_if $label$3
(i32.ne
(get_local $8)
(current_memory)
)
)
(set_local $6
(i32.load offset=8536
(i32.const 0)
)
)
)
(i32.store offset=8536
(i32.const 0)
(i32.add
(get_local $6)
(get_local $5)
)
)
(br_if $label$3
(i32.eq
(get_local $3)
(i32.const -1)
)
)
(br_if $label$2
(i32.eq
(i32.add
(tee_local $6
(i32.load
(i32.add
(tee_local $1
(i32.add
(get_local $0)
(i32.mul
(get_local $1)
(i32.const 12)
)
)
)
(i32.const 8196)
)
)
)
(tee_local $8
(i32.load
(get_local $2)
)
)
)
(get_local $3)
)
)
(block $label$8
(br_if $label$8
(i32.eq
(get_local $8)
(tee_local $1
(i32.load
(tee_local $5
(i32.add
(get_local $1)
(i32.const 8200)
)
)
)
)
)
)
(i32.store
(tee_local $6
(i32.add
(get_local $6)
(get_local $1)
)
)
(i32.or
(i32.and
(i32.load
(get_local $6)
)
(i32.const -2147483648)
)
(i32.add
(i32.sub
(i32.const -4)
(get_local $1)
)
(get_local $8)
)
)
)
(i32.store
(get_local $5)
(i32.load
(get_local $2)
)
)
(i32.store
(get_local $6)
(i32.and
(i32.load
(get_local $6)
)
(i32.const 2147483647)
)
)
)
(i32.store
(tee_local $2
(i32.add
(get_local $0)
(i32.const 8388)
)
)
(tee_local $2
(i32.add
(i32.load
(get_local $2)
)
(i32.const 1)
)
)
)
(i32.store
(i32.add
(tee_local $0
(i32.add
(get_local $0)
(i32.mul
(get_local $2)
(i32.const 12)
)
)
)
(i32.const 8196)
)
(get_local $3)
)
(i32.store
(tee_local $8
(i32.add
(get_local $0)
(i32.const 8192)
)
)
(get_local $7)
)
)
(return
(get_local $8)
)
)
(block $label$9
(br_if $label$9
(i32.eq
(tee_local $8
(i32.load
(get_local $2)
)
)
(tee_local $7
(i32.load
(tee_local $1
(i32.add
(tee_local $3
(i32.add
(get_local $0)
(i32.mul
(get_local $1)
(i32.const 12)
)
)
)
(i32.const 8200)
)
)
)
)
)
)
(i32.store
(tee_local $3
(i32.add
(i32.load
(i32.add
(get_local $3)
(i32.const 8196)
)
)
(get_local $7)
)
)
(i32.or
(i32.and
(i32.load
(get_local $3)
)
(i32.const -2147483648)
)
(i32.add
(i32.sub
(i32.const -4)
(get_local $7)
)
(get_local $8)
)
)
)
(i32.store
(get_local $1)
(i32.load
(get_local $2)
)
)
(i32.store
(get_local $3)
(i32.and
(i32.load
(get_local $3)
)
(i32.const 2147483647)
)
)
)
(i32.store offset=8384
(get_local $0)
(tee_local $3
(i32.add
(i32.load
(tee_local $7
(i32.add
(get_local $0)
(i32.const 8388)
)
)
)
(i32.const 1)
)
)
)
(i32.store
(get_local $7)
(get_local $3)
)
(return
(i32.const 0)
)
)
(i32.store
(get_local $2)
(i32.add
(get_local $8)
(get_local $7)
)
)
(get_local $2)
)
(func $free (param $0 i32)
(local $1 i32)
(local $2 i32)
(local $3 i32)
(block $label$0
(block $label$1
(br_if $label$1
(i32.eqz
(get_local $0)
)
)
(br_if $label$1
(i32.lt_s
(tee_local $2
(i32.load offset=8424
(i32.const 0)
)
)
(i32.const 1)
)
)
(set_local $3
(i32.const 8232)
)
(set_local $1
(i32.add
(i32.mul
(get_local $2)
(i32.const 12)
)
(i32.const 8232)
)
)
(loop $label$2
(br_if $label$1
(i32.eqz
(tee_local $2
(i32.load
(i32.add
(get_local $3)
(i32.const 4)
)
)
)
)
)
(block $label$3
(br_if $label$3
(i32.gt_u
(i32.add
(get_local $2)
(i32.const 4)
)
(get_local $0)
)
)
(br_if $label$0
(i32.gt_u
(i32.add
(get_local $2)
(i32.load
(get_local $3)
)
)
(get_local $0)
)
)
)
(br_if $label$2
(i32.lt_u
(tee_local $3
(i32.add
(get_local $3)
(i32.const 12)
)
)
(get_local $1)
)
)
)
)
(return)
)
(i32.store
(tee_local $3
(i32.add
(get_local $0)
(i32.const -4)
)
)
(i32.and
(i32.load
(get_local $3)
)
(i32.const 2147483647)
)
)
)
(func $__wasm_nullptr (type $FUNCSIG$v)
(unreachable)
)
)