NFFT 및 OpenSea

22918 단어 Ethereumnftopenseatech
NFC에 대해 여러가지 조사를 했기 때문에 그 메모예요

만든 물건


https://github.com/akihokurino/rust-opensea

대체 토큰과 비 대체 토큰에 대해


NFFT는 비대체 토큰으로 불리지만, 그 반대의 대체 토큰은 지금까지 ERC20 토큰이 된다.
https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol
실제 ERC20을 구현하는 데서 알 수 있듯이
mapping(address => uint256) private _balances;
주소마다 영패를 설정하는 양에 대해 이 영패의 하나하나는 다르지 않고 대체할 수 있다.
NFFT는 ERC 721의 규격에 부합하는 것이 하나 있는데, 똑같이 본 후에
https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol
mapping(uint256 => address) private _owners;
는 현재'uint256'(영패의 ID)를 주소에 연결하는 형식으로 누가 특정 영패의 ID를 가지고 있는지 확인할 수 있다.이 경우 토큰마다 아이디가 다르기 때문에 대체적이지 않다.
NFC 중 ERC 1155 표준에 부합되는 것이 하나 더 있다. 바로
https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/ERC1155.sol
mapping(uint256 => mapping(address => uint256)) private _balances;
ERC 721과 달리 특정 토큰의 ID가 주소와 연결되고 토큰이 몇 개 있는지를 설정하는 부분이다.따라서 ERC 1155는 ERC20과 ERC721의 하이브리드라고 불린다.
이를 통해 알 수 있듯이 이른바 NFFT는 단순히 영패의 ID와 소지자의 주소를 연결했을 뿐 이상도 이하도 아니다.그렇다면 텔레비전에서 자주 보는 예술 작품은 어디에 있을까
ERC721
ERC1155
서명만 보면 알 수 있습니다. 어쨌든 영패의 ID를 매개 변수로 메타데이터에 대응합니다.json의 URL, 메타데이터를 가져옵니다.그림의 URL 등 json에 들어가는 내용입니다.
예를 들어 OpenSea의 메타데이터.json
https://docs.opensea.io/docs/metadata-standards
이렇게 정해져 있습니다.

ERC 721 및 ERC 1155 NFFT 제작, OpenSea 처리


OpenSea는 NFC의 시장 광장이다.
https://opensea.io/
오픈세아에서는 리키가 테스트망으로 사용할 수 있기 때문에 리키에서 자체 제작한 구성을 디자인해 오픈세아에서 확인한다.

ERC 721 및 ERC 1155 구조기를 작성하여 설계


https://github.com/akihokurino/rust-opensea/blob/master/ethereum/contracts/ERC721.sol
https://github.com/akihokurino/rust-opensea/blob/master/ethereum/contracts/ERC1155.sol
아까도 예시에서 제시한 OpenZeppelin을 사용해 가볍게 설치했다.
요점은 mint의 방법(신규 발행)과 메타데이터다.jsonuri, tokenURI을 되돌려주는 방법.그 외에는 필요 없다.
이전에도 소개했듯이 이번 구조기도 truffle로 제작돼 테스트 상태에서 디자인됐다.각 방법에 관하여 나는 생략할 것이다.
https://trufflesuite.com/
디버깅을 진행하면 디버깅된 구조기의 주소와 당시의 ABI를 얻을 수 있기 때문에 그것을 저장할 것입니다.
ABI는 바이너리에 액세스하기 위한 Application Binary Interface의 약어입니다.

Rust mint으로 설계된 아키텍처 mint


언어는 다 괜찮지만 사용하고 싶어서rust-web3 Rust로 실시합니다.
명령행 도구로 만들어져서 많이 썼는데 요점은
let base_url = env::var("ETHEREUM_URL").expect("ETHEREUM_URL must be set");
let transport = transports::Http::new(&base_url).ok().unwrap();
let cli = Web3::new(transport);
ETHEREUM_URL에서 액세스infra에서 획득한 Rinkey의 URL을 지정합니다.
그걸로 웹 3 설치 만들기
let contract = Contract::from_json(
self.cli.eth(),
   parse_address(self.contract_address.clone()).unwrap(),
   include_bytes!("rust-token721.abi.json"),
)?;
방금 디자인한 구조기 주소와 디버깅할 때의 구조기 ABI를 읽고contract 대상 만들기
let prev_key = SecretKey::from_str(&self.wallet_secret.clone()).unwrap();
let gas_limit: i64 = 5500000;
let gas_price: i64 = 35000000000;

let c = self.contract()?;
let result = c
  .signed_call_with_confirmations(
    "mint",
    (
      parse_address(self.wallet_address.clone()).unwrap(), 
      name
    ),
    Options::with(|opt| {
      opt.gas = Some(U256::from(gas_limit));
      opt.gas_price = Some(U256::from(gas_price));
    }),
    1,
    SecretKeyRef::from(&prev_key),
  )
  .await?;
