如何仅通过控制台(Truffle)使用ABI更新已部署的以太坊智能合约

时间:2019-07-11 13:53:14

标签: solidity smartcontracts truffle go-ethereum

我需要更新已部署合同的价值(我既没有解决方案,也没有将其部署在我的平台上) 我想用合约中的setter更新param并调用getter以查看更改后的值..始终会返回默认值!

这是我使用的代码:

new web3.eth.Contract(HelloWorld.abi,'0x085Ab4C596535FFCE5B520D277f1C01236a656CB').methods.setMessage('Hi').call()

=>结果{}

然后致电:

new web3.eth.Contract(HelloWorld.abi,'0x085Ab4C596535FFCE5B520D277f1C01236a656CB').methods.getMessage().call()

=> 'hello world10'?

我正在使用Truffle控制台:

truffle console --network ropsten

如果我使用一个评论:

HelloWorld.deployed().then(instance => instance.setMessage('new Hi').call())

然后致电:

HelloWorld.deployed().then(instance => instance.getMessage.call()).then(result => message = result)

然后我得到了预期的价值..但我没有部署合同。都不是溶胶。我所拥有的全部ABI

应该异步的呼叫是否出错..或者我需要重新部署合同?

在这个加密货币世界中我还是新手

1 个答案:

答案 0 :(得分:1)

欢迎使用您命名的“密码世界”。

我对您的问题有些迷惑,但是您想要的是部署带有初始消息的合同,然后使用setMessage方法更改消息,整个控制台中。

您做错的第一件事是使用.call()调用“ setMessage”方法。当您想更改区块链中的某些内容时,您将发送一个交易,并且要发送交易,您需要指定一个帐户。正确的方法应该是.send({ from: "you-account-address" })

为了简化一点,让我先展示一些可以使用的行,然后进行解释

$ > truffle console --network ropsten
$ (truffle) > helloInstance = await HelloWorld.deployed()
$ (truffle) > await helloInstance.getMessage()
$ (truffle) > await helloInstance.setMessage("new Hi", { from: "you-account-address" })

因此,基本上,所有调用都是异步的。首先,您调用HelloWorld.deployed()是因为当您使用松露部署合同时,松露创建了一个名为“ build”的文件夹,在其中保存了包含所有必要数据的合同,这就是为什么您既无需指定地址又无需指定地址的原因。阿比。这与使用web3.js(您需要同时指定两者)完全不同。

然后,您可以只调用方法。

您可以在https://www.trufflesuite.com/docs/truffle/getting-started/interacting-with-your-contracts

中找到更多详细信息