无法更新可靠性测试区块链中的状态
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)
})
我正在尝试将 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)
})