서명이 필요한 구조기에 대한 접근은 이러한 느낌입니다. 먼저 기밀 키, 이름signed_call_with_confirmations을 얻어서 문자열로 호출할 방법을 지정하면 됩니다.gas_limitgas_price를 잘 설정하세요.
이 코드로 방금 디자인한 구조기의 mint 방법을 호출하면 자신이 만든 구조기 안에서 새로운 NFFT를 발행할 수 있다.
물론 서명은 필요한 방법이기 때문에 이 순간에 자신의 등her를 소모한다.따라서 지정한 비밀 키와 연결된 지갑에 상수 링키가 사용할 수 있는 ether를 넣으십시오.
위 코드는 ERC 721에 대한 mint 코드이며 ERC 1155 구성에도 액세스할 수 있습니다.
ABI는 ERC 1155의 를 읽어야 합니다.
ERC 721과 달리 아까 말씀드렸듯이 mint시에만 amount 부분을 지정합니다.
let prev_key = SecretKey::from_str(&self.wallet_secret.clone()).unwrap();
let gas_limit: i64 = 5500000;
let gas_price: i64 = 35000000000;

let c = self.contract()?;
let result = c
  .signed_call_with_confirmations(
    "mint",
    (
      parse_address(self.wallet_address.clone()).unwrap(),
      name,
      amount,
    ),
    Options::with(|opt| {
      opt.gas = Some(U256::from(gas_limit));
      opt.gas_price = Some(U256::from(gas_price));
    }),
    1,
    SecretKeyRef::from(&prev_key),
  )
  .await?;
서명이 필요 없는 구조기에 접근하는 것이 더욱 간단해진다
let c = self.contract()?;
let result = c.query("name", (), None, Options::default(), None);
let name: String = result.await?;
이렇게 액세스합니다.
가장 중요한 부분만 싣고 설명을 했지만 전체 소스 코드를 통해 마인드를 구조기의 전 단계, 특정 영패와 관련된 메타데이터로 옮겼다.json을 생성하고 업로드하는 처리가 있습니다.
metadata.만약 json이 없다면 mint를 진행하더라도 OpenSea는 이 영패 ID와 관련된 자산을 찾을 수 없습니다.
지금까지는 지정된 기밀 키와 연관된 지갑 계정으로 OpenSea에 로그인해 자신이 만든 NFFT를 확인할 수 있었다.

OpenSea에서 NFFT 거래를 진행하다


OpenSea의 UI에서 정상적으로 매매할 수 있다.
하지만 이번에는 코드에서 그걸 진행할게요.
OpenSea에는 SDK가 있습니다.
https://github.com/ProjectOpenSea/opensea-js
이것을 사용하여 README에 따라 진행하면 끝납니다. 그러나 위에 쓰지 않은 주의사항은 비밀 키를 설정하는 것입니다.
NOTE: Using the sample Infura provider above won't let you authorize transactions, which are needed when approving and trading assets and currency. To make transactions, you need a provider with a private key or mnemonic set.
const provider = new HDWalletProvider("ウォレットの秘密鍵", "イーサリアムネットワークのURL");
const seaport = new OpenSeaPort(provider, {
  networkName: Network.Rinkeby, // イーサリアムネットワークに合わせる
  apiKey: "OpenSeaのAPIキー",
})
테스트망에 연결하려면 API 키가 필요 없고 undefined로 미리 설정해야 합니다.(공백 문자도 사용할 수 없음)HDWalletProvider여기.의 포장에 방금 등장한 truffle 안에 이루어진 것이다.
이걸 쓰면 이번에는 비밀 열쇠를 넣어야 하고, 고조파 초기화도 가능하다는 설명이다.
여기에 도착하면 설명대로 사용할 수밖에 없다.
https://github.com/ProjectOpenSea/opensea-js#fetching-assets
NFC 가져오기 시도
https://github.com/ProjectOpenSea/opensea-js#fetching-orders
판매 주문서 및 구매 주문서 수령 후
https://github.com/ProjectOpenSea/opensea-js#buying-items
NFC 실제 구매
https://github.com/ProjectOpenSea/opensea-js#transferring-items-or-coins-gifting
다른 주소의 NFC를 보냅니다.
SDK는 OpenSea의 UI에서 기본적인 작업을 수행할 수 있습니다.
그나저나 Get 시스템의 간단한 작업은 API를 통해서도 가능합니다.
https://docs.opensea.io/reference/api-overview
여기서 흥미로운 것은 오픈세아가 NFFT 소유권 이전을 어떻게 했는지 부분이다.
의문을 품고 SDK의 내용을 살짝 엿보았는데 그곳wyvern의 구조가 그 안에 존재하는데 그곳을 방문해서 무엇을 진행하는 것 같았다.
https://etherscan.io/address/0x7f268357a8c2552623316e2562d90e642bb538e5 wyvern에 대한 상세한 내용은 다음 기회에 기사를 써 보려고 합니다.

최후


https://gigazine.net/news/20220221-phishing-attack-opensea-254-nft/

좋은 웹페이지 즐겨찾기