[TOC]

FMZ를 사용하면 Ethereum 기반 Web3 개발을 쉽게 시작할 수 있습니다.
이더리움은 블록체인 기술을 기반으로 하는 스마트 계약 플랫폼으로, 스마트 계약을 작성하고 배포하는 분산형 방식을 제공합니다. 스마트 계약은 블록체인에서 자동으로 실행될 수 있는 특수한 컴퓨터 프로그램으로, 제3자를 신뢰할 필요 없이 다양한 비즈니스 로직을 구현할 수 있습니다.
Inventor 양적 거래 플랫폼(FMZ.COM)은 개발자가 Ethereum 블록체인과 그 생태계와 더 쉽게 상호작용할 수 있도록 하는 사용하기 쉬운 API를 제공합니다. 분산형 거래소(DEX) 접근, 온체인 데이터 획득, 거래 전송 등의 기능을 실현합니다.
이 튜토리얼의 예제에서는 다음을 사용합니다.JavaScript언어 쓰기, 테스트 환경 사용이더리움 메인넷、고엘리 테스트넷. 또한 튜토리얼에서 사용된 API 인터페이스와 관련 설명, 코드 예시는 FMZ 플랫폼의 API 설명서에서 볼 수 있습니다.
FMZ 양적 거래 플랫폼을 사용하는 방법을 배우기 전에 몇 가지 기본 개념을 알아야 합니다.
FMZ 양적 거래 플랫폼 공식 웹사이트(https://www.fmz.com)에 등록하고 로그인하면 플랫폼의 다양한 기능을 사용할 수 있습니다. FMZ 웹사이트는 전체 시스템의 관리 측면이며, 사용자가 작성한 프로그램은 실제로 호스트에서 실행됩니다. 호스트는 서버, 컴퓨터 등 다양한 장치에 배포될 수 있는 소프트웨어 프로그램입니다. 사용자가 프로그램을 작성하고 FMZ 웹사이트에 실행 중인 인스턴스를 생성하면 FMZ 플랫폼은 호스트와 통신하고 호스트에서 프로그램 인스턴스를 시작합니다.

프로그램 인스턴스를 실행하려면 호스트를 배포해야 합니다. 호스트 배포도 매우 간단하며 플랫폼에 배포 튜토리얼이 있습니다. FMZ에서 제공하는 “원클릭 배포 호스트”를 사용하면 FMZ에서 임대한 서버를 이용해 자동으로 배포할 수도 있습니다.
관리자 프로그램은 네트워크가 정상적일 경우 서버, 개인용 컴퓨터 및 기타 장치에 배포 및 실행할 수 있습니다(해당 대상은 거래소 인터페이스, 노드 주소 등과 같이 액세스 가능해야 함). 배포의 주요 단계는 다음과 같습니다.

robot실행 파일. 관리자 통신 주소를 구성합니다. 이 통신 주소는 각 FMZ 계정마다 고유합니다. FMZ에 로그인한 후,https://www.fmz.com/m/add-node해당 페이지는 자신의 주소(예:./robot -s node.fmz.com/xxxxx이 주소 문자열은 여기 있습니다xxxxx각 FMZ 계정마다 위치 내용이 다르게 표시됩니다. 마지막으로 FMZ 계정의 비밀번호를 입력해야 합니다. 이를 구성한 후 호스트 프로그램을 실행합니다.FMZ 플랫폼에 관리자 페이지를 추가하세요. 주소는 다음과 같습니다.https://www.fmz.com/m/add-node

FMZ 양적 거래 플랫폼은 다음을 지원하는 무료 디버깅 도구를 제공합니다.JavaScript,TypeScript페이지 주소는 https://www.fmz.com/m/debug입니다. 인스턴스를 생성하고 실행하는 데 비용이 청구되기 때문입니다. 이 디버깅 도구는 초기 학습 기간 동안 테스트와 학습에 사용할 수 있습니다. 디버깅 도구는 인스턴스를 만드는 것과 다르지 않습니다. 단, 실행 시간이 3분으로 제한됩니다.
사용TypeScript언어를 사용할 때는 첫 번째 코드 줄에 언어를 작성해야 합니다.// @ts-check전환하려면TypeScript모드가 전환되지 않으면 기본값은 다음과 같습니다.JavaScript언어.
FMZ에서 “거래소”는 일반적인 개념입니다. CEX 거래소의 경우 특정 거래소 계정 구성을 말합니다. web3의 경우 이 교환은 노드 주소와 개인 키 구성을 포함한 구성 정보를 나타냅니다.
FMZ 플랫폼에 로그인하면https://www.fmz.com/m/add-platform페이지에서 교환 정보를 구성할 수 있습니다. 교환은 일반적인 개념입니다.

선택하다Web3, RPC 노드 주소와 개인 키를 구성합니다. 오른쪽 하단 모서리에 있는 “민감한 정보는 암호화되어 독립적인 개인 키를 사용하여 저장됩니다”를 클릭하면 보안 메커니즘을 볼 수 있습니다.
노드는 직접 구축할 수도 있고 노드 서비스 제공자가 제공할 수도 있습니다. 다음과 같은 다양한 노드 서비스 제공자가 있습니다.Infura. 등록 후 귀하 계정의 노드 주소를 볼 수 있습니다. 메인넷과 테스트넷이 있는데, 이게 더 편리합니다. 위의 그림에서 이 노드 주소를 구성하세요.Rpc Address컨트롤에서. 구성된 교환 객체를 구별하기 위해 태그 자체에 이름을 지정할 수 있습니다.

그림에서https://mainnet.infura.io/v3/xxxxxxxxxxxxx이는 개인 Infura ETH 메인넷 RPC 노드 주소입니다.
관리자 프로그램을 배포하고 교환 객체를 구성한 후 FMZ.COM의 “디버깅 도구”를 사용하여 테스트를 수행할 수 있습니다. Ethereum과 상호 작용하려면 Ethereum RPC 메서드를 호출합니다. 이 장에 나열된 여러 RPC 메서드 외에도 다음과 같은 다른 RPC 메서드에 대한 설명서를 참조할 수 있습니다.https://www.quicknode.com/docs。
몇 가지 간단한 예를 들어 기본부터 시작해 보겠습니다. 그림에서 보는 것처럼 다양한 언어와 도구로 web3에 접속하는 방법이 있습니다.

RPC 메서드 호출도 FMZ에 캡슐화됩니다. 이러한 함수는 FMZ API 함수에 캡슐화됩니다.exchange.IO가운데. 호출 방법은 다음과 같습니다.exchange.IO("api", "eth", ...). 첫 번째 매개변수는 고정되어 있습니다."api", 두 번째 매개변수는 고정됩니다"eth", 다른 매개변수는 호출되는 특정 RPC 메서드에 따라 달라집니다.
정보를 출력하기 위해 FMZ 플랫폼을 사용합니다.Log기능,Log이 함수는 여러 매개변수를 전달한 다음 FMZ 플랫폼의 “디버그 도구” 또는 “실제 거래” 페이지의 로그 영역에 출력할 수 있습니다. “디버그 도구” 페이지는 테스트를 위한 주요 도구가 될 것입니다.
이더리움eth_getBalance이 방법은 Ethereum의 주소에 대한 ETH 잔액을 쿼리하는 데 사용됩니다. 이 방법은 두 개의 매개변수를 전달해야 합니다.
이더리움의 창시자를 살펴보자V神ETH 지갑 주소, 알려진 주소는 다음과 같습니다.0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045。
function main() {
let ethBalance = exchange.IO("api", "eth", "eth_getBalance", "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", "latest")
Log("ethBalance:", ethBalance)
}
관리자는 배치되었고(그림: linux/amd64 …) 교환 객체는 구성되었습니다(그림: Web3 테스트). 디버깅 도구에서 코드를 테스트합니다.

“실행” 버튼을 클릭하여 이 코드를 실행하고 결과를 표시합니다.
ethBalance: 0x117296558f185bbc4c6
Log이 함수는 다음을 인쇄합니다.ethBalance변수 값은 다음과 같습니다.0x117296558f185bbc4c6, 이는 문자열 유형입니다. 예16진수 값의 ETH 잔액,에 의해wei단위로서,1e18 wei1이다ETH. 따라서 읽을 수 있는 10진수 ETH 잔액으로 변환해야 합니다.
할 것이다ethBalance읽을 수 있는 데이터로 변환:
function main() {
let ethBalance = exchange.IO("api", "eth", "eth_getBalance", "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", "latest")
Log("ethBalance:", ethBalance)
// 将ethBalance转换为可读的数据
let vitalikEthBalance = parseInt(ethBalance.substring(2), 16) / 1e18
Log("vitalikEthBalance:", vitalikEthBalance)
}

위에https://etherscan.io/질문:

그러나 이러한 처리에는 언어 자체의 정확도로 인해 편차가 있을 수 있으므로 FMZ 플랫폼에는 데이터 처리를 위한 두 가지 기본 제공 기능이 있습니다.
코드를 다시 조정하세요:
function main() {
let ethBalance = exchange.IO("api", "eth", "eth_getBalance", "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", "latest")
// ETH的精度单位为1e18
let ethDecimal = 18
Log("vitalikEthBalance:", Number((BigDecimal(BigInt(ethBalance)) / BigDecimal(Math.pow(10, ethDecimal))).toString()))
}
vitalikEthBalance: 5149.6244846875215
eth_chainId그리고net_version사용법이 비슷해서 같이 테스트해보았습니다. 두 함수 모두 현재 RPC 노드가 연결된 블록체인의 ID를 반환합니다. 차이점은 다음과 같습니다.net_version10진수 ID를 반환합니다.eth_chainId16진수 ID를 반환합니다.
체인 ID에 해당하는 네트워크 이름
1 - ethereum mainnet
2 - morden testnet (deprecated)
3 - ropsten testnet
4 - rinkeby testnet
5 - goerli testnet
11155111 - sepolia testnet
10 - optimism mainnet
69 - optimism kovan testnet
42 - kovan testnet
137 - matic/polygon mainnet
80001 - matic/polygon mumbai testnet
250 - fantom mainnet
100 - xdai mainnet
56 - bsc mainnet

구성된 Ethereum 테스트 네트워크를 사용하세요goerli노드 테스트:
function main() {
let netVersionId = exchange.IO("api", "eth", "net_version")
let ethChainId = exchange.IO("api", "eth", "eth_chainId")
Log("netVersionId:", netVersionId)
Log("ethChainId:", ethChainId, " ,转换:", parseInt(ethChainId.substring(2), 16))
}

부르다eth_gasPrice현재 체인을 쿼리하는 방법gas price。
function toAmount(s, decimals) {
return Number((BigDecimal(BigInt(s)) / BigDecimal(Math.pow(10, decimals))).toString())
}
function main() {
let gasPrice = exchange.IO("api", "eth", "eth_gasPrice")
Log("gasPrice:", gasPrice, " ,转换:", toAmount(gasPrice, 0))
}
여기서는 16진수 문자열을 읽을 수 있는 값으로 변환하는 함수를 작성합니다.toAmount. 또 다른 주의할 점은 가스 가격의 단위가wei, 그래서 매개변수decimals해당 실제 매개변수는 0으로 전달될 수 있습니다.
eth_blockNumbe블록 높이를 쿼리하는 데 사용됩니다.
function toAmount(s, decimals) {
return Number((BigDecimal(BigInt(s)) / BigDecimal(Math.pow(10, decimals))).toString())
}
function main() {
let blockNumber = exchange.IO("api", "eth", "eth_blockNumber")
Log(toAmount(blockNumber, 0))
}
디버거에서 실행:

https://etherscan.io/질의에 대하여:

블록 정보를 쿼리합니다.
function main() {
let blockNumber = exchange.IO("api", "eth", "eth_blockNumber")
Log(blockNumber)
let blockMsg = exchange.IO("api", "eth", "eth_getBlockByNumber", blockNumber, true)
Log(typeof(blockMsg), blockMsg)
// 由于Log输出的内容过多,会自动截断,所以遍历返回的区块信息各个字段,逐个打印
for (let key in blockMsg) {
Log("key:", key, ", val:", blockMsg[key])
}
}
“디버그 도구”에서 실행하면 다음 정보를 얻을 수 있습니다.

이더리움에서는 수많은 스마트 계약 애플리케이션이 실행되고 있습니다.ENS그 중 하나입니다.ENS, 즉 이더리움 네임 서비스는 이더리움 블록체인을 기반으로 하는 분산형 도메인 이름 확인 서비스입니다.
튜토리얼에서 이더리움 창시자 비탈릭 부테린의 지갑 잔액을 조회했던 예시를 기억하시나요? Vitalik의 지갑 주소 중 하나는 다음과 같습니다.0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045. 그러면 이 주소를 어떻게 알 수 있을까요? 실제로, 통해ENS직관적인 이름을 사용하는 스마트 계약vitalik.eth(vitalik은 Vitalik의 이름입니다) 질의를 수행합니다.
이 장의 다음 내용에서는 이더리움 메인 네트워크 환경을 사용합니다.ENS이 문서에서는 쿼리할 Ethereum 도메인 이름이 다음과 같아야 함을 보여줍니다.Hashing Names, 다음 코드를 사용하세요vitalik.eth이름이 처리되었습니다.
function nameHash(name) {
if (name == "") {
return "0000000000000000000000000000000000000000000000000000000000000000"
} else {
let arr = name.split(".")
let label = arr[0]
arr.shift()
let remainder = arr.join(".")
return Encode("sha3.keccak256", "hex", "hex", nameHash(remainder) + Encode("sha3.keccak256", "raw", "hex", label))
}
}
위의 코드 예제에서 우리는 또 다른 익숙하지 않은 함수를 봅니다.Encode이 기능은 FMZ 플랫폼의 API 기능으로, 특히 FMZ 플랫폼에서 인코딩 작업을 수행하는 데 사용됩니다. 이 기능은 여러 인코딩 방법과 여러 해시 알고리즘을 지원합니다.
Encode(algo, inputFormat, outputFormat, data, keyFormat, key string)
ENS 문서에 따르면 다음을 사용합니다.sha3.keccak256알고리즘은 데이터를 처리합니다.
부르다nameHash예를 들어 함수:Log(nameHash("vitalik.eth")), 우리는 얻을 수 있습니다:ee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835, “0x” 접두사를 추가해야 합니다.0xee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835ENS 스마트 계약으로서resolver메서드의 매개변수.
let ensNode = "0x" + nameHash("vitalik.eth") // 准备好调用resolver方法的参数ensNode
ENS 문서에 따르면 ENS 스마트 계약 애플리케이션의 계약 주소는 다음과 같습니다.0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e. 스마트 계약을 호출할 때resolver진행하기 전에 계약서를 준비해야 합니다.ABI。
이 내용을 배우고 나니, 스마트 계약이 무엇인지 궁금해졌습니다.ABI모직물?
ABI,即应用程序二进制接口(Application Binary Interface),是智能合约与外部世界进行通信的接口标准。
智能合约的 ABI 定义了合约的函数接口、参数类型、返回值等信息,以及调用合约的方式和参数传递方式等规范。
智能合约的 ABI 通常以 JSON 格式存储,包含以下信息:
合约的函数接口:函数名、参数列表、返回值等信息。
函数参数类型:如 uint256、bool、string 等。
函数的输入参数和输出参数的编码方式:智能合约使用一种称为 Solidity ABI 的编码方式来编码函数的输入参数和输出参数,
以便与以太坊网络进行交互。
在以太坊网络中,使用智能合约的 ABI 来调用合约的函数。当需要调用合约函数时,需要提供函数名和函数参数,以及将函数参数按照 ABI 编码方式编码后的字节码。
以太坊节点会将这些信息打包成一笔交易,并将交易发送到以太坊网络中执行。
智能合约的 ABI 在 Solidity 语言中可以通过 interface 关键字来定义。以太坊开发工具如 Remix IDE、Truffle 等也提供了 ABI 编辑和生成工具,
使得开发者可以方便地创建和使用智能合约的 ABI。
ENS ABI에서 다음을 추출합니다.resolver전체 ABI는 다음에서도 사용할 수 있습니다.https://etherscan.io/GitHub에서 계약의 ABI를 쿼리하거나 다른 방법(예: 관련 프로젝트 문서)을 통해 ABI를 얻을 수 있습니다.

let abiENS_resolver = `[{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"resolver","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]`
여기서는 FMZ 플랫폼의 새로운 호출 방법을 배워야 합니다.exchange.IO("abi", address, abiContent), 이 방법을 사용하여 ABI를 등록합니다.address매개변수는 스마트 계약의 주소입니다.abiContent매개변수는 해당 스마트 계약 ABI(문자열)입니다.
let abiENS_resolver = `[{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"resolver","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]`
exchange.IO("abi", "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", abiENS_resolver) // 0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e 是在以太坊主网上部署的ENS智能合约的地址
다음으로 ENS 스마트 계약을 호출할 수 있습니다.resolver반환하는 메서드ENS: Public Resolver계약서의 주소.

let resolverAddress = exchange.IO("api", "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", "resolver", ensNode)
사용ENS: Public Resolver계약상의addrVitalik의 지갑 주소를 얻는 방법. 전화하려면ENS: Public Resolver계약서는 먼저 ABI를 등록해야 합니다. 이 스마트 계약의 ABI 정보는 여전히 다음에서 찾을 수 있습니다.https://etherscan.io/얻다.
let abiENSPublicResolver = `[{"inputs":[{"internalType":"contract ENS","name":"_ens","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"contentType","type":"uint256"}],"name":"ABIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"address","name":"a","type":"address"}],"name":"AddrChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"coinType","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"newAddress","type":"bytes"}],"name":"AddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"bool","name":"isAuthorised","type":"bool"}],"name":"AuthorisationChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"hash","type":"bytes"}],"name":"ContenthashChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"name","type":"bytes"},{"indexed":false,"internalType":"uint16","name":"resource","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"record","type":"bytes"}],"name":"DNSRecordChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"name","type":"bytes"},{"indexed":false,"internalType":"uint16","name":"resource","type":"uint16"}],"name":"DNSRecordDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"DNSZoneCleared","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"bytes4","name":"interfaceID","type":"bytes4"},{"indexed":false,"internalType":"address","name":"implementer","type":"address"}],"name":"InterfaceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"NameChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"x","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"y","type":"bytes32"}],"name":"PubkeyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"string","name":"indexedKey","type":"string"},{"indexed":false,"internalType":"string","name":"key","type":"string"}],"name":"TextChanged","type":"event"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"contentTypes","type":"uint256"}],"name":"ABI","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"addr","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"}],"name":"addr","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"authorisations","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"clearDNSZone","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"contenthash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"name","type":"bytes32"},{"internalType":"uint16","name":"resource","type":"uint16"}],"name":"dnsRecord","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"name","type":"bytes32"}],"name":"hasDNSRecords","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"interfaceImplementer","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"pubkey","outputs":[{"internalType":"bytes32","name":"x","type":"bytes32"},{"internalType":"bytes32","name":"y","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"contentType","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"setABI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"},{"internalType":"bytes","name":"a","type":"bytes"}],"name":"setAddr","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"a","type":"address"}],"name":"setAddr","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"isAuthorised","type":"bool"}],"name":"setAuthorisation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes","name":"hash","type":"bytes"}],"name":"setContenthash","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"setDNSRecords","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes4","name":"interfaceID","type":"bytes4"},{"internalType":"address","name":"implementer","type":"address"}],"name":"setInterface","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"name","type":"string"}],"name":"setName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"x","type":"bytes32"},{"internalType":"bytes32","name":"y","type":"bytes32"}],"name":"setPubkey","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"name":"setText","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"}],"name":"text","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"}]`
exchange.IO("abi", resolverAddress, abiENSPublicResolver)

마지막 호출ENS: Public Resolver계약상의addr방법, 매개변수는 여전히ensNode。
let vitalikAddress = exchange.IO("api", resolverAddress, "addr", ensNode)
Log("vitalikAddress:", vitalikAddress)
로그 함수 출력:

vitalikAddress: 0xd8da6bf26964af9d7eed9e03e53415d37aa96045
function nameHash(name) {
if (name == "") {
return "0000000000000000000000000000000000000000000000000000000000000000"
} else {
let arr = name.split(".")
let label = arr[0]
arr.shift()
let remainder = arr.join(".")
return Encode("sha3.keccak256", "hex", "hex", nameHash(remainder) + Encode("sha3.keccak256", "raw", "hex", label))
}
}
function main() {
// 计算名称
let ensNode = "0x" + nameHash("vitalik.eth")
// 注册ENS合约
let abiENS_resolver = `[{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"resolver","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]`
exchange.IO("abi", "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", abiENS_resolver)
let resolverAddress = exchange.IO("api", "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", "resolver", ensNode)
// 注册ENS Public Resolver合约
let abiENSPublicResolver = `[{"inputs":[{"internalType":"contract ENS","name":"_ens","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"contentType","type":"uint256"}],"name":"ABIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"address","name":"a","type":"address"}],"name":"AddrChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"coinType","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"newAddress","type":"bytes"}],"name":"AddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"bool","name":"isAuthorised","type":"bool"}],"name":"AuthorisationChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"hash","type":"bytes"}],"name":"ContenthashChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"name","type":"bytes"},{"indexed":false,"internalType":"uint16","name":"resource","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"record","type":"bytes"}],"name":"DNSRecordChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"name","type":"bytes"},{"indexed":false,"internalType":"uint16","name":"resource","type":"uint16"}],"name":"DNSRecordDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"DNSZoneCleared","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"bytes4","name":"interfaceID","type":"bytes4"},{"indexed":false,"internalType":"address","name":"implementer","type":"address"}],"name":"InterfaceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"NameChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"x","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"y","type":"bytes32"}],"name":"PubkeyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"string","name":"indexedKey","type":"string"},{"indexed":false,"internalType":"string","name":"key","type":"string"}],"name":"TextChanged","type":"event"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"contentTypes","type":"uint256"}],"name":"ABI","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"addr","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"}],"name":"addr","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"authorisations","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"clearDNSZone","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"contenthash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"name","type":"bytes32"},{"internalType":"uint16","name":"resource","type":"uint16"}],"name":"dnsRecord","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"name","type":"bytes32"}],"name":"hasDNSRecords","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"interfaceImplementer","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"pubkey","outputs":[{"internalType":"bytes32","name":"x","type":"bytes32"},{"internalType":"bytes32","name":"y","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"contentType","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"setABI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"},{"internalType":"bytes","name":"a","type":"bytes"}],"name":"setAddr","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"a","type":"address"}],"name":"setAddr","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"isAuthorised","type":"bool"}],"name":"setAuthorisation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes","name":"hash","type":"bytes"}],"name":"setContenthash","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"setDNSRecords","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes4","name":"interfaceID","type":"bytes4"},{"internalType":"address","name":"implementer","type":"address"}],"name":"setInterface","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"name","type":"string"}],"name":"setName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"x","type":"bytes32"},{"internalType":"bytes32","name":"y","type":"bytes32"}],"name":"setPubkey","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"name":"setText","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"}],"name":"text","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"}]`
exchange.IO("abi", resolverAddress, abiENSPublicResolver)
let vitalikAddress = exchange.IO("api", resolverAddress, "addr", ensNode)
Log("vitalikAddress:", vitalikAddress)
}
이전 과정 챕터에서 우리는 개인 키를 구성하는 방법을 배웠습니다. 구성된 거래소 객체의 경우, 이 개인 키에 해당하는 지갑 주소를 어떻게 알 수 있을까요? FMZ에서 이용 가능exchange.IO("address")해당 함수는 구성된 개인 키에 해당하는 지갑 주소를 가져옵니다.
이 장의 다음 내용은 다음을 사용합니다.Goerli테스트 네트워크 환경이므로 내가 사용하는 노드는 다음과 같습니다.https://goerli.infura.io/v3/*******Infura는 등록된 각 사용자에게 다른 노드 주소를 할당합니다.*******구체적인 내용은 숨겨져 있습니다.
function main() {
let walletAddress = exchange.IO("address")
Log("测试网 goerli 钱包地址:", walletAddress)
}

지갑 주소를 알게 되면 Ethereum의 RPC 방식을 사용할 수 있습니다.eth_getTransactionCount지갑 주소의 거래 수를 쿼리합니다. 이 카운트는 이더리움에서 매우 일반적으로 사용됩니다. 사실, 돈을 이체할 때 전달해야 하는 것입니다.nonce매개변수, 이더리움에서 nonce는 각 거래가 고유함을 보장하는 데 사용되는 숫자입니다. 이는 새로운 거래가 전송될 때마다 자동으로 증가하는 숫자입니다. 따라서 스마트 계약에 거래를 보낼 때 거래가 고유하고 올바른 순서인지 확인하기 위해 nonce를 제공해야 합니다. 일부 데이터와 문서에서 다음을 찾을 수 있습니다.

Go 언어로 된 Ethereum 라이브러리는 다음과 같습니다.PendingNonceAt실제로 함수는 호출합니다eth_getTransactionCount방법. 이전 과정에서는 RPC 메서드를 호출하는 방법도 배웠습니다. 여기서도 다시 사용하겠습니다.exchange.IO("api", "eth", ...)기능.
function toAmount(s, decimals) {
return Number((BigDecimal(BigInt(s)) / BigDecimal(Math.pow(10, decimals))).toString())
}
function main() {
let walletAddress = exchange.IO("address")
Log("测试网 goerli 钱包地址:", walletAddress)
/**
* eth_getTransactionCount
* @param address - string - The address from which the transaction count to be checked.
* @param blockNumber - string - The block number as a string in hexadecimal format or tags.
* @returns The integer of the number of transactions sent from an address encoded as hexadecimal.
*/
let nonce = exchange.IO("api", "eth", "eth_getTransactionCount", walletAddress, "pending")
Log("钱包地址:", walletAddress, "当前的 nonce:", nonce, ",转换为10进制:", toAmount(nonce, 0))
}
이체 작업을 설명하기 전에 몇 가지 개념을 간략히 이해해 보겠습니다. 이더리움에서 돈을 이체할 때 일정량의 ETH 토큰이 소모됩니다(가스 수수료로). 가스 요금은 두 가지 매개변수에 의해 결정됩니다.
그러나 이더리움 네트워크의 가스 요금은 시장 수요와 사용자가 기꺼이 지불할 금액에 따라 항상 변동하므로 고정된 가스 요금을 코드에 작성하는 것이 이상적이지 않을 때가 있습니다. 우리는 이전에 배운 것을 사용할 수 있습니다eth_gasPrice평균 가스 가격을 얻을 수 있는 방법입니다.
표준 이더 전송에 대한 가스 한도는 21,000단위입니다.
알았어요nonce,gasPrice,gasLimit이러한 개념을 사용하면 전송을 테스트할 수 있습니다. 매우 간단하고 사용하기 쉬운 전달 함수가 FMZ에 캡슐화되어 있습니다.
exchange.IO("api", "eth", "send", toAddress, toAmount)
전송에 사용될 경우,exchange.IO세 번째 매개변수는 항상 “보내기”입니다.toAddress매개변수는 전송 중에 ETH를 수신하는 주소입니다.toAmount전송된 ETH의 양.
nonce,gasPrice,gasLimit이러한 매개변수는 FMZ의 시스템에서 기본적으로 자동으로 얻은 값을 사용할 수 있습니다. 다음을 지정할 수도 있습니다.
exchange.IO("api", "eth", "send", toAddress, toAmount, {gasPrice: 5000000000, gasLimit: 21000, nonce: 100})
다음으로, 우리는 테스트 네트워크 goerli의 특정 주소로 특정 양의 ETH를 전송합니다:
function toInnerAmount(s, decimals) {
return (BigDecimal(s)*BigDecimal(Math.pow(10, decimals))).toFixed(0)
}
function main() {
let walletAddress = exchange.IO("address")
Log("测试网 goerli 钱包地址:", walletAddress)
let ret = exchange.IO("api", "eth", "send", "0x4D75a08E870674E68cAE611f329A27f446A66813", toInnerAmount(0.01, 18))
return ret // 返回Transaction Hash : 0xa6f9f51b00d8ae850b0f204380b59da98f4bbce34b813577d3d948f61de4734e
}
이더리움 전송금액의 단위는wei, 사용자 정의 기능을 사용해야 합니다.toInnerAmount처리됨wei단위의 값.
존재하다https://etherscan.io/트랜잭션 해시 쿼리:0xa6f9f51b00d8ae850b0f204380b59da98f4bbce34b813577d3d948f61de4734e。

전송 해시를 쿼리하는 코드를 작성할 수도 있습니다.0xa6f9f51b00d8ae850b0f204380b59da98f4bbce34b813577d3d948f61de4734e,사용eth_getTransactionReceipt질의하는 방법.
function main() {
let transHash = "0xa6f9f51b00d8ae850b0f204380b59da98f4bbce34b813577d3d948f61de4734e"
let info = exchange.IO("api", "eth", "eth_getTransactionReceipt", transHash)
return info
}
쿼리 결과:
{
"cumulativeGasUsed": "0x200850",
"effectiveGasPrice": "0x1748774421",
"transactionHash": "0xa6f9f51b00d8ae850b0f204380b59da98f4bbce34b813577d3d948f61de4734e",
"type": "0x0",
"blockHash": "0x6bdde8b0f0453ecd24eecf7c634d65306f05511e0e8f09f9ed3f59eee2d06ac7",
"contractAddress": null,
"blockNumber": "0x868a50",
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"gasUsed": "0x5208",
"to": "0x4d75a08e870674e68cae611f329a27f446a66813",
"status": "0x1",
"transactionIndex": "0x23",
"from": "0x6b3f11d807809b0b1e5e3243df04a280d9f94bf4",
"logs": []
}
각 필드에 대한 설명:
blockHash - 该交易所在区块的哈希值
blockNumber - 以十六进制编码的该交易所在区块的块号
contractAddress - 如果是合约创建,该合约的地址;否则为null
cumulativeGasUsed - 该交易在区块中执行时使用的总燃气量
effectiveGasPrice - 每单位燃气的总基础费用加小费
from - 发送者的地址
gasUsed - 该特定交易使用的燃气量
logs - 生成该交易的日志对象数组
address - 生成该日志的地址
topics - 0到4个32字节索引日志参数的数据数组。在Solidity中,第一个主题是事件签名的哈希值(例如Deposit(address,bytes32,uint256)),除非你使用匿名说明符声明该事件
data - 日志的32字节非索引参数
blockNumber - 该日志所在区块的块号
transactionHash - 该日志创建时的交易哈希值。如果该日志处于待定状态,则为null
transactionIndex - 该日志创建时的交易索引位置。如果该日志处于待定状态,则为null
blockHash - 该日志所在区块的哈希值
logIndex - 该日志在区块中的索引位置,以十六进制编码的整数。如果该日志处于待定状态,则为null
removed - 如果该日志已被删除,则为true,由于链重组而被删除;如果是有效的日志,则为false
logsBloom - 用于检索相关日志的布隆过滤器
status - 以十六进制编码的值,它要么是1(成功),要么是0(失败)
to - 接收者的地址。如果是合约创建交易,则为null
transactionHash - 该交易的哈希值
transactionIndex - 以十六进制编码的该交易在区块中的索引位置
type - 值的类型
우리는계약 정보 읽기이 섹션에서는 Ethereum에 배포된 ENS 계약 메서드를 호출하여 Vitalik의 지갑 주소를 얻는 전체 예를 사용합니다. 이러한 방법은 다음에 속합니다.Read메서드, 이 메서드를 호출하는 것은 필요하지 않습니다.gas(이전에 가스에 관해 이야기했던 걸 기억하시나요?) 이 섹션에서는 Ethereum에서 일부 스마트 계약을 호출합니다.Write방법 및 지불gas. 이러한 작업은 전체 네트워크의 모든 노드와 채굴자에 의해 검증되고 블록체인 상태가 변경됩니다.
ERC20 계약(ERC20 토큰 계약)의 경우 FMZ 플랫폼은 ERC20 계약의 ABI를 일반적으로 사용되는 ABI로 나열하고 시스템에 직접 구축하여 ABI를 등록하는 단계를 제거합니다. 이전 튜토리얼에서 ABI에 대해서도 알아보았습니다. ENS 계약 메서드를 호출할 때 먼저 ENS 계약의 ABI를 등록합니다.
ABI를 더 명확하게 이해하려면 사용하기 전에 확인할 수 있습니다. 다음은 ERC20 계약의 ABI입니다.
”`javascript [{“constant”:true,“inputs”:[],“name”:“name”,“outputs”:[{“name”:“”,“type”:“string”}],“payable”:false,“stateMutability”:“view”,“type”:“function”},{“constant”:false,“inputs”:[{“name”:“guy”,“type”:“address”},{“name”:“wad”,“type”:“uint256”}],“name”:“approve”,“outputs”:[{“name”:“”,“type”:“bool”}],“payable”:false,“stateMutability”:“nonpayable”,“type”:“function”},{“constant”:true,“inputs”:[],“name”:“totalSupply”,“outputs”:[{”