首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问智能契约的公共变量

访问智能契约的公共变量
EN

Ethereum用户
提问于 2017-07-07 14:09:14
回答 2查看 5K关注 0票数 3

我有以下合同:

代码语言:javascript
复制
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不起作用,尽管它是公开的。

代码语言:javascript
复制
ReferenceError: addressen is not defined

如何访问此值?

EN

回答 2

Ethereum用户

发布于 2017-07-08 05:30:22

使用节点8.1.2和松露3.4.3,此单元测试为我提供了上述合同。

代码语言:javascript
复制
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返回。

票数 1
EN

Ethereum用户

发布于 2017-07-07 15:00:43

我需要得到‘studenten[addressen0].matnr的值,我如何使用web3通过控制台访问这个值呢?

这可以通过这样的合同功能来完成:

代码语言:javascript
复制
function getMatnr(address addr) constant returns(uint) {
    return studenten[addr].matnr;
}

在web3中:

代码语言:javascript
复制
contract.getMatnr.call(addr, function(err, result) {

});

ReferenceError: addressen没有定义,我如何访问这个值?

address[] public addressen;对我来说,对addressen数组的宣传来说已经足够了

调用register函数后检查addressen数组。我想,它仍然是空的。

代码语言:javascript
复制
contract.addressen.call(function(err, res) {

});

尝试使用没有register修饰符的onlyTillTest函数发送tx。

更新

如果您有getMatnr,那么在web3中需要做的是:

代码语言:javascript
复制
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);
   });
});
票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/19661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档