Web3js

如何使用區塊鏈(乙太坊)更新項目的數據?

  • September 10, 2018

我對創建區塊鏈 dapps 非常陌生,因此不勝感激。我正在構思如何創建私有區塊鏈,以便使用者可以交流他們正在使用乙太坊開展的項目的狀態。例如,假設有一個共享文本文件(不一定是大的 .txt 文件),其中包含項目(可以是任何項目)的一些說明,每個使用者都可以作為一個團隊訪問。給定這個帶有指令的共享資源,使用者可以在需要的地方進行更改,然後在完成後,記錄使用者的時間戳和雜湊身份,以表明他們的項目已經完成。私有區塊鏈中的每個人都會看到這一點。我的問題如下:

(1) 如何使用乙太坊來解決這個問題?

(2) 我習慣用 Java 編寫程式碼,但我也使用 C++ 和 JavaScript 編寫程式碼。Java 可以用來為這樣的東西編寫智能合約,還是另一種程式語言會更好?

(3) 我如何最終開發一個前端應用程序,每個使用者都可以使用它來跟踪每個人的貢獻狀態?由於網路伺服器是集中式的,我是否需要使用 IPFS 之類的東西?我不明白如何創建使用者界面,或者乙太坊是否提供這種東西。

我知道這些是一般性問題,但我只需要用其中一些想法指出正確的方向和/或指向一些不太難使用的類似 GitHub 項目。再次,建議將不勝感激。

乙太坊不太適合儲存文件或幾乎任何合理數量的文本數據。使用契約的成本太高了。最多你應該儲存一點文本和一些數字。乙太坊主要用於儲存邏輯而不是太多數據。

理論上你可以使用任何程式語言來編寫你的程式碼,只要存在一個轉換器/包裝器到乙太坊區塊鏈可以理解的東西。大多數流行的程式語言很可能都有某種編寫智能合約的框架,但不確定哪些有什麼。最直接的當然是直接用 Solidity 寫一切。

乙太坊不提供使用者界面。那些你必須用外部工具編寫的。最流行的組合可能是 Metamask(用於與區塊鏈通信)和 web3js(用於 UI)。

首先在solidity中編寫智能合約。

pragma solidity ^0.4.17;

contract TestMethod{
  string public name = "Reverb";

  function updateName(string _name) public{
      name = _name;
  }
}

這將在以下命令的幫助下編譯它並生成包裝類。首先使用solidity編譯器並執行命令它會給你一個bin和一個abi文件。

>> solc TestMethod.sol --bin --abi --optimize -o ./

使用 web3j 包裝文件生成器並在 abi 和 bin 文件的幫助下,執行以下命令。

>> web3j solidity generate TestMethod.bin TestMethod.abi -o . -p org.web3j.samp
le

你會得到一個像這樣的 java 包裝類。

package org.web3j.sample;

import java.math.BigInteger;
import java.util.Arrays;
import java.util.Collections;
import org.web3j.abi.TypeReference;
import org.web3j.abi.datatypes.Function;
import org.web3j.abi.datatypes.Type;
import org.web3j.abi.datatypes.Utf8String;
import org.web3j.crypto.Credentials;
import org.web3j.protocol.Web3j;
import org.web3j.protocol.core.RemoteCall;
import org.web3j.protocol.core.methods.response.TransactionReceipt;
import org.web3j.tx.Contract;
import org.web3j.tx.TransactionManager;

/**
* <p>Auto generated code.
* <p><strong>Do not modify!</strong>
* <p>Please use the <a href="https://docs.web3j.io/command_line.html">web3j command line tools</a>,
* or the org.web3j.codegen.SolidityFunctionWrapperGenerator in the 
* <a href="https://github.com/web3j/web3j/tree/master/codegen">codegen module</a> to update.
*
* <p>Generated with web3j version 3.4.0.
*/
public class TestMethod extends Contract {
   private static final String BINARY = "60c0604052600660808190527f526576657262000000000000000000000000000000000000000000000000000060a090815261003e9160009190610051565b5034801561004b57600080fd5b506100ec565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061009257805160ff19168380011785556100bf565b828001600101855582156100bf579182015b828111156100bf5782518255916020019190600101906100a4565b506100cb9291506100cf565b5090565b6100e991905b808211156100cb57600081556001016100d5565b90565b6102a1806100fb6000396000f30060806040526004361061004b5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde03811461005057806384da92a7146100da575b600080fd5b34801561005c57600080fd5b50610065610135565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561009f578181015183820152602001610087565b50505050905090810190601f1680156100cc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156100e657600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526101339436949293602493928401919081908401838280828437509497506101c39650505050505050565b005b6000805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156101bb5780601f10610190576101008083540402835291602001916101bb565b820191906000526020600020905b81548152906001019060200180831161019e57829003601f168201915b505050505081565b80516101d69060009060208401906101da565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061021b57805160ff1916838001178555610248565b82800160010185558215610248579182015b8281111561024857825182559160200191906001019061022d565b50610254929150610258565b5090565b61027291905b80821115610254576000815560010161025e565b905600a165627a7a723058202be32a6af265c5583cba0e7c6731a4b971eeac0ec50f7b8aaf89a9e21d33184d0029";

   public static final String FUNC_NAME = "name";

   public static final String FUNC_UPDATENAME = "updateName";

   protected TestMethod(String contractAddress, Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) {
       super(BINARY, contractAddress, web3j, credentials, gasPrice, gasLimit);
   }

   protected TestMethod(String contractAddress, Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) {
       super(BINARY, contractAddress, web3j, transactionManager, gasPrice, gasLimit);
   }

   public RemoteCall<String> name() {
       final Function function = new Function(FUNC_NAME, 
               Arrays.<Type>asList(), 
               Arrays.<TypeReference<?>>asList(new TypeReference<Utf8String>() {}));
       return executeRemoteCallSingleValueReturn(function, String.class);
   }

   public RemoteCall<TransactionReceipt> updateName(String _name) {
       final Function function = new Function(
               FUNC_UPDATENAME, 
               Arrays.<Type>asList(new org.web3j.abi.datatypes.Utf8String(_name)), 
               Collections.<TypeReference<?>>emptyList());
       return executeRemoteCallTransaction(function);
   }

   public static RemoteCall<TestMethod> deploy(Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) {
       return deployRemoteCall(TestMethod.class, web3j, credentials, gasPrice, gasLimit, BINARY, "");
   }

   public static RemoteCall<TestMethod> deploy(Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) {
       return deployRemoteCall(TestMethod.class, web3j, transactionManager, gasPrice, gasLimit, BINARY, "");
   }

   public static TestMethod load(String contractAddress, Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) {
       return new TestMethod(contractAddress, web3j, credentials, gasPrice, gasLimit);
   }

   public static TestMethod load(String contractAddress, Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) {
       return new TestMethod(contractAddress, web3j, transactionManager, gasPrice, gasLimit);
   }
}

此外,您可以使用 deploy() 方法部署合約,並使用 updateName() 方法更新數據。有關更多資訊,請參閱此部落格。

https://medium.com/coinmonks/ethereum-blockchain-hello-world-smart-contract-with-java-9b6ae2961ad1

引用自:https://ethereum.stackexchange.com/questions/57690