部署後,使用 Web3、Truffle 與未提供所需輸出的功能互動
在 Remix 上測試時,這組合約函式給出了預期的行為。但是,當使用 Truffle 和 Web3 在 TestRPC 上部署相同的功能並使用 Web 界面訪問時,它不會提供所需的邏輯輸出。
結構如下:
struct ProofEntry { bytes32 owner; bytes32 privateKey; bytes32 previousTrackingId;} struct registerEntry{ bytes32 owner; bytes32 privateKey;}
所需的映射如下:
mapping (bytes32 => ProofEntry) proofs; // trackingId to ownerBlock mapping (string => bytes32) items; // productId to trackingId mapping (bytes32 => registerEntry) register; // ownerHash to registerEntry
請考慮以下功能:1] addProduct
function addProduct(string password, string productId) public returns(bool){ if(hasEntry(productId)) return false; else { bytes32 owner = keccak256(bytes32ToString(keccak256(password))); bytes32 privateKey = keccak256(password); bytes32 previousTrackingId = keccak256("root"); bytes32 trackingId = keccak256(productId); proofs[trackingId] = ProofEntry(owner, privateKey, previousTrackingId); register[owner] = registerEntry(owner , privateKey); items[productId] = trackingId; productAdded(password,owner,productId); return true; } }
2] 獲取所有者
function getOwner(string productId) constant returns(bytes32) { bytes32 trackingId = items[productId]; ProofEntry memory record = proofs[trackingId]; return (record.owner);}
現在,當我在 Remix 上測試這些功能時,即通過為 addproduct() 提供密碼和 productId 並在 getOwner 中提供 productId,我得到了所有者的相應雜湊。
但是當我使用 Truffle,Web3 在 testRPC 上部署它並使用 WebUI 訪問它時,addproduct()返回 true 表示它已經添加了產品但是當我將相同的 productId 傳遞給 getOwner() 時,它返回預設值 bytes32 而不是OwnerHash,這表明這些值沒有反映在區塊鏈的映射中,我不明白為什麼。急需幫助!!!!
addproduct() 函式沒有反映區塊鏈中的變化,因為它可能是使用 .call() 呼叫的,並且呼叫是對合約函式的本地呼叫,不會在區塊鏈上廣播或發布任何內容。
對於反映對區塊鏈的更改,應該使用 .sendTransaction() 呼叫它,因為交易被廣播到網路,由礦工處理,如果有效,則會在區塊鏈上發布。
有關事務和呼叫之間區別的更多資訊,請參閱以下連結。
聽起來您忽略了等待探勘添加產品交易的過程。然後,您繼續檢查並發現沒有任何變化。
在“免費”的 Remix 之外,您必須等待探勘的交易才能看到效果。
下面的函式允許您傳遞交易收據(您將擁有)並暫停,直到感興趣的交易被探勘出來。
https://gist.github.com/xavierlepretre/88682e871f4ad07be4534ae560692ee6
希望能幫助到你。