Ethereumj

從其他節點創建的節點訪問合約成員值的方法

  • August 3, 2016

我有一個具有 getter 和 setter 方法的契約程式碼。

我寫了一個java主類,它完成了以下操作

TransactionReceipt receipt = sendTxAndWait(new byte[0], Hex.decode(metadata.bin));
byte[] contractAddress = receipt.getTransaction().getContractAddress();
CallTransaction.Contract contract = new CallTransaction.Contract(metadata.abi);
CallTransaction.Function inc = contract.getByName("set");
byte[] functionCallBytes = inc.encode(123);
TransactionReceipt receipt1 = sendTxAndWait(contractAddress, functionCallBytes);

另一類具有以下內容:

TransactionReceipt receipt = sendTxAndWait(new byte[0], Hex.decode(metadata.bin));
byte[] contractAddress = receipt.getTransaction().getContractAddress();
CallTransaction.Contract contract = new CallTransaction.Contract(metadata.abi);

ProgramResult r = ethereum.callConstantFunction(Hex.toHexString(contractAddress), contract.getByName("get"));
Object[] ret = contract.getByName("get").decodeResult(r.getHReturn());
System.out.println("Current contract data member value: " + ret[0]);

ProgramResult r1 = ethereum.callConstantFunction("823555f52655029e4269ccc8de2bf5d5b83936a8", contract.getByName("get"));
Object[] ret1 = contract.getByName("get").decodeResult(r1.getHReturn());
System.out.println("Executed contract data member value: " + ret1[0]);**

這兩個執行在兩個不同的 JVM 中。現在執行第二個程序給我如下輸出:目前合約數據成員值:0 執行的合約數據成員值:123

現在這個“ 823555f52655029e4269ccc8de2bf5d5b83936a8 ”是第一個java類創建合約時解析的合約地址。

是不是這樣,每個想要訪問合約成員值的節點都應該知道合約地址。或者有沒有其他方法可以訪問 ethereumj 客戶端中的契約成員價值?

目前,除了通過地址之外,沒有其他方法可以引用契約。這甚至不是 EthereumJ 的問題,而是它適用於整個 Ethereum 合約世界的方式。

將智能合約地址與 IP 地址進行比較。它們都是機器可讀和可理解的,但人類不容易獲得。因此你的不確定性。

通常,人類將通過 Mist 瀏覽器、Metamask 或 web3js 與智能合約在 Web 界面上進行互動。這意味著他們不需要知道合約地址,因為它被編碼到網頁中。話雖如此,我認為合約的域命名服務很有用,這樣做的智能合約肯定是原型的。

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