如果要下载整个以太坊区块链并保持本地节点同步。当区块链占用了我计算机上超过 100GB 的空间。这在台式计算机上可能有意义,但在移动设备上则不太合理。
解决此限制的一种方法是使用像 Infura 这样的服务。Infura 允许你连接到远程以太坊节点并执行交易,而无需担心维护和同步本地节点。
为了能够使用本机 Java 代码与智能合约进行交易,我们使用一个名为 Web3j 的库。Web3j 为你提供生成智能合约 java 封装包的实用程序,以及通过 HTTP 和 IPC 完整实现以太坊的 JSON-RPC 客户端 API。它提供了更多功能,但刚说的这些对这个“ Android Ethereum hello world ”示例来说最重要的功能。
我想要与之互动的示例智能合约是一个 Greeter。它在区块链上存储可以读取或更新的问候消息。它看起来像这样:
contract greeter is mortal {
/* define variable greeting of the type string */
string greeting;
/* this runs when the contract is executed */
function greeter(string _greeting) public {
greeting = _greeting;
}
/* change greeting */
function changeGreeting(string _greeting) public {
greeting = _greeting;
}
/* main function */
function greet() constant returns (string) {
return greeting;
}
}
为了能够创建封装包,我们首先要编译这个智能合约:
solc greeter.sol --bin --abi --optimize -o <output-dir>/
要生成运行的封装包:
web3j solidity generate /path/to/<smart-contract>.bin /path/to/<smart-contract>.abi -o /path/to/src/main/java -p com.your.organisation.name
首先,我们需要获得以太坊区块链交互的 Web3 实例。它看起来像这样:
InfuraHttpService infuraHttpService = new InfuraHttpService(url);
Web3j web3j = Web3jFactory.build("https://ropsten.infura.io/YOUR_API_KEY");
现在我们可以读取合约几乎是即时的。
Greeter greeter = Greeter.load(greeterContractAddress, web3j, credentials, gasPrice, gasLimit);
Future<Utf8String> greeting = greeter.greet();
Utf8String greetingUtf8 = greeting.get();
String result = greetingUtf8.getValue();
但交易不是即时的,可能需要几分钟才能得到验证。
Greeter greeter = Greeter.load(greeterContractAddress, web3j, credentials, gasPrice, gasLimit);
TransactionReceipt transactionReceipt = greeter.changeGreeting(new Utf8String(greetingToWrite)).get(timeout);
String result = "Successful transaction. Gas used: " + transactionReceipt.getGasUsed();
如果希望快速进行 web3j、java、以太坊开发,那请看这个github,主要是针对 java 和 android 程序员进行区块链以太坊开发的 web3j 详解。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.