정보실

웹학교

정보실

javascript web3.js를 사용하여 스마트 계약 함수 호출-call() vs send()

본문

web3.js를 사용하여 스마트 계약 함수 호출 


Web3.js는 프론트 엔드 애플리케이션의 스마트 계약과의 상호 작용을 포함하여 이더리움 생태계 개발과 관련된 여러 가지 작업을 수행 할 수 있는 라이브러리입니다.

문자열 변수 이름을 얻고 해당 이름 변수를 새 문자열로 설정하는 두 가지 작업을 수행 할 수 있는 간단한 스마트 계약이 있다고 가정하겠습니다.

pragma solidity >=0.4.24;

contract NameContract {

    string private name = "Ire";

    function getName() public view returns (string)
    {
        return name;
    }

    function setName(string newName) public
    {
        name = newName;
    }

}

프론트 엔드 애플리케이션을 통해 이 스마트 계약과 상호 작용하기 위해 먼저 스마트 계약 ABI 및 주소로 web3.js를 초기화합니다.

import Web3 from 'web3';

const web3 = new Web3(window.ethereum);
await window.ethereum.enable();

const NameContract = web3.eth.Contract(contract_abi, contract_address);


초기화되면 call() 또는 send() 메소드를 사용하여 스마트 계약의 메소드를 호출 할 수 있습니다.

NameContract.methods.getName().call();
NameContract.methods.setName("bitsofcode").send();


call()과 send()의 차이점은 무엇입니까? 


call()과 send() 메소드의 차이점은 호출하는 함수의 유형과 그 효과와 관련이 있습니다. 견고성 기능은 두 가지 범주로 나눌 수 있습니다.

  • 계약 상태를 변경하는 함수
  • 계약 상태를 변경하지 않는 함수

함수가 속한 범주를 명확히 하기 위해 함수 유형을 지정할 수 있습니다.

contract MyContract {

    function myFunction () [visibility] [type] {
        // do something
    }

}


함수 유형을 지정하지 않은 상태로 포함하여 사용할 수 있는 4가지 함수 유형 키워드가 있습니다.


 

 설명

 Alter's State?

 pure

 데이터를 읽거나 쓰지 않습니다

 🚫

 view

 읽지만 데이터를 쓰지 않습니다

 🚫

 payable

 Expecting payment of ether

 ✅

 (unspecified)

 Probably writes data

 ✅


필자의 예제 계약으로 돌아가서 getName() 함수에 유형 보기가 있어 계약 상태를 변경하지 않음을 알 수 있습니다. web3.js를 통해 이 함수를 호출 할 때는 call() 메서드를 사용해야 합니다.

NameContract.methods.getName().call();

반대로 setName() 함수에는 지정된 유형이 없고 계약 상태 (이 경우 name 변수)의 값이 변경됩니다. 이러한 유형의 함수에는 send() 메서드를 사용해야 합니다.

NameContract.methods.setName("bitsofcode").send();


call()과 send()의 효과는 무엇입니까? 


우리가 스마트 계약의 상태를 변경하거나 변경하지 않는 함수를 호출하는 두 가지 별도의 방법이 있는 이유는 전자가 효과적이기 위해서는 블록 체인에 대한 거래와 에테르 비용이 필요하기 때문입니다.

스마트 계약 기능을 실행하는 데 필요한 에테르는 "가스"라고 하며 애플리케이션 사용자가 수락해야 하는 거래입니다. 사용자가 브라우저에서 메타 마스크 플러그인과 같은 이더리움 지갑을 사용하는 경우 팝업 창을 통해 거래 비용을 수락해야 합니다.

Calling smart contract functions using web3.js - call() vs send() 

반면에 call() 메소드를 통해 호출 된 함수를 사용하면 백그라운드에서 자동으로 발생할 수 있으며 사용자 입력을 완료 할 필요가 없습니다.


 

 Creates Transaction?

 Alter's State?

 call()

 🚫

 🚫

 send()

 ✅

 ✅


잘못된 방법을 사용하면 어떻게 됩니까? 


이 차이가 큰 이유는 스마트 계약 함수를 호출하기 위해 잘못된 방법을 사용하는 경우 명시적인 경고가 없기 때문입니다.

예를 들어, call ()메서드를 사용하여 setName() 함수를 실행하면 경고가 표시되지 않습니다.


NameContract.methods.setName("bitsofcode").call();

작동하지 않을 것이다 표면적으로 이 방법은 오류 없이 성공적으로 완료되었을 것입니다. 그러나 변경된 이름 변수를 쿼리하면 변경되지 않았음을 알 수 있습니다.


NameContract.methods.getName().call(); // => "Ire"

NameContract.methods.setName("bitsofcode").call();

NameContract.methods.getName().call(); // => "Ire"


이것이 사실 함수가 작동하지 않는 이유를 디버깅 하는 데 몇 시간을 소비 한 이유입니다. 실제로 문제는 잘못된 메소드를 사용하여 호출했습니다!








  • 트위터로 보내기
  • 페이스북으로 보내기
  • 구글플러스로 보내기
  • 카카오톡으로 보내기

페이지 정보

조회 28회 ]  작성일19-09-04 09:49

웹학교