작성
·
290
1
안녕하십니까 좋은 강의해주셔서 감사합니다
초반에 dapp 실행후 화면이 뜰때 이더리움 지갑정보를 받아오는 부분이 진행되지않아 확인해보니
TypeError: Cannot read property 'address' of undefined
at getOrCreateWeb3Contract (Drizzle.js:38)
at Drizzle.addContract (Drizzle.js:71)
at runCallEffect (proc.js:513)
at runEffect (proc.js:432)
at next (proc.js:315)
at Object.currCb [as cont] (proc.js:388)
at end (proc.js:356)
at Object.task.cont (proc.js:99)
at next (proc.js:321)
at currCb (proc.js:388)
at proc.js:499
at exec (scheduler.js:19)
at flush (scheduler.js:60)
at asap (scheduler.js:33)
at runPutEffect (proc.js:486)
at runEffect (proc.js:432)
at next (proc.js:315)
at currCb (proc.js:388)
console.<computed> @ index.js:1
위와같은 에러가 발생합니다
디버깅을 해보니 networks 배열안에는 network id가 5777인데 store의 network id는 4 로 지정되어 있어 발생하는 오류였습니다
소스상에서는 문제가없어 보이는데 어떻게 해결해야할지 모르겠어서 질문 남깁니다 !!
답변 1
0
드리즐은 처음 dapp을 열 때 즉시 메타마스크 지갑을 찾아서 dapp 연결을 합니다. 메타마스크 디폴트는 메인넷 이거나 아니면 이전에 테스트넷에 연결한 경우 해당 네트워크에 연결하게 되어 있는 것 같습니다.
만약에 이전에 Rinkeby(network id 4번)에 연결한 적이 있다면 dapp이 시작되면서 메타마스크는 바로 Rinkeby에 연결하게 되고 컨트랙트를 찾게 되는데 Rinkeby에 배포한 적이 없는(주소가 없는) 컨트랙트의 경우에는 주소가 없다고 나오게 됩니다. 오류 메시지는 그것 때문에 나오는 것 같고요. 사실 오류라기 보다는 당연히 발생할 수 있는 상황인 듯 합니다.
로컬 개발 중에는 로컬 가나슈를 실행하고 컨트랙트를 배포하므로 메타마스크를 Localhost:8545에 연결하면 오류는 나지 않을 것 같습니다.
dapp 소스 안에는 dapp이 연결하고자 하는 네트워크 정보를 가지고 있지 않습니다. 네트워크는 메타마스크와 같은 지갑 소프트웨어가 결정합니다. 물론 dapp이 테스트넷에 연결하는 경우 network id를 보고 메인넷에 연결하라는 안내메시지를 표시해줄 수는 있습니다.
트러플의 컨트랙트 컴파일 정보 안에 메인넷, 테스트넷 로컬 가나슈 등의 네트워크에 배포된 컨트랙트 주소정보를 가지고 있습니다. 그래서 Rinkeby에 해당 컨트랙트를 배포한 후 dapp을 실행시키면 Rinkeby에 연결하더라도 오류는 나지 않을 겁니다.