我有以下合同:
pragma solidity ^0.4.11;
contract Zusatzaufgabe {
struct Student {
string name;
string vorname;
uint matnr;
uint punkte;
bool[] solved;
}
address[] public addressen;
mapping(address => Student) public studenten;
modifier hurdle(uint _n) {
require(_n == msg.value/2);
_;
}
modifier onlyTillTest() {
require(block.timestamp < 1499702400);
_;
}
function Zusatzaufgabe(){
}
function register(string _name, string _vorname, uint _matnr) onlyTillTest(){
studenten[msg.sender] = Student(_name,_vorname,_matnr,1,new bool[](3));
addressen.push(msg.sender);
}
function onepoint() payable hurdle(10000) onlyTillTest(){
if(studenten[msg.sender].solved[0] == false){
studenten[msg.sender].solved[0] = true;
studenten[msg.sender].punkte += 1;
}
}
function twopoints(uint _value) onlyTillTest(){
if(studenten[msg.sender].solved[1] == false
&& _value == studenten[addressen[0]].matnr
){
studenten[msg.sender].solved[1] = true;
studenten[msg.sender].punkte += 2;
}
}
function sixpoints(bytes32 _h, uint8 _v, bytes32 _r, bytes32 _s) onlyTillTest(){
if(
studenten[msg.sender].solved[2] == false
&& ecrecover(_h, _v, _r, _s) == msg.sender
&& _h == sha3(this)
){
studenten[msg.sender].solved[2] = true;
studenten[msg.sender].punkte += 6;
}
}
}要成功地使用函数twopoints,我需要得到studenten[addressen[0]].matnr的值。
我如何使用web3通过控制台访问此文件?
MyContract.studenten[addressen[0]].matnr不起作用,尽管它是公开的。
ReferenceError: addressen is not defined如何访问此值?
发布于 2017-07-08 05:30:22
使用节点8.1.2和松露3.4.3,此单元测试为我提供了上述合同。
contract('Zusatzaufgabe', function(accounts) {
it("Retrieve", async function() {
const zusatzaufgabe = await Zusatzaufgabe.deployed();
// Populate some entries
await zusatzaufgabe.register("hola", "hola", 123, { from: accounts[1] });
await zusatzaufgabe.register("toma", "joni", 321, { from: accounts[2] });
// This returns Zusatzaufgabe.addressen[0]
const addressen = await zusatzaufgabe.addressen.call(0);
assert.equal(addressen, accounts[1]);
// This returns Zusatzaufgabe.studenten[Zusatzaufgabe.addressen[0]]
const student = await zusatzaufgabe.studenten.call(addressen);
assert.equal(student[2].toNumber(), 123);
});
});最后一次调用将返回一个元组,其中包含struct中的字段。它将返回名字,漩涡名,马特,彭克特。未返回已解决的字段,有关自动生成的getter文档,请参见https://solidity.readthedocs.io/en/develop/contracts.html#getter-functions。另外,int fied (matnr和punkte)作为bignum返回。
发布于 2017-07-07 15:00:43
我需要得到‘studenten[addressen0].matnr的值,我如何使用web3通过控制台访问这个值呢?
这可以通过这样的合同功能来完成:
function getMatnr(address addr) constant returns(uint) {
return studenten[addr].matnr;
}在web3中:
contract.getMatnr.call(addr, function(err, result) {
});ReferenceError: addressen没有定义,我如何访问这个值?
address[] public addressen;对我来说,对addressen数组的宣传来说已经足够了
调用register函数后检查addressen数组。我想,它仍然是空的。
contract.addressen.call(function(err, res) {
});尝试使用没有register修饰符的onlyTillTest函数发送tx。
如果您有getMatnr,那么在web3中需要做的是:
MyContract.addressen.call(function(err, addresses) {
if (err) return console.log(err);
var addr = addresses[0];
MyContract.getMatnr.call(addr, function(err, matnr) {
if (err) return console.log(err);
console.log(matnr);
});
});https://ethereum.stackexchange.com/questions/19661
复制相似问题