V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
malakashi
V2EX  ›  区块链

Android 与以太坊智能合约交互

  •  
  •   malakashi · 2018-08-28 15:02:34 +08:00 · 1497 次点击
    这是一个创建于 2039 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如果要下载整个以太坊区块链并保持本地节点同步。当区块链占用了我计算机上超过 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 条回复    2018-09-04 18:29:48 +08:00
    chongdongshequ
        1
    chongdongshequ  
       2018-08-30 10:21:00 +08:00
    您好,您的文章质量非常高,方便留个微信和您请教一下吗?
    chongdongshequ
        2
    chongdongshequ  
       2018-09-04 18:29:48 +08:00
    您好,看到您的文章质量非常高,想邀请您成为虫洞社区的首批优质内容签约作者。虫洞社区是专业的区块链技术学习社区。虫洞社区鼓励内容生产者产生高质量内容,并给予合理的回报,也希望能帮助内容消费者获得高质量的区块链内容,并让数字货币投资者获得有价值的投资洞见。同时,虫洞社区已经积累了大量的区块链深度从业者,便于作者建立个人品牌。不知道是否方便加您微信细聊?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1024 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 19:22 · PVG 03:22 · LAX 12:22 · JFK 15:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.