无法更新可靠性测试区块链中的状态

can't update state in solidity test blockchain

我正在尝试将 this example 连接到使用 web3 的前端。我已将其准确复制到我的松露项目 /contracts 文件夹中。

编译迁移成功。 (我已将 truffle 配置为部署在我的 ganache 测试网络上,当我 运行 truffle migrate 时,我看到第一个帐户已扣除以太币)。

我已经创建了一个 Vue 应用程序来通过 web3 与合约进行交互。这是我的组件的样子:

<template>
<div class="hello">
    <button @click="inc">increment</button>
    <button @click="dec">decrement</button>
    <button @click="get">get</button>
  </div>
</template>

<script>
const Web3 = require("web3");

const addr = '0xfbe7892aF06c7ecfbd83a0aD7F1D0a228d90Bf89'

const abi = [
    {
        "inputs": [],
        "name": "count",
        "outputs": [
            {
                "internalType": "uint256",
                "name": "",
                "type": "uint256"
            }
        ],
        "stateMutability": "view",
        "type": "function",
        "constant": true
    },
    {
        "inputs": [],
        "name": "get",
        "outputs": [
            {
                "internalType": "uint256",
                "name": "",
                "type": "uint256"
            }
        ],
        "stateMutability": "view",
        "type": "function",
        "constant": true
    },
    {
        "inputs": [],
        "name": "inc",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
    },
    {
        "inputs": [],
        "name": "dec",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
    }
]

export default {
    name: 'HelloWorld',
    data () {
        return {
            web3: null,
            contract: null,
        }
    },
    methods: {
        get(){
            self.contract.methods.get().call(function(err, result){
                console.log(result)
            })            
        },
        inc(){
            self.contract.methods.inc().call(function(err, result){
                console.log(result)
            })            
        },
        dec(){
            self.contract.methods.dec().call(function(err, result){
                console.log(result)
            })            
        },
    },
    created () {
        self.web3 = new Web3('http://localhost:7545')
        self.contract = new self.web3.eth.Contract(abi, addr)        
    }
}
</script>

当我运行inc时,没有抛出错误。我希望在 运行 get 时看到该值增加,但它总是输出 0 - 显然 inc 不会更新状态。我错过了什么吗?

call (read-only, gas-free) and a transaction(读写,需要 gas 费用)有区别。

由于您希望 inc() 函数更新状态,因此您需要 send() 交易而不是调用。

您的本地 web3 实例(通常在生产中)或远程节点(通常在开发中,例如使用 Ganache)需要持有 senderAddress 的私钥才能发送交易。

self.contract.methods.inc().send({from: senderAddress}, function(err, result){
    console.log(result)
})