Weight.go

package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
)

// Mocked utility functions and structures for demonstration purposes
type SignedTransaction struct {
	Transaction map[string]interface{} `json:"transaction"`
	PublicKey   string                 `json:"public_key"`
	Signature   string                 `json:"signature"`
}

func NewSignedTransaction(item map[string]interface{}) *SignedTransaction {
	return &SignedTransaction{
		Transaction: item["transaction"].(map[string]interface{}),
		PublicKey:   item["public_key"].(string),
		Signature:   item["signature"].(string),
	}
}

type Machine struct{}

func (m *Machine) Instance() *Machine {
	return &Machine{}
}

func (m *Machine) Weight(tx *SignedTransaction, errMsg *string) *string {
	// ์‹ค์ œ weight ๊ณ„์‚ฐ ๋กœ์ง ๊ตฌํ˜„
	weight := "mocked_weight"
	return &weight
}

func MachineInstance() *Machine {
	return &Machine{}
}

// WeightHandler handles the weight calculation.
type WeightHandler struct{}

func (w *WeightHandler) Fail(wr http.ResponseWriter, result, errMsg string) {
	http.Error(wr, fmt.Sprintf("%s: %s", result, errMsg), http.StatusBadRequest)
}

func (w *WeightHandler) Main(wr http.ResponseWriter, req *http.Request) {
	var item map[string]interface{}
	body, err := ioutil.ReadAll(req.Body)
	if err != nil {
		w.Fail(wr, "FAIL", "Failed to read request body")
		return
	}

	if err := json.Unmarshal(body, &item); err != nil {
		w.Fail(wr, "FAIL", "Invalid JSON format")
		return
	}

	tx := NewSignedTransaction(item)
	var errMsg string
	weight := MachineInstance().Weight(tx, &errMsg)

	if weight == nil {
		w.Fail(wr, "FAIL", errMsg)
		return
	}

	fmt.Fprintf(wr, *weight)
}

func main() {
	http.HandleFunc("/weight", func(w http.ResponseWriter, req *http.Request) {
		handler := &WeightHandler{}
		handler.Main(w, req)
	})

	http.ListenAndServe(":8080", nil)
}

์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ์™€ ํ•จ์ˆ˜

ํ•„์š”ํ•œ ํŒจํ‚ค์ง€ ๋ฐ ๊ตฌ์กฐ์ฒด ์ •์˜

  1. ํŒจํ‚ค์ง€ ์ž„ํฌํŠธ:

    • encoding/json: JSON ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

    • fmt: ํฌ๋งท๋œ ๋ฌธ์ž์—ด์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

    • io/ioutil: ์ž…์ถœ๋ ฅ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    • net/http: HTTP ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  2. ๊ตฌ์กฐ์ฒด ์ •์˜:

    • SignedTransaction: ์„œ๋ช…๋œ ํŠธ๋žœ์žญ์…˜์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ตฌ์กฐ์ฒด์ž…๋‹ˆ๋‹ค. Transaction, PublicKey, Signature ํ•„๋“œ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

    • WeightHandler: ํŠธ๋žœ์žญ์…˜์˜ ๋ฌด๊ฒŒ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ์ฒด์ž…๋‹ˆ๋‹ค.

๋ชจ์˜ ํ•จ์ˆ˜์™€ ๊ตฌ์กฐ์ฒด ์ •์˜

์ด ์˜ˆ์ œ์—์„œ๋Š” ์‹ค์ œ ๊ตฌํ˜„ ๋Œ€์‹  ๋ชจ์˜(mocked) ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ชจ์˜ ํ•จ์ˆ˜๋Š” ์‹ค์ œ ์‹œ์Šคํ…œ์—์„œ ๊ตฌํ˜„๋  ํ•จ์ˆ˜์™€ ์œ ์‚ฌํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

  • SignedTransaction: ํŠธ๋žœ์žญ์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ตฌ์กฐ์ฒด์ž…๋‹ˆ๋‹ค.

    • NewSignedTransaction: ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด SignedTransaction ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

  • Machine: ํŠธ๋žœ์žญ์…˜์˜ ๋ฌด๊ฒŒ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋กœ์ง์„ ํฌํ•จํ•˜๋Š” ๊ตฌ์กฐ์ฒด์ž…๋‹ˆ๋‹ค.

    • Weight: ํŠธ๋žœ์žญ์…˜์˜ ๋ฌด๊ฒŒ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ๋กœ์ง์€ ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ, "mocked_weight"๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    • Instance: Machine์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

