BEPAL / eosj

eos blockchain wallet source code
BSD 3-Clause "New" or "Revised" License
7 stars 2 forks source link

关于创建账号的问题 #1

Closed linyujun closed 6 years ago

linyujun commented 6 years ago

您好:

看到测试用例里没有创建账号的相关代码,可以添加参考一下么~

chenluyong commented 6 years ago

测试用例我们确实没有提供,我们会将该事件放入计划。 若您对构建账号需求较为急切,可以参照该类进行构造。

文件路径: eosj/src/main/java/bepal/eosio/transaction/message/NewMessageData.java

需要注意:创建者 需要为 被创建者 提供 CPU NET RAM 等网络资源. 一笔交易必须连续执行这三个合约方法,以创建账户为首

newaccount -> buyram -> delegatebw 执行eosio合约.

例如 : https://eosmonitor.io/txn/9b134284c03f16c60ba7da8fb64a508540e334ccc45c720129300d1c4b039e96

linyujun commented 6 years ago

非常感谢您的回答,创建账号使用如下代码是否可行:

EosTransaction transaction = new EosTransaction(); transaction.ChainID = EOSChainID; transaction.BlockNum = refBlockNum; transaction.BlockPrefix = refBlockPrefix; transaction.NetUsageWords = 0; transaction.KcpuUsage = 0; transaction.DelaySec = 0; transaction.Expiration = expiration;

Action message = new Action(); message.Account = new AccountName("eosio"); message.Name = new AccountName("newaccount"); message.Authorization.add(new AccountPermission(from, "active"));

transaction.Actions.add(message);

NewMessageData data = new NewMessageData(); data.Creator = new AccountName(from); data.Name = new AccountName(newAccountName); data.Owner = new Authority(); data.Active = new Authority(); data.Owner.addKey(new KeyPermissionWeight(newPublicKey.getBytes())); data.Active.addKey(new KeyPermissionWeight(newPublicKey.getBytes()));

message.Data = data;

    transaction.Signature.add(eos.getEosPrivateKey().sign(transaction.getSignHash()).eosEncoding(true));

return transaction.toJson().toString(4);

linyujun commented 6 years ago

非常希望能有创建账号相关的测试用例代码可供参考,非常感谢

chenluyong commented 6 years ago

一个账号的创建需要 创建者被创建者 质押 网络资源

当前构造中,未质押网络资源 (RAM NET CPU)

linyujun commented 6 years ago
    同时质押网络资源 (RAM NET CPU) 在一次交易中,是否可行

        EosTransaction transaction = new EosTransaction();
        transaction.BlockNum = refBlockNum;
        transaction.BlockPrefix = refBlockPrefix;
        transaction.NetUsageWords = 0;
        transaction.KcpuUsage = 0;
        transaction.DelaySec = 0;
        transaction.Expiration = expiration;

        //创建账号
        Action messageNew = new Action();
        NewMessageData newMessageData = new NewMessageData();

        messageNew.Account = new AccountName("eosio");
        messageNew.Name = new AccountName("newaccount");
        messageNew.Authorization.add(new AccountPermission(payer, "active"));

        newMessageData.Creator = new AccountName(payer);
        newMessageData.Name = new AccountName(newAccountName);
        newMessageData.Owner = new Authority();
        newMessageData.Active = new Authority();
        newMessageData.Owner.addKey(new KeyPermissionWeight(newPublicKey.getBytes()));
        newMessageData.Active.addKey(new KeyPermissionWeight(newPublicKey.getBytes()));

        messageNew.Data = newMessageData;
        transaction.Actions.add(messageNew);

        //购买Ram
        Action messageRam = new Action();
        BuyRamMessageData buyRamMessageData = new BuyRamMessageData();

        messageRam.Account = new AccountName("eosio");
        messageRam.Name = new AccountName("buyram");
        messageRam.Authorization.add(new AccountPermission(payer, "active"));

        buyRamMessageData.Payer = new AccountName(payer);
        buyRamMessageData.Receiver = new AccountName(newAccountName);
        buyRamMessageData.Quant = ramAmount;

        messageRam.Data = buyRamMessageData;
        transaction.Actions.add(messageRam);

        //抵押CPU NET
        Action messageDelegate = new Action();
        DelegatebwMessageData delegatebwMessageData = new DelegatebwMessageData();

        messageDelegate.Account = new AccountName("eosio");
        messageDelegate.Name = new AccountName("delegatebw");
        messageDelegate.Authorization.add(new AccountPermission(payer, "active"));

        delegatebwMessageData.From = new AccountName(payer);
        delegatebwMessageData.Receiver = new AccountName(newAccountName);
        delegatebwMessageData.StakeNetQuantity = netQuantity;
        delegatebwMessageData.StakeCpuQuantity = cpuQuantity;
        delegatebwMessageData.Transfer = 0;//抵押是否转移

        messageDelegate.Data = delegatebwMessageData;
        transaction.Actions.add(messageDelegate);

        //签名
        transaction.Signature.add(eos.getEosPrivateKey().sign(transaction.getSignHash()).eosEncoding(true));

       return transaction.toJson().toString(4);
chenluyong commented 6 years ago

你的逻辑看起来是合理的。

linyujun commented 6 years ago

签名结果如下,似乎不可以通过http://127.0.0.1:8888/v1/chain/push_transaction这样的接口发送到节点

{ "compression": "none", "signatures": [ "SIG_K1_KZePNm9g9XCXWYTMhb6Cv8HNBSNmXH89Xmf2Mb44t5WtcLyRv4mNMJfYE4wC3VzdsWUYJiYeeg7vzGwkNjuJJ4VkyZKXxU" ], "packed_trx": "e1bf495b6400f3030000000000000100000000004c9597000000572d3ccdcd01000000000000a68b00000000a8ed323221000000000000a68b0000000080a99ff6602a9d000000000005535953000000000000" }

chenluyong commented 6 years ago

后续我们会推出注册账号的测试用例,希望您能订阅本项目,以保证第一时间接收关于该项目的动态。

linyujun commented 6 years ago

感谢,已经实现了,谢谢