首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过ethereumj发送代币。如何为事务创建数据块?

通过ethereumj发送代币。如何为事务创建数据块?
EN

Ethereum用户
提问于 2018-04-04 15:46:35
回答 1查看 265关注 0票数 1

我试图在testnet中发送等离子体令牌,但不幸的是,我误解了应该如何正确地创建事务。

我试着像这样创建tx:

代码语言:javascript
复制
String privateKeyString = "xxx";
BigInteger bigInteger = new BigInteger(privateKeyString, 16);
ECKey ecKey = ECKey.fromPrivate(bigInteger);

String plasmaContrtactAddress = "0x95D7321EdCe519419ba1DbC60A89bAfbF55EAC0D";

Transaction ethTx = new Transaction(
     nonce,
     gasPrice,
     gasLimit,
     plasmaContrtactAddress,
     value,
     data);

ethTx.sign(ecKey)

但是我应该如何正确地创建byte[]数据呢?这里是用于等离子体的json接口:

代码语言:javascript
复制
/*
* 提示:该行代码过长,系统自动注释不进行高亮。一键复制会移除系统注释 
/*
* 提示:该行代码过长,系统自动注释不进行高亮。一键复制会移除系统注释 
* * [{"constant":true,"inputs":[],"name":"message","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ViewerStatus","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ViewerValue","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenRateEther","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"Login","type":"string"}],"name":"registrationFromLogin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"MainAccount","type":"address"},{"name":"ActiveAliasAccount","type":"bool"},{"name":"ActiveMainAccount","type":"bool"},{"name":"PromilleDeposit","type":"uint256"},{"name":"DeleteMainAccount","type":"bool"}],"name":"setupAccount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"NewPIN","type":"uint256"}],"name":"setupAccountPIN","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"deleteLogin","type":"string"},{"name":"newLogin","type":"string"}],"name":"setupLoginVipAccount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"MainAccount","type":"address"}],"name":"setupAliasAccount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"Account","type":"address"},{"name":"Freezen","type":"bool"}],"name":"frozenSubAccount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"Account","type":"address"}],"name":"buyVipStatusPay","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"buyTokenPay","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"toTransferETHER","type":"address"},{"name":"microToken","type":"uint256"},{"name":"SellDeposit","type":"bool"}],"name":"sellToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"login","type":"string"},{"name":"password","type":"string"}],"name":"depositaryPay","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"Account","type":"address"},{"name":"microToken","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"Login","type":"string"},{"name":"PIN","type":"uint256"}],"name":"transferFromLoginPay","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"Login","type":"string"}],"name":"transferToLoginPay","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"microToken","type":"uint256"}],"name":"returnDepositToBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"SubAccount","type":"address"},{"name":"PIN","type":"uint256"}],"name":"transferProtectPay","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"PIN","type":"uint256"}],"name":"unblockTransferProtectPay","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"SubAccount","type":"address"},{"name":"pinSubAccount","type":"uint256"},{"name":"promilleRefund","type":"uint256"}],"name":"transferRefundSubAccountPay","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"MainAccount","type":"address"},{"name":"pinMainAccount","type":"uint256"},{"name":"SubAccount","type":"address"},{"name":"pinSubAccount","type":"uint256"},{"name":"promilleReferee","type":"uint256"}],"name":"refereeTransferProtect","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"VipAccount","type":"bool"},{"name":"ActiveAliasAccount","type":"bool"},{"name":"ActiveMainAccount","type":"bool"},{"name":"MainAccount","type":"address"},{"name":"MyReferralAccount","type":"address"}],"name":"MyAccountStatus","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"Deposit","type":"bool"},{"name":"PromilleDeposit","type":"bool"},{"name":"ZoneToken","type":"bool"}],"name":"MyAccountValue","outputs":[{"name":"value","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"myMessage","type":"string"}],"name":"advertisingPay","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"}],"name":"burnToken","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"microToken","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":false,"name":"Message","type":"string"}],"name":"Advertising","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":false,"name":"microToken","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"PriceVipAccountMicroEther","type":"uint256"},{"indexed":false,"name":"TransferTokensFeeInPromille","type":"uint256"},{"indexed":false,"name":"BonusForZone1InPromille","type":"uint256"},{"indexed":false,"name":"BonusForZone2InPromille","type":"uint256"},{"indexed":false,"name":"BonusForZone3InPromille","type":"uint256"},{"indexed":false,"name":"BonusForZone4InPromille","type":"uint256"},{"indexed":false,"name":"BonusForZone5InPromille","type":"uint256"}],"name":"OptionsContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"microETHER","type":"uint256"}],"name":"TokenSellingRate","type":"event"}]
*/
*/

及收款人地址:

代码语言:javascript
复制
0xEA8e872b51d76D690E4779F9AC403cf18B8460Fe

我如何用ethereumJ库或人工实现这一点呢?

更新:

首先,感谢清洁独角兽给出的答案。

除了上面的代码--用于传输令牌的byte[]数据的我的版本:

代码语言:javascript
复制
public byte[] createTransferData(String addressTo, @NonNull String value) {

    String functionSig = "0xa9059cbb"; // transfer
    byte[] functionBytes = ByteUtil.hexStringToBytes(functionSig);

    byte[] addressSrc = Hex.decode(Numeric.cleanHexPrefix(addressTo));
    byte[] emptyBytesAddress = new byte[32 - addressSrc.length];
    addressSrc = ByteUtil.merge(emptyBytesAddress, addressSrc);

    BigInteger bigInteger = new BigInteger(value);
    byte[] valueSrc = ByteUtil.hexStringToBytes(bigInteger.toString(16));

    // here we should calculate bytes' count of our hex value
    // and if we are out of bounds of the count/32 - we should provide 32 bytes extra
    int additionalEmptyBytes = 32 - (valueSrc.length - (valueSrc.length / 32) * 32);
    if (additionalEmptyBytes != 0) {
        valueSrc = ByteUtil.merge(new byte[additionalEmptyBytes], valueSrc);
    }

    return ByteUtil.merge(functionBytes, addressSrc, valueSrc);
}

这是ByteUtils类。

如果有人知道如何通过ethereumJ或更快地实现它-请提供您的答案。

EN

回答 1

Ethereum用户

回答已采纳

发布于 2018-04-04 16:58:59

我没有使用ethereumJ的经验,但是为了发送令牌,您需要将事务发送到令牌智能契约。

似乎您正在尝试与Plasma token契约进行交互。

data参数需要有3个组件

  • 正在调用的函数的签名

这是transfer(address,uint256)的签名,它被翻译成

0xa9059cbb

  • 令牌的目的地

您的目的地是0xEA8e872b51d76D690E4779F9AC403cf18B8460Fe,这需要32字节填充。

000000000000000000000000ea8e872b51d76d690e4779f9ac403cf18b8460fe

  • 发送了多少代币?

让我们假设您正在尝试发送1000个令牌,在十六进制中这意味着0x3e8,同样是32字节填充。

00000000000000000000000000000000000000000000000000000000000003e8

将所有这些放在一起,您的data参数应该如下所示

0xa9059cbb000000000000000000000000ea8e872b51d76d690e4779f9ac403cf18b8460fe00000000000000000000000000000000000000000000000000000000000003e8

有一个易于使用的工具可以帮助您手动解决这个问题。

https://jimkberry.github.io/eth-contractor/

还有另一个工具可以帮助您找到您所提供的任何ABI或函数的签名。

https://github.com/cleanunicorn/abi2signature

票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/44770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档