Web3

스마트 컨트랙트 구현 이미지

! [[ Pasted image 20231119130051.png ]]

  1. 생성자의 매개변수로 소유자의 propert를 입력받아 판매자의 지갑 주소를 초기화해준다.

! [[ Pasted image 20231119130457.png ]]

  1. external : 컨트랙트의 외부에서만 호출할 수 있는 메서드

! [[ Pasted image 20231119130609.png ]]

  1. payable : 이 함수가 돈을 받을 수 있다.

위 처럼 작성하면 누군가가 돈을 보냈을 때 receive 함수가 실행된다.

! [[ Pasted image 20231119130954.png ]]

  1. msg.sender : 돈을 보낸 사람의 주
  2. msg.value : 보낸 금액

현재 해결해야 될 문제점 : 기본적으로 컨트랙을 배포할 때 입금 받을 지갑의 주소를 연동하여 배포하고 배포된 컨트랙 주소에 입금을 하는 방식인데, 쇼핑몰은 판매자 === 관리자가 아님으로 판매자, 판매자의 지갑 주소가 동적으로 변경이 될 수 있는 구조여야 함. 즉 판매자가 상품을 등록하거나, 판매자가 본인의 지갑을 등록할 때 컨트랙을 배포하는 과정을 자동화할 수 있어야함.

첫번째 방안 : 판매자 권한을 얻은 계정은 본인이 물건을 판매했을 때 돈을 받을 지갑을 등록할 수 있는 서비스가 있어야 함. 그리고 지갑을 등록하면 서비스에서 컨트랙트를 생성하고 배포하는 것까지 자동화해야 함.

그런 뒤 판매자가 상품을 등록하면 상품 정보에 판매자의 지갑 주소 대신 컨트랙트의 주소가 등록되고, 구매자에게 송금해야 될 주소 역시 판매자의 지갑 주소가 아닌 컨트랙트의 주소를 보여준다.

두번째 방안 :

  1. 여러 판매자와 지갑 주소들을 맵핑하여 한번에 관리하는 컨트랙트를 작성한다.
  2. 이 컨트랙에는 판매자가 상품을 등록할 때 자신의 지갑 주소와 상품의 가격을 등록할 수 있는 메서드가 작성되어 있어야 한다.
  3. 또한 이 컨트랙에는 구매자가 구매할때 금액을 송금할 수 있는 그리고 매개변수로 판매자의 지갑 주소를 입력 받는 메서드가 있어야 한다.
  4. 새로운 판매자가 등록될 때마다 컨트랙을 재배포할 필요가 없어진다.

현재 위 스마트 컨트랙트에 대한 이해 1. 여러 판매자와 지갑 주소들을 맵핑하여 한번에 관리하는 컨트랙을 작성한다. 2. 이 컨트랙에는 판매자가 상품을 등록할 때 자신의 지갑 주소와 상품의 가격을 등록할 수 있는 메서드가 작성되어 있어야 한다. 3. 또한 이 컨트랙에는 구매자가 구매할때 금액을 송금할 수 있는 그리고 매개변수로 판매자의 지갑 주소를 입력 받는 메서드가 있어야 한다. 4. 새로운 판매자가 등록될 때마다 컨트랙을 재배포할 필요가 없어진다. 위 과정으로 스마트 컨트랙을 작성하고 배포 한 뒤 어플리케이션에서 판매자가 상품을 등록할 때 자신의 지갑 주소와 상품 가격을 입력하면, 스마트 컨트랙의 판매자 맵에 추가 되고, 이후에 구매자가 상품을 구매하려 할 때 스마트 컨트랙의 구매 메서드를 호출하고 매개변수로 판매자의 지갑주소와 구입 가격을 입력해주도록 구현하면 되는거지?

pragma solidity ^0.8.0;

contract ShoppingMall { // 판매자의 주소와 가격을 매핑 mapping(address => uint) public prices;

// 이벤트 선언
event Purchase(address indexed buyer, address indexed seller, uint amount);
event SellerRegistered(address indexed seller, uint price);

// 판매자 주소와 가격을 설정하는 함수
function registerSeller(address seller, uint price) public {
    prices[seller] = price;
    emit SellerRegistered(seller, price);
}

// 구매 함수
function purchase(address seller) public payable {
    require(msg.value == prices[seller], "Incorrect amount");
    payable(seller).transfer(msg.value);
    emit Purchase(msg.sender, seller, msg.value);
} }

This line appears after every note.

Notes mentioning this note


Here are all the notes in this garden, along with their links, visualized as a graph.

ReadmeTips설명자료 모음나의 유의 사항과 고치고자 했던점Throw error기능 목록제출용 소감문회고록1주차 피드백BoardStyle guide checklist기능 요구 사항 숫자 야구입출력 요구 사항제출용 소감문 숫자 야구 게임프로그래밍 요구 사항회고록기능 목록요구 사항제출용 소감문 자동차 경주 게임회고록Todo'기능 목록제출용 소감문 크리스마스 프로모션회고록Scpc몰입해본 경험성공한 프로젝트들1. 효과적인 학습 방식과 경험2. 성장 중 겪은 실패와 극복3. 오랜 시간 몰입했던 경험 그리고 도전4. 원하는 프로그래머 모습우테코 증빙자료효과적인 학습 방법과 결과프론트엔드 기말과제 리팩토링CssDiv에 그림자 효과 넣기FlexBabelBigintBooleanClassIife(즉시 실행 함수 표현식)Javascript style guideJavascript typesJavascriptLinked list(연결 리스트)MapMark and sweepNull typeNumberObject ForeachObject.defineproperty()ObjectPromiseReference countingSetShift 연산String.indexof(), string.includes()StringSymbolUndefined typeV8 가비지 컬렉션Async 와 awaitCall 과 apply 메서드Callback 함수Private 프로퍼티SomeThrowWrapper object가비지 컬렉션객체의 attribute기본 매개변수 문법데이터 속성메모리 관리메모리 생명 주기배열생성자(constructor)원시값접근자 속성함수 호이스팅(hoisting)함수(function)함수를 정의하는 법함수와 메소드의 차이힙과 스택Class component(클래스형 컴포넌트)DomFunction component(함수형 컴포넌트)JsxReact domReact elementReact hooksReact 생명주기ReactSpaVirtual domPropsUseeffect렌더링리렌더링마운트함수형 컴포넌트와 클래스형 컴포넌트의 차이점Github page로 배포GithubReadme 파일 작성CloneFork커밋 메시지 작성 규칙Brain stormingWeb3마이너스마트 컨트랙트페이로드(payload)Markdown(md)MermaidMvc 패턴도메인 로직비즈니스 로직Jest란Tdd(테스트 주도 개발)모킹(mocking)이란스파이(spying)이란AbiDtdNode jsReadmeThreadXml런타임 환경스키마유클리드 호제법최대공배수 알고리즘Todo list옵시디언 웹 주소