Solidity

從數據儲存合約推送/拉取數據

  • February 6, 2018

有什麼辦法可以讓我擁有一個儲存值和名稱的智能合約,然後可以從另一個智能合約呼叫?像這樣的東西..(但這有效)

Contract D {
   struct Document{
     string name;
     uint value;
   }

   function StoreDocument(bytes32 key, string name, uint value) returns (bool success) {
    var doc = Document(name, value);
    documents[key].push(doc);
    return true;
   }
}

然後我希望另一個合約獲取密鑰、合約地址和名稱,並能夠返回要在合約中使用的值。任何幫助都會很棒。

Contract E {
   function RetrieveData(address ConDadd, bytes32 key, string name) {
   //some funciton to get the data from Contract D
   }
}

我從您的範例開始並對其進行了調整,直到它起作用為止。我在做的時候注意到了一些提示。

struct定義一個類型。您必須將具有該類型的變數轉換為儲存值。mapping是通過唯一鍵組織實例的工具。

我將 Type of 更改為namebytes32因為此時無法在契約之間傳遞字元串。

E 需要了解 D 的 ABI,以便它可以進行呼叫。D 在同一個源文件中,因此當編譯器遇到將變數轉換為類型“D”的這一行時,編譯器可以“看到”它。

D d;

E 還需要知道它應該與之交談的“那個”D 實例的地址。E 的建構子需要一個在部署時傳入的地址。

我公開了映射,因此呼叫了一個“免費”getter 函式documentStructs(),它只需要key傳入的值。它返回儲存的兩個值。

pragma solidity ^0.4.6;

contract D {

 // This is a Type
 struct DocumentStruct{
   // Not possible to pass strings between contracts at this time
   bytes32 name;
   uint value;
 }

 // This is a namespace where we will store docs of Type DocumentStruct
 mapping(bytes32 => DocumentStruct) public documentStructs;

 // Set values in storage
 function StoreDocument(bytes32 key, bytes32 name, uint value) returns (bool success) {
  documentStructs[key].name  = name;
  documentStructs[key].value = value;
  return true;
 }

}

contract E {

 // "d" is of type "D" which is a contract ^
 D d;

 // Define the Type in this context
 struct DocumentStruct{
   bytes32 name;
   uint value;
 }    

 // For this to work, pass in D's address to E's constructor
 function E(address DContractAddress) {
   d = D(DContractAddress);
 }

 function RetrieveData(bytes32 key) 
   public
   constant
   returns(bytes32, uint) 
 {
   // Declare a temporary "doc" to hold a DocumentStruct
   DocumentStruct memory doc;
   // Get it from the "public" mapping's free getter.
   (doc.name, doc.value) = d.documentStructs(key);
   // return values with a fixed sized layout
   return(doc.name, doc.value);
 }
}

有各種不明顯的數據組織考慮因素,在早期階段可能會有點困難。看看這裡展開的不同模式的優缺點可能會有所幫助:Solidity 是否有很好解決且簡單的儲存模式?

這是 Remix 中的上述內容,以顯示它的工作原理。

希望能幫助到你。

在此處輸入圖像描述

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