智能合约是与账号相关联的,账户又与钱包相关联。所以为了开发智能合约,我们首先要创建一个钱包。
执行下面的命令创建一个默认的钱包
./build/programs/cleos/cleos wallet create --to-console
生成的钱包默认在当前户主的 eosio-wallet
目录内,同时命令还输出钱包的私钥 PW5KV37tpHBxuH52VEmhc9usCMjFc7EgxDBV9qHtN3ppfh39phJ1g
,这个私钥一定要保存,因为后面当需要解锁钱包时要用到这个私钥。
正常情况下,我们需要创建两个密钥对,并把两个密钥对的私钥导入到钱包中,然后再来创建钱包。但是,在本文写作时这种方式已经不起作用。
当前本人使用的版本如下:
cloes
版本为 59626f1e
,可用以下命令查看:
./build/programs/cleos/cleos version client
nodeos
版本为 v1.4.4
,可用以下命令查看:
./build/programs/nodeos/nodeos -v
也可以执行下面的命令来获取版本相关的信息:
./build/programs/cleos/cleos get info
下面的命令显示如下:
{
"server_version": "59626f1e",
"chain_id": "cf057bbfb72640471fd910bcb67639c22df9f92470936cddc1ade0e2f2e7dc4f",
"head_block_num": 5085,
"last_irreversible_block_num": 5084,
"last_irreversible_block_id": "000013dc8cff5717b630d2ac7a077242f16a882694d8a0297a1eb14c72d05415",
"head_block_id": "000013ddcf3db56a3de7c25922d68824b5bce2240b40a95e2d4280640962d0d7",
"head_block_time": "2018-12-03T15:32:04.500",
"head_block_producer": "eosio",
"virtual_block_cpu_limit": 32285095,
"virtual_block_net_limit": 169610961,
"block_cpu_limit": 199900,
"block_net_limit": 1048576,
"server_version_string": "v1.4.4"
}
在这种情况,如果你在测试网中部署智能合约,只能使用下面的密钥对:
注1:创建密钥对的命令如下:./build/programs/cleos/cleos create key –to-console。在当前的版本下,已经不需要自己生成密钥了。
注2:如果在下面创建账户时,明明钱包已经解锁,并且自己生成的密钥已经钱包的情况,一直出现
Error 3090003: Provided keys, permissions, and delays do not satisfy declared authorizations
,那么可以使用本文中给出的密钥进行一试。
接下来,把上面创建好的两组私钥导入到钱包中
./build/programs/cleos/cleos wallet import
导入成功后,执行下面的命令进行检查钱包中已经导入的密钥:
./build/programs/cleos/cleos wallet keys
经过上面的各种准备下面终于到了开始创建账户的阶段了。
./build/programs/cleos/cleos create account eosio test EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
命令执行后,控制台会显示如下信息:
executed transaction: 35464656da73bdcc2ca6ebd3b0906f5c0cf5e07cdfa7769d4b1f17a1649f4e08 200 bytes 10866 us
# eosio <= eosio::newaccount {"creator":"eosio","name":"test","owner":{"threshold":1,"keys":[{"key":"EOS6MRyAjQq8ud7hVNYcfnVPJqcV...
warning: transaction executed locally, but may not be confirmed by the network yet ]
为了确保账户导入成功,执行下面的命令检查账户:
./build/programs/cleos/cleos get account -j test
这个命令显示如下:
{
"account_name": "test",
"head_block_num": 4377,
"head_block_time": "2018-12-03T15:18:27.000",
"privileged": false,
"last_code_update": "1970-01-01T00:00:00.000",
"created": "2018-12-03T15:16:30.000",
"ram_quota": -1,
"net_weight": -1,
"cpu_weight": -1,
"net_limit": {
"used": -1,
"available": -1,
"max": -1
},
"cpu_limit": {
"used": -1,
"available": -1,
"max": -1
},
"ram_usage": 2724,
"permissions": [{
"perm_name": "active",
"parent": "owner",
"required_auth": {
"threshold": 1,
"keys": [{
"key": "EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV",
"weight": 1
}
],
"accounts": [],
"waits": []
}
},{
"perm_name": "owner",
"parent": "",
"required_auth": {
"threshold": 1,
"keys": [{
"key": "EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV",
"weight": 1
}
],
"accounts": [],
"waits": []
}
}
],
"total_resources": null,
"self_delegated_bandwidth": null,
"refund_request": null,
"voter_info": null
}
注:在以上操作时,如果出现提示钱包被锁定,那么请执行
./build/programs/cleos/cleos wallet unlock --password
方法来解锁账户,密钥就是我们创建钱包时输出的私钥。
作为传统,在计算中通常第一个程序都是 Hello World
,今天我们也不例外。下面我们就来写一个 EOS 智能合约版的 Hello World
。
在当前目录下新建一个目录 Hello
来存放我们的智能合约相关文件。EOS 的智能合约使用 C++ 来编写,所以我们需要新建一个文件,命名为 Hello.cpp
,拷贝如下内容到文件中。
#include <eosiolib/eosio.hpp>
#include <eosiolib/print.hpp>
using namespace eosio;
//所有的智能合约都继承自contract类
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
文件
./build/tools/eosiocpp -o ./Hello/Hello.wast ./Hello/Hello.cpp
命令执行完你会看到在当前目录下生成了两个文件 Hello.wasm
和 Hello.wast
执行下面的命令来生成 .abi
文件
./build/tools/eosiocpp -g ./Hello/Hello.abi ./Hello/Hello.cpp
在 .wast
文件和 .abi
文件生成之后,接下来我们就可以部署我们的合约了。
在部署合约之前,我们还要让钱包保持解锁状态,所以先执行下面的命令:
./build/programs/cleos/cleos wallet unlock --password
然后再执行下面的命令来部署我们的第一个智能合约:
./build/programs/cleos/cleos set contract test Hello
如无意外,你就可以看到下面的输出。恭喜你,少年!你的合约部署成功了。
Reading WASM from Hello/Hello.wasm...
Publishing contract...
executed transaction: cb3600150671ba433b2f9bfe09937e63f2617c37155c2e5f1cbc46112ac62472 1792 bytes 14128 us
# eosio <= eosio::setcode {"account":"test","vmtype":0,"vmversion":0,"code":"0061736d01000000013b0c60027f7e006000017e60027e7e0...
# eosio <= eosio::setabi {"account":"test","abi":"0e656f73696f3a3a6162692f312e30000102686900010475736572046e616d6501000000000...
warning: transaction executed locally, but may not be confirmed by the network yet ]
注:之所以新建一个
Hello
目录是因为 EOS 要求合约所在的目录必须与合约的名字相同。
为了确保合约部署成功,执行下面的命令查看下合约:
./build/programs/cleos/cleos get code test
通常你会看到合约的哈希,类似于如下:
code hash: 1d0070ffc528f1268ad1f6c5ba998245811318bdcfd8827432d56e24c69a476c
万事具备,只你你来调用!最后,让我们来调用这个合约吧!
./build/programs/cleos/cleos push action test hi '{"user":"eos"}' -p test
然后,你就会看到下面的输出:
executed transaction: 885a1f667a63658f5abe13435ea6989d19672fade8badc2e8544480b4031a271 104 bytes 1742 us
# test <= test::hi {"user":"eos"}
warning: transaction executed locally, but may not be confirmed by the network yet ]
但是此时你却看不到我们的合约打印信息,怎么会事呢?原来,默认情况下,系统是不在控制下打印的,为了在控制台上看到我们合约的输出,要在启动节点时加上 --contracts-console
,完整的命令如下:
./build/programs/nodeos/nodeos -e -p eosio --plugin eosio::chain_api_plugin --plugin eosio::history_api_plugin --contracts-console
现在再执行一次上面调用合约的命令,就可以看到下图中打印的内容:
同时在节点运行的控制台上也可以看到下图,要特别注意红框中的内容,那里就是我们合约执行的一些内容。
由于本人水平所限,文中错误在所难免,欢迎您踊跃指出错误,在下感激不尽。我的微信联系方式:joepeak。
版权声明:自由转载-非商用-非衍生-保持署名(创意共享4.0许可证)