Senden Sie benutzerdefinierte ERC20-Token von einer Adresse an eine andere

So senden Sie benutzerdefinierte ERC20-Token von einer Brieftasche an eine andere, wenn ich benutzerdefinierte EBTC/ECASH-ERC20-Token senden möchte.

Ich habe eine Methode geschrieben, die den Ether von einem Konto zum anderen senden kann, wie könnte ich dasselbe für Nicht-Ether-Transaktionen tun?

public static void sendCustomToken(String privateKey,String toAccount, double amount) throws Exception{ 

Web3j web3 = Web3j.build(new HttpService("http://localhost:8180/")); 
BigInteger key = new BigInteger(privateKey,16); 
ECKeyPair ecKeyPair = ECKeyPair.create(key.toByteArray()); 
Credentials credentials = Credentials.create(ecKeyPair); 
TransactionReceipt transactionReceipt = Transfer.sendFundsAsync( web3, credentials, toAccount, BigDecimal.valueOf(amount), Convert.Unit.ETHER).get(); 

System.out.println("Transaction Hash:"+transactionReceipt.getTransactionHash());
}

Benutzerdefiniertes Token: eBTC-Vertragsadresse: 0x2fd41f516fac94ed08e156f489f56ca3a80b04d0 Token-Dezimalstellen: 8

Irgendwelche Hilfen oder Hinweise?

Antworten (2)

Ich gehe davon aus, dass Sie Web3j und einen bereitgestellten Smart Contract verwenden, der die ERC20-Schnittstelle implementiert, wobei die Übertragungsmethode wie folgt aussieht:

function transfer(address _to, uint256 _value) public returns (bool success) {
    require(balances[msg.sender] >= _value && _value > 0);
    balances[msg.sender] -= _value;
    balances[_to] += _value;
    return true;
}

Sie können den web3j-Wrapper für Ihren Vertrag verwenden, um Vertragsmethoden auf einem Blockahain aufzurufen. Angenommen, Ihr Contract-Dateiname lautet MyContract.sol, dann benötigen Sie den Solc- Compiler und das Web3j- Tool und tun Folgendes in Ihrer Konsole:

$ solc {contract}.sol --bin --abi --optimize -o {output-dir}/

Dadurch werden .abiund .binDateien generiert, aus denen Sie eine Java-Wrapper-Klasse generieren:

$ web3j solidity generate /path/to/<smart-contract>.bin /path/to/<smart-contract>.abi -o /path/to/src/main/java -p com.your.organisation.name

Dadurch wird eine Java-Wrapper-Klasse für Ihren Vertrag erstellt, MyContract.javain der Sie alle im Smart-Vertrag verfügbaren Methoden aufrufen können:

import static org.web3j.tx.Contract.GAS_LIMIT;
import static org.web3j.tx.ManagedTransaction.GAS_PRICE;

//web3j initialization code goes here

//Load the deployed contract:
MyContract contract = MyContract.load(contractAddress, web3j, credentials,     GAS_PRICE, GAS_LIMIT);

//Call methods on the contract:
Future<> result = contract.transfer(_to, _value);

Weitere Informationen zur Arbeit mit Smart Contracts Wrappern finden Sie hier . Ich hoffe, das hilft.

bearbeiten. abiund binfür diesen speziellen Vertrag können Sie von etherscan.io erhalten werden. Sie können Token übertragen, auch wenn Sie nicht der Eigentümer des Vertrags sind. Sie können jedoch nur verfügbare Token auf Ihr eigenes Konto übertragen, wie im Vertrag angegeben:

 function transfer(address _to, uint256 _amount) returns (bool success) {
     if (balances[msg.sender] >= _amount 
        && _amount > 0
         && balances[_to] + _amount > balances[_to]) {
         balances[msg.sender] -= _amount;
         balances[_to] += _amount;
         Transfer(msg.sender, _to, _amount);
        return true;
     } else {
         return false;
     }
 }
