0.跟随EOS开发网站的教程:https://developers.eos.io/eosio-home/docs 以及众多大神
1.创建合约测试账号(test)
[root@bogon hello]# cleos create account eosio test EOS4uUhxvwm1DdDETv2g8NFgVRCZWzChAcciC4ek2tLuu6oBLDbtw -p eosio@active
如果 提示Error 3080006: Transaction took too long
应该是资源不足的原因,在命令 -x 1000 就可以执行了
(具体原因以后解决)
cleos createaccount eosio ${new_account} ${owner_key} ${active_key}
2.部署合约
在里以源码中的例子,~/eos/bulid/conctracts/hello
[root@bogon contracts]# cleos set contract test hello/ -p test
# -p 是以私钥签署 test@active 可以切换权限
[root@bogon contracts]# cleos set contract test hello/ -p test@active
test 代表部署合约的账号
hello/ 代表合约所在的路径
-p test@active 和上文的相同
3.附加合约工具的使用eosio.cdt的使用
((EOSIO Contract Development Toolkit 即eos合约开发工具集))
官方提供的下载方式中这种是最好的不过时间有点长
下载:
git clone --recursive https://github.com/eosio/eosio.cdt --branch v1.3.2 --single-branch
cd eosio.cdt
组建:
./build.sh
安装
sudo ./install.sh
成功:
1.编译wasm文件
eosio-cpp -o hello.wasm hello.cpp --abigen
会生成hello.wasm,hello.abi。
第二种 cmake编译 (以后再说)
2.编译abi文件
这个命令在1.3.2版本是不对的 并没有–output这个参数
eosio-abigen hello.cpp --output=hello.abi
分享一下这个命令的记法:eosio-abigen abi+generator 直译abi文件的生成器
eosio-abigen hello.cpp -content=hello.abi
回到正文
4.调用智能合约
记得查看自己钱包状态是否解锁
[root@bogon contracts]# cleos push action test hi '["xiaoming"]' -p xiaoming@active
test 调用者
hi 调用的打印函数
“[“xiaoming”]” 函数参数,打印的名字账户名
hello.cpp(即智能合约中的内容)
#include <eosiolib/eosio.hpp>
#include <eosiolib/print.hpp>
using namespace eosio;
class hello : public contract {
public:
using contract::contract;
[[eosio::action]] //
void hi( name user ) {
print( "Hello, ", user); // name
}
};
EOSIO_DISPATCH( hello, (hi))
EOS的智能合约包含两方面action(动作)和transaction(交易)。action是对智能合约的函数调用,transcation包含一个或多个action。这个简单的示例就是action就是打印用户名
现在改一下,使用 require_auth 这个方法。
void hi (name user){
require_auth( user );
print("hello,",name{name} );
}
然后编译,部署一下。
调用:
[root@bogon test]# cleos push action xiaoming hi '["hello"]' -p xiaoming -x 1000
这里抛出错误:Error 3090004: Missing required authority
[root@bogon test]# cleos push action xiaoming hi '["xiaoming"]' -p xiaoming -x 1000
成功了。现在能知道这个方法的用处。
. This method takes an name as a parameter, and will check if the user executing the action matches the provided paramter.
此方法采用名称作为参数,并将检查执行该操作的用户是否与所提供的参数匹配。