WeightHandler ๊ตฌ์กฐ์ฒด์™€ ๊ด€๋ จ ํ•จ์ˆ˜

์ด ๋ถ€๋ถ„์€ HTTP ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•ต์‹ฌ ๋กœ์ง์ž…๋‹ˆ๋‹ค.

  • WeightHandler: ํŠธ๋žœ์žญ์…˜ ๋ฌด๊ฒŒ ๊ณ„์‚ฐ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ์ฒด์ž…๋‹ˆ๋‹ค.

  • Fail: ์š”์ฒญ์ด ์‹คํŒจํ–ˆ์„ ๋•Œ ํด๋ผ์ด์–ธํŠธ์— ์‹คํŒจ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

    • wr: ์‘๋‹ต์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” http.ResponseWriter ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

    • result: ๊ฒฐ๊ณผ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.

    • errMsg: ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์ž…๋‹ˆ๋‹ค.

  • Main: /weight ๊ฒฝ๋กœ๋กœ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

    • ์š”์ฒญ ๋ณธ๋ฌธ์„ ์ฝ์–ด body์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

    • ๋ณธ๋ฌธ์„ JSON์œผ๋กœ ํŒŒ์‹ฑํ•˜์—ฌ item์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

    • item ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SignedTransaction ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    • MachineInstance๋ฅผ ํ†ตํ•ด ํŠธ๋žœ์žญ์…˜์˜ ๋ฌด๊ฒŒ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

    • ๊ณ„์‚ฐ๋œ ๋ฌด๊ฒŒ๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ์‘๋‹ต์œผ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

main ํ•จ์ˆ˜

์ด ํ•จ์ˆ˜๋Š” HTTP ์„œ๋ฒ„๋ฅผ ์„ค์ •ํ•˜๊ณ  ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

  • main ํ•จ์ˆ˜: HTTP ์„œ๋ฒ„๋ฅผ ์„ค์ •ํ•˜๊ณ  ์‹œ์ž‘ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

    • /weight ๊ฒฝ๋กœ๋กœ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ WeightHandler ๊ตฌ์กฐ์ฒด์˜ Main ๋ฉ”์„œ๋“œ๋กœ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    • ํฌํŠธ 8080์—์„œ HTTP ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์š”์•ฝ

์ด ์ฝ”๋“œ๋Š” HTTP ์„œ๋ฒ„๋ฅผ ์„ค์ •ํ•˜์—ฌ /weight ๊ฒฝ๋กœ์—์„œ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ ๋ณธ๋ฌธ์—์„œ ์„œ๋ช…๋œ ํŠธ๋žœ์žญ์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ , ํŠธ๋žœ์žญ์…˜์˜ ๋ฌด๊ฒŒ๋ฅผ ๊ณ„์‚ฐํ•œ ํ›„, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ํ•จ์ˆ˜์™€ ๋ฉ”์„œ๋“œ๋Š” ํŠน์ • ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ์ „์ฒด์ ์œผ๋กœ ํ˜‘๋ ฅํ•˜์—ฌ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  1. Fail: ์‹คํŒจ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. Main: ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ์„œ๋ช…๋œ ํŠธ๋žœ์žญ์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ , ํŠธ๋žœ์žญ์…˜์˜ ๋ฌด๊ฒŒ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

  3. NewSignedTransaction: ์„œ๋ช…๋œ ํŠธ๋žœ์žญ์…˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  4. Weight: ํŠธ๋žœ์žญ์…˜์˜ ๋ฌด๊ฒŒ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

  5. main: HTTP ์„œ๋ฒ„๋ฅผ ์„ค์ •ํ•˜๊ณ , /weight ๊ฒฝ๋กœ๋กœ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

Last updated