如何解决使用 web3 从智能合约中获取空结果
我是 web3 的新手,一般来说都是 solidity,但我一直在关注有关从 web3 调用合同方法的网络文档
我的solidity智能合约:
pragma solidity ^ 0.5.0;
contract Royalties {
string public name = "RoyaltiesContract";
uint public nextArtistId = 1;
uint public nextSongId = 0;
uint public nextCollabId = 0;
mapping(uint => Artist) public Artists;
struct Artist {
uint id;
string ArtistName;
address ArtistAddress;
}
function createArtist(string memory ArtistName,address Artistaddress) public returns(uint id,string memory Name,address Address) {
Artists[nextArtistId] = Artist(nextArtistId,ArtistName,Artistaddress);
nextArtistId++;
return(nextArtistId,Artistaddress);
}
function getArtist(uint id) view public returns(uint,string memory,address){
return(Artists[id].id,Artists[id].ArtistName,Artists[id].ArtistAddress);
}
}
完成所有配置后我的 web3 代码:
shoot(royalties) {
const createArtist = royalties.methods.createArtist("DMX","0x518251583591f3DE330Eb539AB64b6E95C1EE5c5").call().then(
function(result){
console.log(result)
},royalties.methods.getArtist(1).call({defaultBlock :'latest'}).then(console.log)
)
}
记住一个 id:1 的艺术家已经存在,上面的 shot() 函数现在被触发,第一个 console.log 是 createArtist 方法返回的结果与智能合约一样:
Result {0: "2",1: "DMX",2: "0x518251583591f3DE330Eb539AB64b6E95C1EE5c5",id: "2",Name: "DMX",Address: "0x518251583591f3DE330Eb539AB64b6E95C1EE5c5"}
但是第二个 console.log 是 getArtist(1) 方法返回记住一个已经有 id:1 的艺术家:
Result {0: "0",1: "",2: "0x0000000000000000000000000000000000000000"}
感谢您花时间阅读我的问题。
解决方法
您需要使用 createArtist()
而不是 send()
与合约函数 call()
进行交互。
send() 发送交易,有效地允许写入合约存储。
如果您还没有配置您的 web3 defaultSender
,您还需要向它传递一个至少包含 {from: <address>}
的选项对象,以便 web3 知道您要从哪个地址发送(和签名 - 因此您还需要将其私钥传递给 web3)交易。
call() 不发送交易,只是读取数据。因此您可以安全地将其用于 getArtist()
视图函数调用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。