EOS智能合约开发及授权

环境描述:

阅读本文前,假定您已经能够启动单节点EOSIO node,如果还不能正确操作,请参考官方WIKI:https://developers.eos.io/eosio-nodeos/docs/autobuild-script

操作系统:MAC OS 10.13.X,EOSIO版本号:V1.1.3

自定义合约开发与测试,在单节点操作,流程更简单,效果相同,因此以下操作流程都是在没有部署eosio.system合约的环境中进行。

操作步骤:

1.启动EOS环境,创建两组key

启动NODE:

nodeos --data-dir tmpdata -e -p eosio --plugin eosio::wallet_api_plugin --plugin eosio::chain_api_plugin--plugin eosio::history_api_plugin --max-transaction-time=1000(避免超时设置1000)

创建KEY:

cleos create key

2.使用创建的public_key,创建eosio.token用户,创建部署合约账户cactus,转账账户from:

create account eosio eosio.token EOS6JowfuTT7CZe4ResHqNvEWAnuYjCT68gw97KxsHY99sUk2t1j8 EOS6JowfuTT7CZe4ResHqNvEWAnuYjCT68gw97KxsHY99sUk2t1j8

create account eosio cactus EOS6JowfuTT7CZe4ResHqNvEWAnuYjCT68gw97KxsHY99sUk2t1j8 EOS6JowfuTT7CZe4ResHqNvEWAnuYjCT68gw97KxsHY99sUk2t1j8

create account eosio from EOS6JowfuTT7CZe4ResHqNvEWAnuYjCT68gw97KxsHY99sUk2t1j8 EOS6JowfuTT7CZe4ResHqNvEWAnuYjCT68gw97KxsHY99sUk2t1j8

2.1解锁钱包:

cleos wallet unlock --password PW5JCM32pkoqwfNwfMnLih8Gh5s5edbQyys6vP3Ci9NxL2x6EKecq

2.2导入私钥:

导入用户private_key:

cleos wallet import --private-key 5JC3dp6z2imXiAnq4M4JAQXetRntU23QLoFNZJxwBB1yxPVsSW3

导入eosio的private_key:

cleos wallet import --private-key 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3

3.发布eosio.token合约到eosio.token

3.1cd到eosio目录/build/programs/cleos

cleos set contract eosio.token ../../contracts/eosio.token

3.2创建代币:

cleos push action eosio.token create '["eosio","1000000000.0000 SYS",0,0,0]' -p eosio.token

3.3发行代币

cleos push action eosio.token issue '["eosio","1000000000.0000 SYS","issue"]' -p eosio

至此,基础工作完毕,可以先把node节点停掉,开始编写自定义转账合约。


4.创建自定义转账合约cactus.token.cpp

打开源码目录contracts,新建目录cactus.token,创建源码文件cactus.token.cpp,此合约使用了inline_action的方式调用eosio.token合约的transfer函数,inline action具体来说就是一个智能合约的代码调用另外一个智能合约的函数。action(xx).send(),具体参数的含义是:Action(permssion_level, other_contract_account_name, method, args)

action(permission_level{from, N(active)}, 
             N(eosio.token), N(transfer), 
             std::make_tuple(from, to,quantity,std::string("cactus transfer"))).send();

此处,合约调用eosio.token transfer方法从from的账户转账,因此必须获得用户from的active权限,否则不能操作,具体授权在8处详述。

注意:目录名称与主文件名称相同,部署合约时使用目录名进行部署

namespace cactus {
    class msig : public eosio::contract {
    public:
        using contract::contract;
        msig(account_name self)
                : eosio::contract(self), mtranses(_self, _self), wits(_self, _self),cts(_self, _self) {}
        //@abi action
        void transfer(account_name from, account_name to, asset quantity) {
            auto quant_after_fee = quantity;
            eosio_assert(is_account(from), "to account does not exist");
            eosio_assert(quantity.is_valid(), "invalid quantity");
            eosio_assert(quantity.amount > 0, "must withdraw positive quantity");
            require_auth(from);
            action(
                    permission_level{from, N(active)},
                    N(eosio.token), N(transfer),
                    std::make_tuple(from, _self, quantity, std::string("cactus transfer"))
            ).send();
            cts.emplace(_self, [&](auto &a) {
                a.id = cts.available_primary_key();
                a.from = from;
                a.to = to;
                a.amount = quantity.amount;
            });
        }

5.根据cactus.token.cpp生成cactus.token.wast及cactus.token.wasm,cactus.token.abi文件

cd 到eosio主目录/contracts/cactus.token/

生成cactus.token.wast、cactus.token.wasm文件,虚拟机加载使用

eosiocpp -o cactus.token.wast cactus.token.cpp

生成cactus.token.abi文件

eosiocpp -g cactus.token.abi cactus.token.cpp

执行此命令将文件夹cactus.token copy到build/contracts/

cp -R ../cactus.token ../../build/contracts/

6.重新启动node节点:

nodeos --data-dir tmpdata -e -p eosio --plugin eosio::wallet_api_plugin --plugin eosio::chain_api_plugin--plugin eosio::history_api_plugin --max-transaction-time=1000(避免超时设置1000)

7.部署合约

部署自定义合约到账户cactus,此时终端cd eosio主目录/build/contracts :

cleos set contract cactus cactus.token

可以看到输出内容如下图所示

contracts.jpg

8.授权
8.1 eosio.code内部权限
dawn4.0后新增的内部特殊权限eosio.code,用来加强inline action的安全性,当cactus.token智能合约代码通过action.send调用eosio.token智能合约时,cactus.token代码是拿不到任何私钥的,也就没法为声明的权限签名,即没办法证明该智能合约具备action声明的权限from@active。此时系统代码做安全性保障,因而系统提出了一个虚拟权限eosio.code。具体逻辑执行时,权限检验逻辑(controller.authorization_manager) ,cactus.transfer已经具备cactus@eosio.code权限。然后authorization_manager只需检验from@active是否授权给cactus@eosio.code即可。通过这种虚拟的权限证明解决了合约调用合约的权限检测问题。

如图标红处,校验合约部署账户的eosio.code权限,以避免inline action调用时出现安全问题。

contracts.jpg

8.2合约账户授权

智能合约cactus.token要调用eosio.token合约中transfer,将from的代币转出,必须得到from的授权,但是合约执行又需要使用合约部署账户的eosio.code权限才能操作,因此必须把from@active权限赋予cactus@eosio.code才能执行;

cleos set account permission from active '{"threshold" : 1, "keys" : [{"key":"EOS5CoAP5TqEzvzVjdhCfDrhffZ7JdpN7dnxgEqjAoVd2n4vRa5Zb","weight":1}], "accounts" : [{"permission":{"actor":"cactus","permission":"eosio.code"},"weight":1}]}' owner -p from@owner

执行结果:

contracts.jpg

8.3查看A的权限信息:

cleos get account from

执行结果如图所示

contracts.jpg

9.使用合约进行转账

cleos push action cactus transfer '["from","cactus","10.0000 SYS"]' -p from

操作结果:


contracts.jpg

至此,自定义合约转账的编码和授权操作结束。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容