2017-05-18 6 views
2
contract_file = 'contract.sol' 
contract_name = ':SimpleContract' 

Solc = require('solc') 
Web3 = require('web3') 

web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")); 
source_code = fs.readFileSync(contract_file).toString() 

admin_account = web3.eth.accounts[0] 

compiledContract = Solc.compile(source_code) 
abi = compiledContract.contracts[contract_name].interface 
bytecode = compiledContract.contracts[contract_name].bytecode; 
ContractClass = web3.eth.contract(JSON.parse(abi)) 

contract_init_data = { 
    data: bytecode, 
    from: admin_account, 
    gas: 1000000, 
} 

deployed_contract = ContractClass.new(contract_init_data) 
contract_instance = ContractClass.at(deployed_contract.address) 

여기까지입니다. 그러나 놀랍게도 그 줄은 msg.sender.transfer (amount); 내 계약서의 은 굳은 문서의 common pattern section에서 직접 그 라인을 얻었음에도 불구하고 web3에서 컴파일되지 않습니다. transfer()가 0.4.6이 아니기 때문에 Solc을 대신 사용해야했습니다.스마트 계약서 주소로 ether를 보낼 수없는 이유는 무엇입니까?

에테 리엄의 핵심 부분은 전송되지 않습니다()? 나는 내가 다음과 같이 계약 에테르 추가하려고, 0.1

어쨌든 V에 존재하는 것으로 예상했을 것이다 :

load_up = { 
    from: admin_account, 
    to: deployed_contract.address, 
    value: web3.toWei(1, 'ether'), 
} 
web3.eth.sendTransaction(load_up) 

내가 얻을 :

Error: VM Exception while processing transaction: invalid opcode 

을하지 않는 나에게 많은 것을 제공하라. 내가 뭘 잘못하고 있고, 앞으로 어떻게 이런 문제를 디버깅 할 수 있을까?

function AddEth() payable {}

을하고이 같은 내 계약과 상호 작용할 수 :

+1

계약 코드를 게시 할 수 있습니까? 어떤 버전의 solc를 사용하고 있습니까? 그리고 어떤 종류의 노드 (메인, 테스트 또는 로컬 testrpc)를 사용합니까? – Gerben

+0

이것을 확인하십시오. https://ethereum.stackexchange.com/questions/3613/getting-invalid-opcode-error – Gawey

답변

2

그것은 예를 들어, 나는 payable 키워드로 계약하는 방법을 만들 필요가 밝혀

load_up = { 
    from: admin_account, 
    to: deployed_contract.address, 
    value: web3.toWei(10, 'ether'), 
} 
deployed_contract.AddEth.sendTransaction(load_up)