Nein, er möchte die benutzerdefinierten ERC20-Token (nicht die eigentlichen Ether) mit Hilfe von Private Keys von einem Konto auf ein anderes (oder einen anderen) übertragen. Der Code, den er gegeben hat, würde nur Ether übertragen, und er versucht jetzt, die benutzerdefinierten ERC20-Token zu übertragen (dh Token, die auf der Ethereum-Blockchain entwickelt wurden).
Ich gehe davon aus, dass ERC20-Token eine Standardschnittstellenimplementierung in Form eines intelligenten Vertrags sind, der auf der Blockchain bereitgestellt werden muss. Diese Schnittstelle unterstützt Methoden zum Senden benutzerdefinierter Token zwischen Konten. Alles, was Sie tun müssen, ist, die transferMethode wie im Beispiel hier zu implementieren und sie von dem Client aufzurufen, den Sie verwenden, Geth, Browser-Solidity oder so.
@ITisha Smart Contract ist bereits in der Blockchain implementiert, wenn ich einige benutzerdefinierte Token aus diesem Vertrag habe, wie soll ich sie dann von einer Wallet-Adresse zu einer anderen übertragen? ps Ich bin nicht der Schöpfer des Smart Contracts.
@srikanth, oh ich denke, ich verstehe es jetzt :) Schau dir diesen Link an . Es beschreibt, wie Sie eine Java-Wrapper-Klasse für Ihren Vertrag erhalten, zum Beispiel haben Sie eine Klasse wie MyContract.class. Der Wrapper verfügt über alle im Vertrag verfügbaren Methoden: MyContract contract = MyContract.load(contractAddress, web3j, credentials, GAS_PRICE, GAS_LIMIT); Future<> result = contract.transfer(_to, _value); Ich würde vorschlagen, die web3j-Dokumentation zu überprüfen, sie sind ziemlich nützlich.
@srikanth Ich habe die ursprüngliche Antwort bearbeitet, hoffe, dass ich den Punkt nicht komplett verpasse :)
@srikanth, wenn Sie nicht der Eigentümer des Vertrags sind, dann ist es eine etwas andere Geschichte. Können Sie den Vertrag anhand seiner Adresse auf Etherscan finden? Dann könnten Sie von dort aus abi und bin haben. Zum Beispiel: rinkeby.etherscan.io/address/…
Danke @ITisha, aber wie lade ich das abi in Java, ich weiß, dass wir das in Javascript über "web3.eth.contract(erc20abi).at(tokenAddress)" tun können, ich sehe keine entsprechende Klasse in Java für web3j
@srikanth die itstructions sind folgende: 1) nehmen Sie abi und binär Ihres Vertrags von hier und erstellen Sie .abi- und .bin-Dateien für sie. 2) Konvertieren Sie diese .abi/.bin-Dateien mit den Befehlszeilentools solc und web3j in die Java-Wrapper-Klasse (laden Sie diese Tools hier herunter: solc , web3j ) 3) Fügen Sie die web3j-Kernbibliothek zu Ihrem Projekt hinzu. 4) Rufen Sie Wrapper-Methoden auf, als wären sie Vertragsmethoden. Ich habe in der Antwort weitere Details hinzugefügt.
Einfach ausgedrückt, Sie erhalten diese Java-Klasse, indem Sie abi und binär Ihres Vertrags mithilfe von solcund web3jBefehlszeilentools konvertieren, dann fügen Sie einfach diese generierte Klasse zu Ihrem Projekt hinzu und verwenden Sie sie, als wäre es Ihr Vertrag.

Inspiriert von @ITisha habe ich ein detaillierteres Beispiel wie unten.

Angenommen, wir wollen als Vertragseigentümer einige „Hundemünzen“ an eine andere Adresse senden .

Arbeit vorbereiten:

  1. MeinVertrag.bin
  2. DogCoin.abi

Schritte:

1. Generieren Sie eine Java-Wrapper-Datei über die Befehlszeile. Beachten Sie, dass macOS und Linux Unterschiede verursachen können. Linux wird empfohlen:

 web3j solidity generate /path/to/MyContract.bin /path/to/DogCoin.abi -o /path/to/src/main/DogCoin.java -p com.your.organisation.name

2.Dann ist unsere Kernfunktion zum Übertragen von Münzen:

public class EthereumTest {


     public static void transferCoins (String toAccount, int coinAmount){


         // if testing, use https://ropsten.etherscan.io/address/[Your contract address]
         Web3j web3 = Web3j.build(new HttpService("https://mainnet.infura.io/[your contract]"));  
         try{

                Web3ClientVersion web3ClientVersion = web3.web3ClientVersion().send();
                String clientVersion = web3ClientVersion.getWeb3ClientVersion();
                System.out.println("clientVersion " + clientVersion);

                String privateKey = "[ contract owner privateKey ]";
                BigInteger key = new BigInteger(privateKey,16); 
                ECKeyPair ecKeyPair = ECKeyPair.create(key.toByteArray()); 
                Credentials credentials = Credentials.create(ecKeyPair); 


                TransactionReceiptProcessor transactionReceiptProcessor = new NoOpProcessor(web3);
                TransactionManager transactionManager = new RawTransactionManager(
                        web3, credentials, ChainId.MAINNET, transactionReceiptProcessor);
                //if testing, use ChainId.ROPSTEN

                // need to use the java wrapper filed generated before
                DogCoin mycontract = DogCoin.load("[Your contract address]", web3, transactionManager, GAS_PRICE, GAS_LIMIT);


                BigInteger _value = BigInteger.valueOf((long) (coinAmount *Math.pow(10, 8)) );


                 try {

                    TransactionReceipt  mReceipt = mycontract.transfer(toAccount, _value).sendAsync().get();

                    String sTransHash = mReceipt.getTransactionHash();


                    System.out.println("toAccount: " + toAccount + " coinAmount: " + coinAmount + " transactionhash: " + sTransHash)

                    // You can view the transaction record on https://etherscan.io/tx/[transaction hash]
                    // if testing , on https://ropsten.etherscan.io/tx/[transaction hash]
                } catch (Exception e) {
                    System.out.println("Ethereum Exception " + e.getMessage());

                }

            }catch(IOException e){
                System.out.println("Ethereum IOException " + e.getMessage());

            }
     }


    public static void main(String[] args) { // unit testing

        String toAccount = "0x1xxxyyyzzz...";

        int coinAmount = 1; // e.g 1 dog coin

        transferCoins(toAccount, coinAmount); 

    }
}

Ein paar Kommentare:

a. Wir verwenden den Transaktionsmanager auf niedriger Ebene, um eine ASYC-Lösung zu erreichen, sodass wir Transaktionshash sofort erhalten können, wenn die Transaktion aussteht.

b. Wir können unseren eigenen GAS_PRICE und GAS_LIMIT definieren, hier verwenden wir den Standardwert der Bibliothek

c. mycontract.transfer() ist eine Methode aus dem Java-Wrapper-Code, der mit dem Vertrag generiert wurde