在SuperBlocks上运行时,waitOnReceipt函数无法稳定运行

时间:2018-08-12 10:21:50

标签: ethereum solidity

https://studio.superblocks.com/上运行,尝试在Solidity中制作有趣的游戏。当我在“ addKity”函数中调用等待收据时,就会发生问题。有什么想法吗?我怀疑这可能是因为超级块中的技术问题,但很可能是因为我遇到了编码错误。

到达“此处”警报,但未到达警报(“ 4”);

请让我知道您的想法!

waitForReceipt(txHash, function(receipt){

JavaScript文件

(function (Contract) {
    var web3_instance;
    var instance;
    var accounts;

    function init(cb) {
        web3_instance = new Web3(
            (window.web3 && window.web3.currentProvider) ||
            new Web3.providers.HttpProvider(Contract.endpoint));

        accounts = web3.eth.accounts;


        var contract_interface = web3_instance.eth.contract(Contract.abi);


        instance = contract_interface.at(Contract.address);
        cb();
    }

function waitForReceipt(hash, cb) {
web3.eth.getTransactionReceipt(hash, function (err, receipt) {
    if (err) {
    error(err);
    }

    if (receipt !== null) {
    // Transaction went through
    if (cb) {
        cb(receipt);
    }
    } else {
    // Try again in 1 second
    window.setTimeout(function () {
        waitForReceipt(hash, cb);
    }, 1000);
    }
});
}





    function addKitty(){

    //  var KittyName = "he"; //$("#kittyName").val();
    //  var KittyPrice = 5;//parseInt($("#kittyPrice").val());


const transactionObject = {
from: "0x95c2332b26bb22153a689ae619d81a6c59e0a804",
gas: "1000000",
gasPrice: "1000000",
value:"1000"
};

    instance.addNewKitty.sendTransaction("sdad",5, transactionObject, (error, result) => { 

    if(error){
        alert(error);
        alert("2");
        }
        else{
            alert("heres");


            waitForReceipt(txHash, function(receipt){
                alert("4");
            //   if(receipt.status === "0x1"){

            //     alert("got receipt");
            //   }
            //   else{
            //       alert("5");
            //     alert("receipt status fail");
            //   }
            });
        }
    })

    }









    // function getMessage(cb) {
    //     instance.message(function (error, result) {
    //         cb(error, result);
    //     });
    // }

    $(document).ready(function () {

        init(function () {
            // getMessage(function (error, result) {
            //     if (error) {
            //         console.error("Could not get article:", error);
            //         return;
            //     }
            //     $('#message').append(result);
            // });
            $("#addKitty").click(function(){

            addKitty();
        })

        });
    });
})(Contracts['CryptoKitties']);

实体文件

    pragma solidity ^0.4.21;


contract CryptoKitties  {

    address public owner;

    struct CKitties{
        string name;
        uint price;
    }


function CryptoKitties() public {
    owner = msg.sender;
}

modifier onlyOwner() {
    require(msg.sender == owner);
    _;
}




    mapping (address => uint) kittytoUser;  
    CKitties[] kitties;

    event NewCryptoKitty(address owner, string name, uint price); 

    modifier cost (uint minCost){
        require(msg.value>= minCost && minCost >=0);
        _;
    }

function addNewKitty(string newName, uint newPrice) public payable cost(5000) {
    address sender = msg.sender;
    uint place =  kitties.push(CKitties(newName,newPrice));
    kittytoUser[sender] = place;
    emit NewCryptoKitty(sender, newName, newPrice);

}

function kill() public  onlyOwner{
    selfdestruct(owner);
}



function getName() public view returns (string){
        address sender = msg.sender;
        uint index = kittytoUser[sender]-1;
        return kitties[index].name;
}

function setName(string newName) public{
    address sender = msg.sender;
        uint index = kittytoUser[sender]-1;
        kitties[index].name = newName;
}

function getBalance() public view returns (uint){
    return address(this).balance;
}




}

1 个答案:

答案 0 :(得分:0)

首先,调用waitForReceipt函数以传递未定义的值txHash。在这种情况下,应该改为result(该值来自激活该调用的回调,由sendTransaction触发)。
该更改将使waitForReceipt通话正常工作。

另一个问题是您将web3变量命名为web3_instance,但仍将其称为web3。 考虑到在waitForReceipt内部,您仍将其引用为web3.eth...,而在此上下文中正确的调用将是:web3_instance.eth.getTransactionReceipt...
修复该错误后,alert("4")将按预期方式被调用。