javascript - 使用 javascript 将值返回到 html 时,我的 Solidity map(int,string) 出现函数错误。
问题描述
我无法通过对我的 Solidity 智能合约函数的 JavaScript 函数调用来更新我的标签。我正在尝试创建一个(整数,字符串)映射,以便通过单击按钮以 HTML 格式显示值。出于某种原因,threatActor.getActor(1,function(error, result)返回 NULL。
有人可以看看并帮助我朝着正确的方向前进吗?谢谢你。
HTML 代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<link rel="stylesheet" type="text/css" href="main.css">
<script src="/home/zachary/employee-eth/node_modules/web3/dist/web3.min.js"></script>
</head>
<body>
<div class="container">
<div class="container1">
<label for="labels" class="col-lg-2 control-label">Labels: </label>
<input id="labels" type="text">
<label for="aliases" class="col-lg-2 control-label">Aliases: </label>
<input id="aliases" type="text">
<label for="roles" class="col-lg-2 control-label">Roles: </label>
<input id="roles" type="text">
<label for="goals" class="col-lg-2 control-label">Goals: </label>
<input id="goals" type="text">
<label for="resource_level" class="col-lg-2 control-label">Organization: </label>
<input id="resource_level" type="text">
<label for="sophistication" class="col-lg-2 control-label">Sophistication: </label>
<input id="sophistication" type="text">
<label for="primary_motivation" class="col-lg-2 control-label">Primary Motivation: </label>
<input id="primary_motivation" type="text">
<button id="buttonSet">Submit Threat</button>
<div id="container">
<div id="container1"><button id="buttonGet">Get Threats by ID</button></div>
<div id="container2"><input id="getId" type="text" value="1"></div>
</div>
</div>
<div class="container2">
<h1>Actor Attributes</h1>
<label for="actorID" class="col-lg-2 control-label">ID: </label>
<label id="actorID_d" class="col-lg-2 control-label">Empty</label>
<label for="labels" class="col-lg-2 control-label">Labels: </label>
<label id="labels_d" class="col-lg-2 control-label">Empty</label>
<label for="aliases" class="col-lg-2 control-label">Aliases: </label>
<label id="aliases_d" class="col-lg-2 control-label">Empty</label>
<label for="roles" class="col-lg-2 control-label">Roles: </label>
<label id="roles_d" class="col-lg-2 control-label">Empty</label>
<label for="goals" class="col-lg-2 control-label">Goals: </label>
<label id="goals_d" class="col-lg-2 control-label">Empty</label>
<label for="resource_level" class="col-lg-2 control-label">Organization: </label>
<label id="resource_level_d" class="col-lg-2 control-label">Empty</label>
<label for="sophistication" class="col-lg-2 control-label">Sophistication: </label>
<label id="sophistication_d" class="col-lg-2 control-label">Empty</label>
<label for="primary_motivation" class="col-lg-2 control-label">Primary Motivation: </label>
<label id="primary_motivation_d" class="col-lg-2 control-label">Empty</label>
</div>
</div>
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
<script>
if (typeof web3 !== 'undefined') {
web3 = new Web3(web3.currentProvider);
} else {
web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
}
web3.eth.defaultAccount = web3.eth.accounts[0];
var threatActorContract = web3.eth.contract([
{
"constant": false,
"inputs": [
{
"name": "_labels",
"type": "string"
},
{
"name": "_aliases",
"type": "string"
},
{
"name": "_roles",
"type": "string"
},
{
"name": "_goals",
"type": "string"
},
{
"name": "_resource_level",
"type": "string"
},
{
"name": "_sophistication",
"type": "string"
},
{
"name": "_primary_motivation",
"type": "string"
}
],
"name": "addActor",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "",
"type": "uint256"
}
],
"name": "actors",
"outputs": [
{
"name": "labels",
"type": "string"
},
{
"name": "aliases",
"type": "string"
},
{
"name": "roles",
"type": "string"
},
{
"name": "goals",
"type": "string"
},
{
"name": "resource_level",
"type": "string"
},
{
"name": "sophistication",
"type": "string"
},
{
"name": "primary_motivation",
"type": "string"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "countActors",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "_key",
"type": "uint256"
}
],
"name": "getActor",
"outputs": [
{
"name": "",
"type": "string"
},
{
"name": "",
"type": "string"
},
{
"name": "",
"type": "string"
},
{
"name": "",
"type": "string"
},
{
"name": "",
"type": "string"
},
{
"name": "",
"type": "string"
},
{
"name": "",
"type": "string"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
}
]);
var threatActor = threatActorContract.at("0xcf5f9fb59f9b22810c50a9158b393388c492c258");
console.log(threatActor);
$("#buttonSet").click(function() {
threatActor.addActor($("#labels").val(), $("#aliases").val(), $("#roles").val(), $("#goals").val(),
$("#resource_level").val(), $("#sophistication").val(), $("#primary_motivation").val());
});
$("#buttonGet").click(function() {
threatActor.getActor(1,function(error, result) {
if(!error)
{
document.getElementById("#labels_d").innerHTML = result[0];
document.getElementById("#aliases_d").innerHTML = result[1];
document.getElementById("#roles_d").innerHTML = result[2];
document.getElementById("#goals_d").innerHTML = result[3];
document.getElementById("#resource_level_d").innerHTML = result[4];
document.getElementById("#sophistication_d").innerHTML = result[5];
document.getElementById("#primary_motivation_d").innerHTML = result[6];
console.log(result);
}
else {
console.error("ERROR!");
}
});
});
</script>
</body>
</html>
Solidity 智能合约代码:
pragma solidity ^0.4.24;
contract ThreatActors {
uint actorAmount = 1;
struct Actor{
string labels;
string aliases;
string roles;
string goals;
string resource_level;
string sophistication;
string primary_motivation;
}
Actor[] public actors;
function addActor(string _labels, string _aliases, string _roles, string _goals, string _resource_level, string _sophistication, string _primary_motivation) public
{
Actor memory actor = Actor(_labels, _aliases, _roles, _goals, _resource_level, _sophistication, _primary_motivation);
actors.push(actor);
actorAmount++;
}
function getActor(uint _key) view public returns (string, string, string, string, string, string, string) {
return (actors[_key].labels, actors[_key].aliases, actors[_key].roles, actors[_key].goals, actors[_key].resource_level, actors[_key].sophistication, actors[_key].primary_motivation);
}
function countActors() view public returns (uint) {
return actors.length;
}
}
解决方案
所以当你说它返回 NULL 时,你的意思是result
回调函数中的 NULL,对吗?如果是这样,我有一些猜测,但没有具体的:
- 传递给函数时,您的输入以某种方式翻译错误。它需要一个 uint256 并且你给数字文字 1。我必须假设这应该可以工作,但我通常坚持将我的数字包装在 BigNumber 中并且从未使用过文字(但同样,为什么它不起作用)。
- 您在 Solidity 中使用字符串。为了绝对控制我的结构大小和内存使用,我几乎从不使用动态数组。它们肯定有用途,但通常 a可以做
mapping
动态数组可以做的事情,并且 32 个字符(想我会指出来的。bytes32
string
- 也许你的 web3 版本是错误的。我知道有些版本可以简单地调用函数,而其他版本更喜欢使用 call / send (取决于它是否是一个常量函数)。如果您使用的是 1.0,这可能是docs 中所见的情况。
推荐阅读
- javascript - 在轮播中循环遍历数组数据不起作用
- node.js - 如何在父级和(分叉的)子级之间共享 TCP 套接字对象?
- c - 在c中使用文件操作写入文本文件时获取空格
- excel - 从 Excel 中获取百分比
- html - 如何更改我的 css 以使其在 Safari 和 Chrome 上呈现相同的效果?
- swift - 值替换后恢复字符串插值
- sqlalchemy - sqlalchemy 连接查询的问题 - 从孩子那里获取下一个日期
- react-native - Expo for Web 编译失败,因为原生基础模块
- javascript - 在 php 中完成进程后更改 JS/jQuery 中的按钮文本
- excel - 添加参数以从动态 URL 连接和抓取数据