Ich verwende derzeit die Version 0.2xx der Web3-JavaScript-API. Ich habe mein benutzerdefiniertes ERC20-Token bereitgestellt, indem ich Smart Contract in Solidity (auf REMIX IDE) erstellt habe. Ich habe die MetaMask installiert und einen Test gemacht https://wallet.ethereum.org/ um ein benutzerdefiniertes ERC-Token an ein anderes my-Konto zu senden. Es hat gut funktioniert. Ich möchte die Funktion „benutzerdefiniertes ERC20-Token senden“ in meinem JavaScript-Code mit Web3js hinzufügen.
Hier ist mein Code unten.
var http = require('http');
var Web3 = require('web3');
var Tx = require('ethereumjs-tx');
var abi = [{"...."}];
var data="0x00..";
var contract_addr="0x00..";
var owner="0x00..";
var web3 = new Web3(new Web3.providers.HttpProvider("https://ropsten.infura.io/"));
web3.eth.getBlock("latest", (error, result) => {
//console.log('error:', error);
//console.log('results', result);
});
var myContract = web3.eth.contract(abi);
var myContractInstance = myContract.at(address);
eb3.eth.getDefaultAccount = owner;
var defaultAccount = web3.eth.getDefaultAccount;
console.log('DefaultAccount => ', defaultAccount);
var total = myContractInstance.totalSupply();
var balance = myContractInstance.balanceOf(defaultAccount);
console.log('DefulatAccount total => ',total);
console.log('DefaultAccount balance => ',balance);
var to = '0x00..';
var isAddress = web3.isAddress(to);
console.log('isAddress(to) => ',isAddress);
console.log('balanceOf(to) => ',myContractInstance.balanceOf(to));
Ich arbeite am ‘Ropsten Testnet’ und habe einige ‘Ether’ zum Testen geschickt sendRawTransaction(). Aber was ich tun möchte, ist nur mein benutzerdefiniertes ERC20-Token zu senden. nicht der Äther. Wie kann ich mein eigenes Token in diesem Skript senden? Ich habe keine Ahnung. Ich habe versucht zu verwenden sendTransaction() Wie unten.
var rawTx = {
from : defaultAccount,
nonce : nonceHex,
gasPrice : gasPriceHex,
gas : gasHex,
to : to,
value : 100,
data : data
};
web3.eth.sendTransaction(rawTx, function(err, transactionHash) {
if (!err)
console.log('transactionHash => ',transactionHash);
else
console.log(err);
});
Ich habe den Fehler ständig erhalten.
Error: Invalid JSON RPC response: ""
at Object.InvalidResponse (/Users/rachel/dev/test/node_modules/web3/lib/web3/errors.js:38:16)
at XMLHttpRequest.request.onreadystatechange (/Users/rachel/dev/test/node_modules/web3/lib/web3/httpprovider.js:119:24)
at XMLHttpRequestEventTarget.dispatchEvent (/Users/rachel/dev/test/node_modules/xhr2/lib/xhr2.js:64:18)
at XMLHttpRequest._setReadyState (/Users/rachel/dev/test/node_modules/xhr2/lib/xhr2.js:354:12)
at XMLHttpRequest._onHttpResponseEnd (/Users/rachel/dev/test/node_modules/xhr2/lib/xhr2.js:509:12)
at IncomingMessage.<anonymous> (/Users/rachel/dev/test/node_modules/xhr2/lib/xhr2.js:469:24)
at emitNone (events.js:111:20)
at IncomingMessage.emit (events.js:208:7)
at endReadableNT (_stream_readable.js:1056:12)
at _combinedTickCallback (internal/process/next_tick.js:138:11)
Ich kann wirklich nicht verstehen, was daran falsch ist. Bitte lassen Sie mich wissen, wie ich damit umgehen kann. Vielen Dank!
LF00
Nehmen Sie als Beispiel die EOS-Token-Übertragung.
Unten Code erforderlich web3 und ethereumjs-tx. Wenn Sie sie nicht installiert haben, installieren Sie sie mit npm install web3 ethereumjs-tx
var Tx = require('ethereumjs-tx');
var Web3 = require('web3')
var web3 = new Web3(new Web3.providers.HttpProvider('http://127.0.0.1:8545/'))
// set token source, destination and amount
var myAddress = "0xaa597b7e8aaffe9f2a187bedb472ef3455957560"
var toAddress = "0xa013927bffe9e879134061b9330a01884a65497c"
var amount = web3.utils.toHex(1e16)
// get transaction count, later will used as nonce
web3.eth.getTransactionCount(myAddress).then(function(v){console.log(v); count = v})
// set your private key here, we'll sign the transaction below
var privateKey = new Buffer('6d...', 'hex')
// Get abi array here https://etherscan.io/address/0x86fa049857e0209aa7d9e616f7eb3b3b78ecfdb0#code
var abiArray = [{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"bytes32"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"stop","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"guy","type":"address"},{"name":"wad","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"owner_","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"src","type":"address"},{"name":"dst","type":"address"},{"name":"wad","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"dst","type":"address"},{"name":"wad","type":"uint128"}],"name":"push","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"name_","type":"bytes32"}],"name":"setName","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"wad","type":"uint128"}],"name":"mint","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"src","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"stopped","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"authority_","type":"address"}],"name":"setAuthority","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"src","type":"address"},{"name":"wad","type":"uint128"}],"name":"pull","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"wad","type":"uint128"}],"name":"burn","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"bytes32"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"dst","type":"address"},{"name":"wad","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"start","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"authority","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"src","type":"address"},{"name":"guy","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"inputs":[{"name":"symbol_","type":"bytes32"}],"payable":false,"type":"constructor"},{"anonymous":true,"inputs":[{"indexed":true,"name":"sig","type":"bytes4"},{"indexed":true,"name":"guy","type":"address"},{"indexed":true,"name":"foo","type":"bytes32"},{"indexed":true,"name":"bar","type":"bytes32"},{"indexed":false,"name":"wad","type":"uint256"},{"indexed":false,"name":"fax","type":"bytes"}],"name":"LogNote","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"authority","type":"address"}],"name":"LogSetAuthority","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"}],"name":"LogSetOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}]
// Here you may get the abicode from a string or a file, here is a string case
// var abiArray = JSON.parse('[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"bytes32"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"stop","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"guy","type":"address"},{"name":"wad","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"owner_","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"src","type":"address"},{"name":"dst","type":"address"},{"name":"wad","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"dst","type":"address"},{"name":"wad","type":"uint128"}],"name":"push","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"name_","type":"bytes32"}],"name":"setName","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"wad","type":"uint128"}],"name":"mint","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"src","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"stopped","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"authority_","type":"address"}],"name":"setAuthority","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"src","type":"address"},{"name":"wad","type":"uint128"}],"name":"pull","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"wad","type":"uint128"}],"name":"burn","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"bytes32"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"dst","type":"address"},{"name":"wad","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"start","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"authority","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"src","type":"address"},{"name":"guy","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"inputs":[{"name":"symbol_","type":"bytes32"}],"payable":false,"type":"constructor"},{"anonymous":true,"inputs":[{"indexed":true,"name":"sig","type":"bytes4"},{"indexed":true,"name":"guy","type":"address"},{"indexed":true,"name":"foo","type":"bytes32"},{"indexed":true,"name":"bar","type":"bytes32"},{"indexed":false,"name":"wad","type":"uint256"},{"indexed":false,"name":"fax","type":"bytes"}],"name":"LogNote","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"authority","type":"address"}],"name":"LogSetAuthority","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"}],"name":"LogSetOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}]', 'utf-8')
var contractAddress="0x86Fa049857E0209aa7D9e616F7eb3b3B78ECfdb0"
var contract = new web3.eth.Contract(abiArray, contractAddress, {from: myAddress})
var rawTransaction = {"from":myAddress, "gasPrice":web3.utils.toHex(2 * 1e9),"gasLimit":web3.utils.toHex(210000),"to":contractAddress,"value":"0x0","data":contract.methods.transfer(toAddress, amount).encodeABI(),"nonce":web3.utils.toHex(count)}
var transaction = new Tx(rawTransaction)
transaction.sign(privateKey)
web3.eth.sendSignedTransaction('0x' + transaction.serialize().toString('hex'))
// check the balance
contract.methods.balanceOf(myAddress).call().then(function(balance){console.log(balance)})
Ab Juli 2018 ist dieser Beitrag eher irreführend. Kris bezog sich auf das kanonische EOS ERC20-Token auf Ethereum. In der Zwischenzeit ist EOS gestartet und sie haben ihre eigene Landeswährung.
– Paul Razvan Berg
28. Juli 2018 um 16:30 Uhr
Hier beziehen Sie sich auf EOS-Token auf Ethereum, nicht auf EOS-Coins.
– LF00
29. Juli 2018 um 2:35 Uhr
Fehler: Ungültige JSON-RPC-Antwort: „“ bedeutet, dass web3 keine Verbindung zum RPC-Knoten herstellen kann. Versuchen Sie, einen mit :: auszuführen
Hier ist „an“ die Adresse, an die Sie Token senden möchten
‘Menge‘ Anzahl der Token, die Sie senden möchten
‘SchätzungGas‘Gaslimit, das Sie von der Transaktionsausführung setzen möchten
‘gasPreis‘ Preis jeder Gaseinheit in Wei
‘vonAdr‘ die Adresse, von der Sie diese Token senden möchten. Da die Transaktion mit dieser Adresse signiert wird, sollte dies die Adresse sein, die in der Metamask ausgewählt oder an infura übergeben wird
‘nonceis‘Nonce für die Transaktion
Wir können es nur mit „Äthern“ tun. In diesem Fall verwende ich Backend-API mit Knoten js.
const fs = require('fs');
const express = require('express');
const router = express.Router();
const { ethers, BigNumber } = require('ethers');
const ethUtil = require('ethereumjs-util');
const BridgeEth = require("../../client/src/components/contract/EthBridge.json");
const BridgeBsc = require("../../client/src/components/contract/BridgeBsc.json");
const addresses = require("../../client/src/components/contract/config.json");
const eth_bridge = addresses.eth_bridge;
const bsc_bridge = addresses.bsc_bridge;
const net_config = require("../../net.config.json");
const ethnet = net_config.eth_url;
const bscnet = net_config.bsc_url;
const eth_provider = new ethers.providers.JsonRpcProvider(ethnet);
const bsc_provider = new ethers.providers.JsonRpcProvider(bscnet);
const eth_contract = new ethers.Contract(eth_bridge, BridgeEth, eth_provider);
const bsc_contract = new ethers.Contract(bsc_bridge, BridgeBsc, bsc_provider);
var privateKey = fs.readFileSync('./secret', 'utf-8');
const adminaccount = {
publicKey: net_config.admin_public_key,
privateKey: privateKey
}
console.log(`Admin account is ${adminaccount.publicKey}`);
const adminEthWallet = new ethers.Wallet(adminaccount.privateKey, eth_provider);
const adminBscWallet = new ethers.Wallet(adminaccount.privateKey, bsc_provider);
const signedEthContract = eth_contract.connect(adminEthWallet);
const signedBscContract = bsc_contract.connect(adminBscWallet);
const sig = "0x6162636400000000000000000000000000000000000000000000000000000000";
router.post('/eth2bsc', async (req, res) => {
var account = req.body.account;
var amount = req.body.amount;
var signature = req.body.signature;
var msg = req.body.hash;
const isValidAddress = ethUtil.isValidAddress(account);
const isValidAmount = amount > 0;
const isValidSign = ethUtil.isHexPrefixed(String(signature));
const isValidHash = ethUtil.isHexPrefixed(String(msg));
if (!(isValidAddress && isValidAmount && isValidSign && isValidHash)) {
return res.status(500).json({ step: 1, message: `Security error! Server received invalid prams!${isValidAddress}, ${amount}, ${isValidSign}, ${isValidHash}` });
}
var msgBuffer="";
var msgHash="";
var signatureBuffer="";
try {
msgBuffer = ethUtil.toBuffer(msg);
msgHash = ethUtil.hashPersonalMessage(msgBuffer);
signatureBuffer = ethUtil.toBuffer(signature);
} catch (e) {
return res.status(500).json({ step: 1, message: 'Security error! Request with invalid params!' })
}
const signatureParams = ethUtil.fromRpcSig(signatureBuffer);
const publicKey = ethUtil.ecrecover(msgHash, signatureParams.v, signatureParams.r, signatureParams.s);
const adddressBuffer = ethUtil.publicToAddress(publicKey);
const address = ethUtil.bufferToHex(adddressBuffer);
console.log(`recvered address is ${address}`);
const isMatched = account.toLowerCase() == address.toLowerCase();
if (!isMatched) {
return res.status(500).json({ step: 1, message: 'Security error! Transaction caller is not signer!' })
}
console.log(`I will burn BSCFloki from ${account}`)
try {
var tx = await signedEthContract.burn(account, BigNumber.from(String(amount * Math.pow(10, 18))), 0, sig)
console.log(tx.hash);
console.log("First transaction successed(ETHFloki burned)");
} catch (e) {
console.log("Transaction to burn ETHFloki faild");
return res.status(500).json({ step: 1, message: 'Transaction Faild! \nCheck your account and token balance.' })
}
console.log(`I will mint BSCFloki to ${account}`)
try {
var tx1 = await signedBscContract.mint(account, account, BigNumber.from(String(amount * Math.pow(10, 18))), 0, sig);
console.log(tx1.hash);
console.log("Second transaction successed(BSCFloki minted)");
} catch (e) {
console.log("Transanction to mint BSCFloki faild");
return res.status(500).json({ step: 2, message: 'Transaction Faild! \nCheck your account.' })
}
return res.send(`Success! \n ${amount} ETHFloki converted to ${amount} BSCFloki in your wallet.`);
});
router.post('/bsc2eth', async (req, res) => {
var account = req.body.account;
var amount = req.body.amount;
var signature = req.body.signature;
var msg = req.body.hash;
const isValidAddress = ethUtil.isValidAddress(account);
const isValidAmount = amount > 0;
const isValidSign = ethUtil.isHexPrefixed(String(signature));
const isValidHash = ethUtil.isHexPrefixed(String(msg));
if (!(isValidAddress && isValidAmount && isValidSign && isValidHash)) {
return res.status(500).json({ step: 1, message: 'Security error! Server received invalid prams!' });
}
var msgBuffer="";
var msgHash="";
var signatureBuffer="";
try {
msgBuffer = ethUtil.toBuffer(msg);
msgHash = ethUtil.hashPersonalMessage(msgBuffer);
signatureBuffer = ethUtil.toBuffer(signature);
} catch (e) {
return res.status(500).json({ step: 1, message: 'Security error! Request with invalid params!' })
}
const signatureParams = ethUtil.fromRpcSig(signatureBuffer);
const publicKey = ethUtil.ecrecover(msgHash, signatureParams.v, signatureParams.r, signatureParams.s);
const adddressBuffer = ethUtil.publicToAddress(publicKey);
const address = ethUtil.bufferToHex(adddressBuffer);
console.log(`recvered address is ${address}`);
const isMatched = account.toLowerCase() == address.toLowerCase();
if (!isMatched) {
return res.status(500).json({ step: 0, message: 'Security error! Transaction caller is not signer!' })
}
console.log(`I will burn BSCFloki from ${account}`)
try {
var tx = await signedBscContract.burn(account, BigNumber.from(String(amount * Math.pow(10, 18))), 0, sig)
console.log(tx.hash);
console.log("First transaction successed(BTK burned)");
} catch (e) {
console.log("Transaction to burn ETHFloki faild");
return res.status(500).json({ step: 1, message: 'Transaction Faild! \nCheck your account and token balance.' })
}
console.log(`I will mint ETHFloki to ${account}`)
try {
var tx1 = await signedEthContract.mint(account, account, BigNumber.from(String(amount * Math.pow(10, 18))), 0, sig);
console.log(tx1.hash);
console.log("Second transaction successed(ETHFloki minted)");
} catch (e) {
console.log("Transaction to mint ETHFloki faild");
return res.status(500).json({ step: 2, message: 'Transaction Faild! \nCheck your account.' })
}
return res.send(`Success! \n ${amount} BSCFloki converted to ${amount} ETHFloki in your wallet.`);
});
module.exports = router;
Diese API signiert die Anfrage des Clients und sendet die Transaktion mit signierter Brieftasche und ihrem privaten Schlüssel.
10153900cookie-checkSo senden Sie ein ERC20-Token mit web3jsyes