2017-12-24 18 views
0

나는, 스마트 계약에 새로운 해요 그리고 나는이 시험 계약에테 리움 스마트 계약에는 함수의 반환 값

contract test { 
    function callme(address dest, uint num, bytes data, uint nonce) 
     public 
     returns (bytes32 myhash) 
    { 
     myhash = sha3(dest, num, data, nonce); 

     return (myhash); 
    } 
} 

그때 test.callme (eth.accounts [0], 10, 0xaaaaa 전화를 구축했습니다 1234) 전달 된 매개 변수의 sha3 해시를 반환 할 것으로 기대하지만 반환 값이 없습니다.

> test.callme(eth.accounts[0], 10, 0xaaaaa, 1234) 
INFO [12-24|19:35:40] Submitted transaction     fullhash=0x694e0e38d0cf8744e62113750339a65f1d5a35cdc634eeb02b93581a926fea1a recipient=0xed712462999f8f68BbF618C3845F4333eDC31cD5 
"0x694e0e38d0cf8744e62113750339a65f1d5a35cdc634eeb02b93581a926fea1a" 

어떤 도움

+0

리믹스에서 재생할 수 없습니다.이 함수는 적절한 반환 값을 제공합니다. 당신이 일하고있는 것이 확실하지 않지만 명령이 당신에게 반환 가치를 주기로되어 있다고 확신합니까? 당신이 그 전화를 보냈다는 것을 확인한 것처럼 보입니다. 반드시 돌려 줄 것이 없다고 말하는 것은 아닙니다. – elsyr

+0

geth console을 사용하고 있습니다. "당신은 명령이 당신에게 반환 값을 주기로되어 있다고 확신합니까?" "반환 (myhash)"이 있으므로 반환 될 것으로 기대되는 것입니까? – kinvo88

+0

밝혀졌습니다. 나는 실수를 재현하여 오류를 재현하려고합니다. 해결책을 게시했습니다! – elsyr

답변

0

당신의 구문이 조금 떨어져 있습니다 감사합니다 - 당신은 당신의 반환 값 myhash 이름을 할 필요가 없습니다. 함수가 계약의 스토리지에서 아무것도 변경에 대한 계획되지 않기 때문에 나는 또한 constant 키워드를 던졌다

contract test { 
    function callme(address dest, uint num, bytes data, uint nonce) 
     public 
     constant 
     returns (bytes32) 
    { 
     bytes32 myhash = sha3(dest, num, data, nonce); 
     return myhash; 
    } 
} 

: 이런 식으로 뭔가 트릭을 할해야합니다. 그것은 작은 변화이지만, 당신이하려는 것을 위해 필요합니다.

상수를 포함하면 말하자면 블록 체인을 수정할 필요가 없다고 말하기 때문에 '반환'값을 얻을 수 있습니다. 본질적으로 체인을 읽는 것이지 ' 쓰기 '.

는 다음과 같이 한 계약을 상상해

contract test { 

    uint example; 

    function callme() 
     public 
     returns (uint) 
    { 
     example = example + 1; 
     return example; 
    } 
} 

(우리가 blockchain을 수정하고 이후) 우리가 값을 반환 전에 우리가 callme에 보내 트랜잭션이 실제로 실행해야합니다. 따라서 블록 체인이 먼저 업데이트 될 때까지 기다려야하기 때문에 최종 값을 즉시 반환 할 수 없습니다 (대신 트랜잭션에 대한 정보를 반환합니다).

+0

감사합니다! 이것은 이제 더 이해가됩니다. 대답의 두 번째 부분에 대해서는 블록 체인이 업데이트 된 후에 어떻게 '예제'값을 얻으려고할까요? (내가 가지고있는 것은 트랜잭션 해시입니다) – kinvo88

+0

AFAIK, 당신은 (적어도 현재 상태의 Solidity에서는) 그렇게 할 수 없습니다. – elsyr