Solidity

基於智能合約應付賬款的功能如何針對任何購買返回價值

  • October 16, 2019

我試圖從應付函式中獲取返回值,這個想法是使用者必須支付費用,作為回報,他將獲得他的特殊程式碼。我的JS測試程式碼如下

it('get special code which was stored by the admin',async()=> {

       const user = accounts[4];

       // get the deployed contract instance
       contractInstance = await MyContract.deployed()

       const expectedCode = "Wolvorine";

       const fees = "1";  

       let result1 = await contractInstance.getCode(user,{from:user,value:fees}) ;

   assert.equal(result1,expectedCode, " Code which was stored by the admin must be equal to the expected value")

我返回值的契約如下

function getCode(address _identityaddress) payable
public returns (string memory)
{
   require((identity_details[_identityaddress].identityaddress==msg.sender));

   require(msg.value >= attestationFee);

   Transaction memory p = identity_details[_identityaddress];

   return (p.code);
}

這裡的 Transaction 是一種結構數據類型,內部有程式碼作為字元串變數。如果我在沒有付款的情況下執行此功能並且不從呼叫者那裡拿任何錢,那麼返回值會準確地返回我的程式碼。但是由於我使用的是應付賬款和接收乙太幣,因此,它返回給我一個大交易對象而不是我的返回值。

解決此問題的最佳方法是什麼,因為我希望使用者只使用一次 MetaMask,他只需支付,然後一次性獲得此價值?

如果我在沒有付款的情況下執行此功能並且不從呼叫者那裡拿任何錢,那麼返回值會準確地返回我的程式碼。

你在正確的軌道上,但誤解了你所看到的。我會分解它。

準確地返回我的程式碼

我想你的意思是returns(string memory)

無需支付

應付賬款與此無關。您必須添加viewconstant使其成為只讀函式,因為如果您刪除,編譯器會建議您這樣做,payable因為沒有值傳輸,此函式不會改變任何內容。所以,我認為這就是發生的事情,或者非常相似的事情。

這個問題與乙太坊對狀態改變(寫)和只讀操作的處理有關。在狀態更改函式的情況下,發送者永遠不會獲得預期的返回值,但另一個合約卻可以。原因是發送的交易沒有被探勘,所以返回值未知。

您獲得的收據是您的節點生成的標識符,讓您知道如何跟踪交易。此回調確認您的節點知道您希望向網路送出某些內容。它與“結果”不是同一個概念。

這是一個令人困惑的話題,它暗示了處理等待探勘的前端設計模式。在這裡查看解釋器:https ://blog.b9lab.com/calls-vs-transactions-in-ethereum-smart-contracts-62d6b17d0bc2

希望能幫助到你。

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