尝试在专用网络上进行交易时帐户余额为零

时间:2018-04-04 23:09:33

标签: networking private ethereum solidity

编辑:解决,是由声明this.web3而不是web3

引起的

我正在运行一个带松露的私人网络,我正面临这个奇怪的问题,Metamask和Mist表明我有100个eth的余额。当我尝试实际进行交易时,它表示该帐户具有ZERO eth。我的合同相当复杂,我不确定是什么问题。

我已经尝试重新启动松露并重新编译并重新签订合同几次,我已经多次重新安装了metamask。当我尝试Mist时,它也会这样做。

我在智能合约方面相当新,但我正在努力创建一个有点大的应用程序。我用Solidity对合同进行编码,我已经在没有问题的情况下测试了混合合同,我可以通过松露来操纵合同。我想这可能是因为前面......我正在用反应进行编程。 这是我称之为函数的js中代码的特定部分。它只是一个普通的身份验证机制。我使用truffle-contract,this.database是契约。

authAddress(sotu, password) {
    return new Promise ((resolve, reject) => {
        this.database.deployed().then(instance => {
            return instance.authAddress(sotu, password);
        }).then(res => {
            resolve();
        }).catch(error => {
            reject(error);
        });
    });
}

坚实的对应物如下:

function authAddress(string sotu, string password) public {
    //Check if already logged in
    require(authenticatedAddresses[msg.sender] == address(0));
    Person p = persons[keccak256(sotu)];
    p.login(keccak256(password), msg.sender);
    authenticatedAddresses[msg.sender] = p;
}

我还在学习这些东西,但我有点担心这个问题存在,而且就我试图搜索而言,没有其他人似乎反驳过这个问题。我完全错过了什么吗?

编辑:

这是web3提供者init:

    try {
        if(web3 != null) {
            this.web3 = new Web3(web3.currentProvider);
        }
    } catch (error) {
        this.web3 = null;
    }

如果您使用元掩码或类似内容,我会尽量使网站可用。我想将web3包装到一个类中,但是如果这样可以解决问题,请告诉我。

我的databasehandler init

initDatabaseHandler() {
    return new Promise((resolve, reject) => {
        this.databaseHandler = new DatabaseHandler();
        this.databaseHandler.loadContract(this.state.coinbase, this.web3.currentProvider)
        .then(() => {
            this.databaseHandler.getAccountInfo()
            .then(info => {
                this.setState({userinfo: info}, resolve());
            }).catch(err => {
                console.log(err);
            });
        })
        .catch(err => reject(err));

    });
}

抽象的合同加载器:

loadContract(coinbase, provider) {
    return new Promise((resolve, reject) => {
        this.database = new Contract(Database);
        this.database.setProvider(provider);
        this.database.web3.eth.defaultAccount = coinbase;

        this.person = new Contract(Person);
        this.person.setProvider(provider);
        this.person.web3.eth.defaultAccount = coinbase;

        console.log(this.database.web3.eth.defaultAccount);
        resolve();

    });
}

1 个答案:

答案 0 :(得分:0)

解决了,是由声明this.web3而不是web3

引起的