malakashi
V2EX  ›  区块链

Android 与以太坊智能合约交互

  •  
  •   malakashi · Aug 28, 2018 · 2097 views
    This topic created in 2840 days ago, the information mentioned may be changed or developed.

    如果要下载整个以太坊区块链并保持本地节点同步。当区块链占用了我计算机上超过 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
    

    Java 部分

    首先,我们需要获得以太坊区块链交互的 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 详解。

    2 replies    2018-09-04 18:29:48 +08:00
    chongdongshequ
        1
    chongdongshequ  
       Aug 30, 2018
    您好,您的文章质量非常高,方便留个微信和您请教一下吗?
    chongdongshequ
        2
    chongdongshequ  
       Sep 4, 2018
    您好,看到您的文章质量非常高,想邀请您成为虫洞社区的首批优质内容签约作者。虫洞社区是专业的区块链技术学习社区。虫洞社区鼓励内容生产者产生高质量内容,并给予合理的回报,也希望能帮助内容消费者获得高质量的区块链内容,并让数字货币投资者获得有价值的投资洞见。同时,虫洞社区已经积累了大量的区块链深度从业者,便于作者建立个人品牌。不知道是否方便加您微信细聊?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1138 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 103ms · UTC 17:36 · PVG 01:36 · LAX 10:36 · JFK 13:36
    ♥ Do have faith in what you're doing.