我又要对以太坊“动手”了:跟我一起用 Java 和 web3j 进行以太坊 Token 开发吧!...

      

作者| Nicolas Schapeler

译者 | 天道酬勤,责编| Carol

出品| 区块链大本营(ID:blockchain_camp

作者最近写了一篇有关开始使用Android进行以太坊开发的文章,其中演示了如何在Android中设置web3j以及如何传输以太币。发布后,作者收到读者留言,想看看有关使用web3j与自定义ERC20Token进行交互的内容,所以就有了今天这篇文章。

文中将使用作者创建的基本 ERC20 智能合约 JavaToken,将使用它及其所在的存储库进行演示,届时将在上面部署和运行的网络将是使用Truffle的本地Ganache Testnet。

JavaToken

https://github.com/nschapeler/EthereumJ-Smart-Contract/blob/master/Truffle/contracts/JavaToken.sol  

准备:生成智能合约Java包装器

这个准备是为我们的智能合约获取一个Java包装器。之所以要执行这一步,是因为从技术上讲,如果你的合约已经部署,则不是强制性的,但是在以后与合约进行交互时,它将使事情变得容易得多。

为此,请先使用Solidity编译器编译Solidity合约。如果你使用的是Truffle,则只需在JavaToken存储库的Truffle目录中运行以下命令即可:

truffle compile
接下来,安装web3j命令行界面。

Mac / Linux用户执行以下操作:

curl -L get.web3j.io | sh
Windows用户执行以下操作:

Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/web3j/web3j-installer/master/installer.ps1'))

现在我们已经安装了所有内容,只需运行以下代码:

web3j truffle generate Truffle/build/contracts/JavaToken.json -o src -p com.javaToken 

从JavaToken目录中,这将为JavaToken智能合约生成一个包装器,以使其在以太坊中的交互更加容易。

 

步骤1:部署合约

 

为了部署Token,我们设置了一些凭据,并简单地使用它们调用deploy()方法。

// The Ganache TestNet listens at port 7545
Web3j w3 = Web3j.build(new HttpService("HTTP://127.0.0.1:7545"));
String privateKey = "YourPrivateKeyHere";
Credentials credentials = Credentials.create(privateKey);
// Sets the initial supply of JavaTokens in existence
BigInteger initialSupply = BigInteger.valueOf(100000);


JavaToken javaToken = JavaToken.deploy(w3, credentials, new DefaultGasProvider(), initialSupply).send()

然后,你就部署了一个全新的以太坊Token!

另外,如果你的合约已经部署并且只想与之交互,则可以使用以下命令简单地加载:

// The Ganache TestNet listens at port 7545
Web3j w3 = Web3j.build(new HttpService("HTTP://127.0.0.1:7545"));
String privateKey = "YourPrivateKeyHere";
Credentials credentials = Credentials.create(privateKey);
String contractAddress = "YourContractAddress";


JavaToken javaToken = JavaToken.load(contractAddress,w3,credentials,new DefaultGasProvider());

步骤2:取得平衡

 

合约配置为向其部署者提供整个初始供应。让我们检查一下我们是否真的配置齐全。如果我们从准备那一步开始使用包装器,这很简单:

// With java wrapper
BigInteger balance = javaToken.balanceOf(credentials.getAddress()).send()


// Without java wrapper
String contractAddress = "YourDeployedContractAddress";


// Define the function we want to invoke from the smart contract
Function function = new Function("balanceOf", Arrays.asList(new Address(credentials.getAddress())),
                                 Arrays.asList(new TypeReference<Uint256>() {}));


// Encode it for the contract to understand
String encodedFunction = FunctionEncoder.encode(function);


/*
Send the request and wait for the response using eth call since
it's a read only transaction with no cost associated
*/
EthCall response = w3.ethCall(
  Transaction.createEthCallTransaction(credentials.getAddress(), contractAddress, encodedFunction),
  DefaultBlockParameterName.LATEST).send();


balance = Numeric.toBigInt(response.getValue

否则,它会变得更加复杂:首先,我们需要在交易中手动输入要在合约中调用的函数的详细信息,在这种情况下,它的名称是balanceOf,我们提供的参数是一个地址,我们想要返回uint256的函数。

然后,我们对这些数据进行编码,并将其与我们希望发送的合约以及来自调用方(我们的地址)的合约一起放入交易中。最后,我们将十六进制结果解码为一个BigInteger。 

现在,我们有了100.000个JavaToken。让我们发送一些给朋友!

步骤3:转移一些Token

 

同样,拥有包装器和不具有包装器之间的差异非常明显:

String addressTo = "YourFriendsAddress";
BigInteger amount = BigInteger.valueOf(500);


// With java wrapper
TransactionReceipt receipt = javaToken.transfer(addressTo,amount).send();


// Without java wrapper


// Define the function we want to invoke from the smart contract
Function function = new Function("transfer", Arrays.asList(new Address(addressTo), new Uint256(amount)),
                                 Collections.emptyList());


// Encode it for the contract to understand
String encodedFunction = FunctionEncoder.encode(function);


/*
Need to use a TransactionManager here since transfer actually alters the state of the blockchain
and credentials are therefore relevant
*/
TransactionManager transactionManager = new FastRawTransactionManager(w3, credentials);




// Send the transaction off using transactionManager and wait for the hash
String transactionHash = transactionManager.sendTransaction(DefaultGasProvider.GAS_PRICE,
                                                            DefaultGasProvider.GAS_LIMIT, contractAddress, encodedFunction,
                                                            BigInteger.ZERO).getTransactionHash();


// Fetch the transaction receipt
Optional<TransactionReceipt> transactionReceipt =
  w3.ethGetTransactionReceipt(transactionHash).send().getTransactionReceipt();
if(transactionReceipt.isEmpty())
  receipt = null;
else
  receipt = transactionReceipt

这次有点不同,没有包装器因为需要实际证明这笔交易来自我们的账户,我们不是像以前那样读取数据来改变区块链的状态,是通过转移Token。

以同样的方式创建一个函数对象。尽管智能合约功能返回的是布尔值,但我们在此处未指定它是因为我们不需要它,因为我们正在通过交易收据检查交易是否成功,因此我们将返回值指定为一个空列表。接下来,我们创建一个事务管理器。 

这种区别很重要,因为所说的管理员将我们的凭证作为参数,这意味着通过它发送的交易将归于我们(与上面的balanceOf调用不同)。最后,我们发送交易,并通过检查收据确认交易是否成功。

 结论

 

基于上述内容,你刚刚学习了如何使用 web3j 部署自己的 ERC20 Token。如果有想继续研究的小伙伴,

相关的所有代码都可以在这里找到哦:

https://github.com/nschapeler/JavaToken

原文:https://hackernoon.com/ethereum-token-development-using-java-and-web3j-an-overview-spas324r

本文为区块链大本营翻译,转载请经授权。

推荐阅读

老铁们求在看! ????

发布了891 篇原创文章 · 获赞 4140 · 访问量 375万+

猜你喜欢

转载自blog.csdn.net/Blockchain_lemon/article/details/105721199