我试图在testnet中发送等离子体令牌,但不幸的是,我误解了应该如何正确地创建事务。
我试着像这样创建tx:
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接口:
/*
* 提示:该行代码过长,系统自动注释不进行高亮。一键复制会移除系统注释
/*
* 提示:该行代码过长,系统自动注释不进行高亮。一键复制会移除系统注释
* * [{"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"}]
*/
*/及收款人地址:
0xEA8e872b51d76D690E4779F9AC403cf18B8460Fe我如何用ethereumJ库或人工实现这一点呢?
首先,感谢清洁独角兽给出的答案。
除了上面的代码--用于传输令牌的byte[]数据的我的版本:
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或更快地实现它-请提供您的答案。
发布于 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://ethereum.stackexchange.com/questions/44770
复制相似问题