Solidity
從數據儲存合約推送/拉取數據
有什麼辦法可以讓我擁有一個儲存值和名稱的智能合約,然後可以從另一個智能合約呼叫?像這樣的東西..(但這有效)
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 更改為
name
,bytes32
因為此時無法在契約之間傳遞字元串。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 中的上述內容,以顯示它的工作原理。
希望能幫助到你。