Solidity

部署後,使用 Web3、Truffle 與未提供所需輸出的功能互動

  • December 29, 2017

在 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

希望能幫助到你。

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