
- TOP
- ã¿ã°äžèЧ
- web3
web3
ã€ãã³ã
該åœããã³ã³ãã³ããèŠã€ãããŸããã§ãã
ãã¬ãžã³

æè¡ããã°
æ¬èšäºã¯ã2025 幎 9 æ 25 æ¥ã«å
¬éããã Improve Solana node performance and reduce costs on AWS ã翻蚳ãããã®ã§ãã翻蚳㯠Blockchain Prototyping Engineer ã® æ·±æŽ¥é¢¯éš ãæ
åœããŸããã Solana Agave v2.0.14 㯠2024 幎 10 æ 18 æ¥ã«ãªãªãŒã¹ãããŸããã ãã以éãSolana ããŒãã®ãªãã¬ãŒã¿ãŒãããmainnet-beta ã®ææ°ã¹ããããšã®åæãç¶æããã®ã«èŠåŽããããšããããšããå ±åããããŸããã Solana ã® StackExchange ã§ãcatch upããæ€çŽ¢ãããšããã®èª²é¡ã«é¢ãã倿°ã®æçš¿ãèŠã€ãããŸãã 以åã®æçš¿ ã§ã¯ãAWS ã§ Solana ããŒããå®è¡ããæ¹æ³ã説æããŸããã ãã®æçš¿ã§ã¯ãããé«éãªéçšãšåæåæã®ããã«ããŒããèšå®ããæ¹æ³ã解説ããŸãã ããã«ã Amazon Elastic Compute Cloud (Amazon EC2) ã§ Solana ããŒãã®ããŒã¿è»¢éã®ã³ã¹ãå¹çãé«ããããã®å®éšçãªãã©ãã£ãã¯æé©åææ³ãå
±æããŸãã Solana Agave v2.x ã«ããã倿Žç¹ Solana Agave v2.x ã«ãããæãéèŠãªå€æŽã® 1 ã€ã¯ãæ°ããäžå€®ã¹ã±ãžã¥ãŒã©ã§ãã ãã㯠v1.18.x ã«ãååšããŠããŸããããããã©ã«ãã§ã¯ç¡å¹ã«ãªã£ãŠããŸããã v2.x ã®ã¢ããããŒãã«ãããäžå€®ã¹ã±ãžã¥ãŒã©ãããã©ã«ãã§æå¹ã«ãªããŸããã Solana Agave ã¯ã©ã€ã¢ã³ãã®ã³ã¢ã³ã³ããŒãã³ããšããŠãäžå€®ã¹ã±ãžã¥ãŒã©ã¯ãã©ã³ã¶ã¯ã·ã§ã³åŠçã¢ãŒããã¯ãã£ã倧å¹
ã«å€æŽããŸãã ããã¯ã以åã® 4 ã¹ã¬ããã«ããåŠçã¢ãã«ã«ä»£ããã·ã³ã°ã«ã¹ã¬ããã«ãã調æŽã¡ã«ããºã ã§ãã Scheduling Thread ãå°å
¥ããŸãã ãã®å€æŽã«ã€ããŠè©³ããã¯ã Introducing the Central Scheduler: An Optional Feature of Agave v1.18 ãåç
§ããŠãã ããã ãã®å€æŽã¯ãæšå¥šãããæå° CPU ã¯ããã¯é床ã«å€§ããªåœ±é¿ãäžãããã©ã³ã¶ã¯ã·ã§ã³åŠçã®æé©ãªããã©ãŒãã³ã¹ã®ããã«ãèŠä»¶ã 2.8 GHz ãã 3.2 GHz ã«å¢å ããŸããã ããã«åºã¥ãã 以åã®ããã°èšäº ã§ Solana ããŒããå®è¡ããããã®æšå¥š AWS ã€ã³ã¹ã¿ã³ã¹ã¿ã€ããæŽæ°ãã R7a ããã³ I7ie EC2 ã€ã³ã¹ã¿ã³ã¹ãã¡ããªãŒã«åãæ¿ããŸããã ãããã®ã€ã³ã¹ã¿ã³ã¹ãã¡ããªãŒã¯ãããŸããŸãªæ§æã§ Solana ããŒããå®è¡ããããã«å¿
èŠãª 384 GiB ãã 1.5 TiB è¶
ã® RAM ãæäŸããŸãã Agave v2.2.15 ã§ã¯ãåŠçããžãã¯ã®ãããããã¹ïŒé »ç¹ã«å®è¡ãããåŠççµè·¯ïŒããããããã¯ã¹ãã¬ãŒãžæäœãåé€ããããšã«çŠç¹ãåœãŠãããã®ä»ã®éèŠãªããã©ãŒãã³ã¹æé©åãå°å
¥ãããŸããã ããã«ããããããã¯ã¹ãã¬ãŒãžããã€ã¹ã«å¿
èŠãª 1 ç§ãããã®å
¥åºåæäœæ° (IOPS) ãšã¬ã€ãã³ã·ãŒãåæžãããã¯ã©ãŠãäžã§ Agave ã¯ã©ã€ã¢ã³ããå®è¡ããã³ã¹ããããã«åæžãããŸããã ã¢ãžã¢å€ªå¹³æŽ AWS ãªãŒãžã§ã³ã«ããã Solana ã®åæã«ããã課é¡ã®å
æ Solana Agave ããŒããèµ·åæã«äºåããŠã³ããŒããããã¹ãããã·ã§ãããæã£ãŠããªãå Žåãã¯ã©ã€ã¢ã³ãã¯ä¿¡é Œã§ããããªããŒã¿ãŒããŒããããã®ã¹ãããã·ã§ãããããŠã³ããŒãããŸãã ãããã®ããŒã㯠--known-validator ãã©ã°ã§èšå®ããã Anza RPC ããŒãèµ·åã³ãã³ãã®äŸ ã«ç€ºãããŠããŸãã ãããããããã®ä¿¡é Œã§ããããªããŒã¿ãŒã¯ãåç±³ãŸãã¯ãšãŒãããã® AWS ãªãŒãžã§ã³ã«é
眮ãããŠããããšãå€ããæ±äº¬ãéŠæž¯ããœãŠã«ãã·ã³ã¬ããŒã«ãªã©ã®ã¢ãžã¢å€ªå¹³æŽãªãŒãžã§ã³ã§å®è¡ãããŠããã¯ã©ã€ã¢ã³ãã«ãšã£ãŠåé¡ãšãªããŸãã ãããã®å Žæã§ã®ã¹ãããã·ã§ããã®ããŠã³ããŒãé床ã¯ãéåžžãåç±³ãŸãã¯ãšãŒããããªãŒãžã§ã³ã®ã¯ã©ã€ã¢ã³ããšæ¯èŒããŠé
ããªããŸãã ã¹ãããã·ã§ãããããŠã³ããŒãããåŸãAgave ã¯ã¹ãããã·ã§ããã®ã¹ããããææ°ãã 2,500 ã¹ããã以äžé
ããŠãããã©ããããã§ãã¯ããŸãã ãã®å·®ã 2,500 ãã倧ããå Žåãã¯ã©ã€ã¢ã³ãã¯ã¹ãããã·ã§ãããåããŠã³ããŒãããåæããã»ã¹ãããã«é
å»¶ããŸãã ãã®åé¡ã¯ GitHub issue #24486 ã«èšé²ãããŠããŸãã ããã©ã«ãã§ã¯ã maximum_local_snapshot_age ãã©ã¡ãŒã¿ã¯ 2,500 ã«èšå®ãããŠããŸã ã ã¹ãããã·ã§ããã®åããŠã³ããŒããé¿ããããã«ãã®å€ãå¢ããããšã¯ã§ããŸããããã®æ¹æ³ã¯æšå¥šããŸããã Solana 㯠400 ããªç§ããšã«æ°ããã¹ããããçæãã (1 åãããçŽ 150 ã¹ããã) ããããã®å€ãé«ãèšå®ãããããšãããŒããææ°ã®ã¹ãããã«è¿œãã€ããªããªãå¯èœæ§ããããŸãã ã¢ãžã¢ãã·ãã£ãã¯ãªãŒãžã§ã³ã§ Solana ããŒããå®è¡ããéã®ã¹ãããã·ã§ããããŠã³ããŒãããã©ãŒãã³ã¹ãåäžãããã«ã¯ã以äžãæšå¥šããŸãã ä¿¡é Œã§ããããŒããç¹å®ãã: validator.app ã䜿çšããŠãã¢ãžã¢å€ªå¹³æŽå°åã®ããªãã®å Žæã«è¿ã ä¿¡é Œã§ããããŒãã®èå¥å ãèŠã€ããŸãã ãããã®èå¥åã agave-validator èµ·åã³ãã³ãã® --known-validator ãã©ã°ã®ãã©ã¡ãŒã¿ãšããŠèšå®ããŸãã èŠå ããŒã¯ãä»ããŠããããªããŒã¿ãŒããŒãã®äœ¿çšã¯é¿ããŠãã ããã ã¹ãããã·ã§ãããœãŒã¹ãå¶éãã: --only-known-rpc ãã©ã°ã䜿çšããŠãä¿¡é Œã§ããããŒãããã®ã¿ã¹ãããã·ã§ãããããŠã³ããŒãããããã«ã¯ã©ã€ã¢ã³ããèšå®ããŸãã æå°ããŠã³ããŒãé床ãèšå®ãã: --minimal-snapshot-download-speed ãã©ã°ã䜿çšããŠãå¿
èŠãªæå°ã¹ãããã·ã§ããããŠã³ããŒãé床ãå®çŸ©ããäœéãªãœãŒã¹ããã®ããŠã³ããŒããé²ããŸãããã¹ãã§ã¯ã104,857,600 (100 MiBps) ã䜿çšããŸããã ãããã®æé©åãå®è£
ããããšã§ãåæåæãé«éåããã¢ãžã¢å€ªå¹³æŽãªãŒãžã§ã³ã«ããã Solana ããŒãã®ãããã€ãããé«éã§ä¿¡é Œæ§ã®é«ããã®ã«ããããšãã§ããŸãã Agave RPC ããŒãã®ããŒã¿è»¢éã³ã¹ãã®æé©å Solana Agave ã¯ã©ã€ã¢ã³ãã¯ã Turbine ãšåŒã°ããããŒã¿äŒæãããã³ã« ã«ããã倧éã®ã¢ãŠãããŠã³ãããŒã¿ãã©ãã£ãã¯ãçæããŸãã è¿å¹Žãæéãã©ãã£ãã¯éã¯å¢å ããŠããã RPC ã®ã¿ãšããŠæ§æãããããŒã ã§ãã£ãŠããçŸåšã¯ 100 TiB ãã 200 TiB 以äžã®ç¯å²ã«ãªã£ãŠããŸãã ãããã®ã³ã¹ãããã广çã«ç®¡çããããã«ãSolana ããŒãã®åæãç¶æããããã«æå°éå¿
èŠãªã¢ãŠãããŠã³ãããŒã¿ã¹ã«ãŒããããæ±ºå®ããããã®äžé£ã®å®éšã宿œããŸããã ãŸããããŒãã®ãSlots Behindãã¡ããªã¯ã¹ã 1 åããšã«ãã§ãã¯ããåæåæãå®äºããåŸã«å®è¡ããã¹ã¯ãªãããäœæããŸããã 1 åééã¯ãSolana ããŒããæ£åžžã«åæããŠããããé
ãå§ããŠãããã確å®ã«æ€åºã§ããã®ã«éåžžååã§ãã ãSlots Behindãã¡ããªã¯ã¹ããŒãã«éããããŒããå®å
šã«åæãããããšã瀺ããšãå¥ã®ã¹ã¯ãªããããŠãŒã¶ãŒå®çŸ©ã®åž¯åå¹
å¶éã MiBps åäœã§é©çšããŸãã ãSlots Behindãã¡ããªã¯ã¹ã 10 ãè¶
ãããšãããŒãã远ãã€ããŸã§å¶éãäžæçã«è§£é€ãããŸãã éçšå¹çãç¶æããããã«ãã·ã¹ãã ã¯ãããã®å¶éããå
éšãããã¯ãŒã¯ãã©ãã£ãã¯ãé€å€ããŸãã æšæºçãªå
éš IP ç¯å² (10.0.0.0/8ã172.16.0.0/12ã192.168.0.0/16ã169.254.0.0/16) å
ã®ãã©ãã£ãã¯ã¯å¶éã®å¯Ÿè±¡å€ãšããå
éš IP ã䜿çšãã AWS ã¢ããªã±ãŒã·ã§ã³ãæ£åžžã«æ©èœããããšã確ä¿ããŸãã ãã®æ©èœã¯ RPC ããŒãã«å¯ŸããŠéåžžã«å¹æçã§ãããã³ã³ã»ã³ãµã¹ããŒãã«ã¯å®è£
ãã¹ãã§ã¯ãããŸããã ã³ã³ã»ã³ãµã¹ããŒãã§ã¢ãŠãããŠã³ããã©ãã£ãã¯ãå¶éãããšãããã©ãŒãã³ã¹ãäœäžãããããæé©ãªãããã¯ãŒã¯åå ã®ããã«ã¯æšå¥šãããŸããã ãã®ãã©ãã£ãã¯æé©åææ³ããã¹ãããããã«ã eu-central-1 ãªãŒãžã§ã³ã§ 5 å°ã® i7ie.12xlarge EC2 ã€ã³ã¹ã¿ã³ã¹ã䜿çšã㊠5 æ¥éã®æ¯èŒãã¹ãã宿œããŸããã 4 ã€ã®ããŒãã«ãã©ãã£ãã¯ã·ã§ãŒãã³ã°ã¹ã¯ãªãããèšå®ãã1 ã€ã®ã³ã³ãããŒã«ããŒãã«ã¯å¶éãèšããããCurrent SlotsããšãSlots Behindãã®ã¡ããªã¯ã¹ãåéããŠãããŒãã®åæé床ãšå®å®æ§ãæ¯èŒããŸããã ãã¹ãã®çµæãããŒã㯠20 MiBps ãšããäœãã¢ãŠãããŠã³ããã©ãã£ãã¯åž¯åå¹
(æéçŽ 6.5 TiB) ã§åæãç¶æã§ããæé©ãªäŸ¡æ Œå¯Ÿããã©ãŒãã³ã¹æ¯ã¯ 40-50 MiBps ã§éæãããæšå®ããŒã¿è»¢éã³ã¹ãã 85% 以äžåæžã§ããããšã瀺ãããŸããã ãã¹ãæéå
šäœãéããŠã5 ã€ã®ããŒããã¹ãŠãåæãç¶æããã¢ãŠãããŠã³ã垯åå¹
ãåæžããŠãããŒãã®åæç¶æ
ã«åœ±é¿ããªãããšã確èªãããŸããã é©ãã¹ãããšã«ãAgave v2.2.16 ã§ã¢ãŠãããŠã³ããã©ãã£ãã¯åž¯åå¹
ã 20-50 MiBps ã«å¶éããããŒãã¯ãå¶éã®ãªãã³ã³ãããŒã«ããŒããšæ¯èŒããŠæå€§ 5%ããäžè²«ããŠåæãç¶æããŸããã Agave RPC ããŒãã®ãã©ãã£ãã¯ã·ã§ãŒãã³ã°ã®èšå® ãããã®çµæã«åºã¥ããAWS Blockchain Node Runners ã® Solana ãã«ãŒããªã³ãã«åçãã©ãã£ãã¯ã·ã§ãŒãã³ã°ãå°å
¥ããŸãã ( Optimizing Data Transfer Costs ãåç
§)ã ãã®å®è£
ã®äž»èŠãªéšåã¯ä»¥äžã®ãšããã§ãã net-rules-start.sh ã¯ãã©ãã£ãã¯ã·ã§ãŒãã³ã°ãæå¹ã«ããŸãã #!/bin/bash # Specify max value for outbound data traffic in Mbps. LIMIT_OUT_TRAFFIC_MBPS=20 # Step 1: Create nftables rules to mark packets going to public IPs # Create table if it doesn't exist if ! nft list table inet mangle >/dev/null 2>&1 ; then nft add table inet mangle fi # Create chain if it doesn't exist if ! nft list chain inet mangle output >/dev/null 2>&1 ; then nft add chain inet mangle output { type route hook output priority mangle\ ; } fi # Check if specific private IP return rule exists if ! nft list chain inet mangle output | grep -q "10\.0\.0\.0/8.*172\.16\.0\.0/12.*192\.168\.0\.0/16.*169\.254\.0\.0/16.*return"; then nft add rule inet mangle output ip daddr { 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 169.254.0.0/16 } return fi # Check if mark rule with value 1 exists if ! nft list chain inet mangle output | grep -q "meta mark set 0x00000001"; then nft add rule inet mangle output meta mark set 1 fi # Step 2: Set up tc with filter for marked packets INTERFACE=$(ip -br addr show | grep -v '^lo' | awk '{print $1}' | head -n1) # Check if root qdisc already exists if ! tc qdisc show dev $INTERFACE | grep -q "qdisc prio 1:"; then tc qdisc add dev $INTERFACE root handle 1: prio fi # Step 3: Add the tbf filter for marked packets # Check if filter already exists if ! tc filter show dev $INTERFACE | grep -q "handle 0x1 fw"; then tc filter add dev $INTERFACE parent 1: protocol ip handle 1 fw flowid 1:1 fi # Check if tbf qdisc already exists on class 1:1 if ! tc qdisc show dev $INTERFACE | grep -q "parent 1:1"; then tc qdisc add dev $INTERFACE parent 1:1 tbf rate "${LIMIT_OUT_TRAFFIC_MBPS}mbit" burst 20kb latency 50ms fi net-rules-stop.sh ã¯ãã¹ãŠã®ãã©ãã£ãã¯ã·ã§ãŒãã³ã°ãåé€ããŸã: #!/bin/bashINTERFACE=$(ip -br addr show | grep -v '^lo' | awk '{print $1}' | head -n1)# Remove tc rulestc qdisc del dev $INTERFACE root 2>/dev/null# Remove nftables rules# Delete the entire mangle table (removes all chains and rules)nft delete table inet mangle 2>/dev/nullexit 0 ; ç°¡åã«ããããã«ãèªååã¹ã¯ãªãã net-rules-start.sh ãš net-rules-stop.sh 㯠systemd ãµãŒãã¹ net-rules.service ãéããŠå¶åŸ¡ãããŸãã [Unit] Description="ipables and Traffic Control Rules" After=network.target [Service] Type=oneshot RemainAfterExit=yes ExecStart=/opt/instance/network/net-rules-start.sh ExecStop=/opt/instance/network/net-rules-stop.sh [Install] WantedBy=multi-user.target net-syncchecker.sh ã¯ãå
éšããã¢ã¯ã»ã¹ãã API ã䜿çšããŠããŒãã®åæã¹ããŒã¿ã¹ããã§ãã¯ããnet-rules ãµãŒãã¹ã§ãã©ãã£ãã¯ã·ã§ãŒãã³ã°ã®ãªã³ãšãªããåãæ¿ããŸãããã㯠1 åããšã«åŒã³åºãå¿
èŠãããããã systemd timer ã cron ã®ãããªä»ã®ãµãŒãã¹ ã䜿çšããŠã¹ã±ãžã¥ãŒã«ã§ããŸãã #!/bin/bash INIT_COMPLETED_FILE=/data/data/init-completed MAX_SOLANA_SLOTS_BEHIND=10 # Check if jq is available if ! command -v jq &> /dev/null ; then echo "Error: jq is required but not installed" exit 1 fi TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600") if [ -z "$TOKEN" ] ; then echo "Error: Failed to get EC2 metadata token" exit 1 fi EC2_INTERNAL_IP=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/meta-data/local-ipv4) # Start checking the sync node status only after the node has finished the initial sync if [ -f "$INIT_COMPLETED_FILE" ] ; then SOLANA_SLOTS_BEHIND_DATA=$(curl -s -X POST -H "Content-Type: application/json" -d ' {"jsonrpc":"2.0","id":1, "method":"getHealth"}' http://$EC2_INTERNAL_IP:8899 | jq .error.data) SOLANA_SLOTS_BEHIND=$(echo $SOLANA_SLOTS_BEHIND_DATA | jq .numSlotsBehind -r) if [ "$SOLANA_SLOTS_BEHIND" == "null" ] || [ -z "$SOLANA_SLOTS_BEHIND" ] then SOLANA_SLOTS_BEHIND=0 fi if [ $SOLANA_SLOTS_BEHIND -gt $MAX_SOLANA_SLOTS_BEHIND ] then if systemctl is-active --quiet net-rules ; then systemctl stop net-rules fi fi if [ $SOLANA_SLOTS_BEHIND -eq 0 ] then if ! systemctl is-active --quiet net-rules ; then systemctl start net-rules fi fi fi æ¬çªç°å¢ã§äœ¿çšããåã«ããã®æçš¿ã®ã³ãŒããŸã㯠AWS Blockchain Node Runners ã«ã€ããŠ: ãããã®ã¹ã¯ãªãããå®å
šãªç°å¢ã§ã¬ãã¥ãŒããã³ãã¹ãããŠãã ãã å¿
èŠã«å¿ããŠå
¥åæ€èšŒã远å ããŠãã ãã é©åãªãšã©ãŒåŠçãšãã°èšé²ãå®è£
ããŠãã ãã å¿
èŠæå°éã®æš©éã§ã¹ã¯ãªãããå®è¡ããŠãã ãã ãŸãšã ãã®èšäºã§ã¯ãSolana Agave v2.x ã§å°å
¥ããã倿Žã«ããå¿
èŠãª CPU ã¯ããã¯é床ãå¢å ããããšã確èªããã¢ãžã¢å€ªå¹³æŽå°åã«ããã Solana Agave ã¯ã©ã€ã¢ã³ãã®åææéãæ¹åããæ¹æ³ãæ€èšããSolana RPC ããŒãã®ããŒã¿è»¢éã³ã¹ããæé©åããæ¹æ³ã玹ä»ããŸããã ãããã®æé©åããèªèº«ã®ããŒãã§ãã¹ããããã AWS Blockchain Node Runners ã€ãã·ã¢ããã® Solana ãã«ãŒããªã³ã ã䜿çšããŠãã ããã ããã«è³ªåãããå Žåã¯ã AWS re:Post ã§ãblockchainãã¿ã°ãä»ããŠè³ªåãããã Solana StackExchange ã§ãã£ã¹ã«ãã·ã§ã³ã«åå ãããã Solana ã³ãã¥ãã㣠ã«ãåãåãããã ããã èè
ã«ã€ã㊠Tao Gong Tao ã¯ãããã¯ãã§ãŒã³æè¡ã®æå¥œå®¶ã§ããAWS äžã§é©æ°çãªãœãªã¥ãŒã·ã§ã³ãæ§ç¯ããããã«é¡§å®¢ãšååããããžãã¹äžã®èª²é¡ãå
æããAWS ãµãŒãã¹ãå¹ççã«æ¡çšã§ããããæ¯æŽããŠããŸãã Jinsong Zhu Jinsong 㯠AWS ã®ã·ãã¢ãœãªã¥ãŒã·ã§ã³ã¢ãŒããã¯ãã§ã倧æ Web3 ããã³æå·è³ç£äŒæ¥åãã«é«æ§èœãäœã¬ã€ãã³ã·ãŒãã³ã¹ãæé©åãããã¯ã©ãŠããœãªã¥ãŒã·ã§ã³ã®èšèšãå°éãšããŠããŸãã Nikolay Vlasov Nikolay ã¯ãAWS Worldwide Specialist Solutions Architect çµç¹ã«ããã忣åå°åž³æè¡ã€ã³ãã©ã¹ãã©ã¯ãã£ã®ã°ããŒãã«ãªãŒãã§ãã顧客ã AWS äžã§åæ£åãŠã§ãããã³å°åž³æè¡ã®ã¯ãŒã¯ããŒããå®è¡ã§ããããæ¯æŽããŠããŸãã
ã¯ããã« ããã«ã¡ã¯ã @Sakamoto ã§ãã ãã®èšäºã¯ã Merpay & Mercoin Advent Calendar 2025 ã®4æ¥ç®ã®èšäºã§ãã 2025幎9æããã¡ã«ã³ã€ã³ã§ããã³ããšã³ãã®ã€ã³ã¿ãŒã³ãå§ãã12æåãã§ã¡ããã©3ãæã«ãªããŸãããæéäžã¯ã¡ã«ã³ã€ã³ã«å ããã¡ã«ã«ãªNFTã®éçºã«ãåå ããŸããã æ¬èšäºã§ã¯ãã€ã³ã¿ãŒã³æéäžã«åãçµãã ã¿ã¹ã¯ãæ¯ãè¿ããããã§åŸãåŠã³ãæ°ã¥ãããŸãšããŸãã ããŒã ã«ã€ã㊠ä»åã®ã€ã³ã¿ãŒã³ã§ã¯ã¡ã«ã³ã€ã³ãšã¡ã«ã«ãªNFTã§ããã³ããšã³ããšã³ãžãã¢ãšããŠåå ããŸãããããããæ±ããããã¯ãã®ç¹æ§ã倧ããç°ãªããããæ±ããããèŠç¹ãé²ãæ¹ã«ãéãããããŸããã ã¡ã«ã³ã€ã³ æå·è³ç£äº€ææ¥ãšããŠã¬ããã³ã¹ããªãŒã¬ã«ãšé¢ãããæ·±ããåã«æ©èœãå®è£
ããã ãã§ãªããèæ¯ãšãªãæ³åŸãå¶çŽãçè§£ããããã§éçºãé²ããå¿
èŠããããŸãã ã¡ã«ã³ã€ã³ã®ããã³ããšã³ãããŒã ã¯ã客ããŸå¯Ÿå¿ã®ããã®ç€Ÿå
ããŒã«ã®ããã³ããšã³ãéçºãLPïŒã©ã³ãã£ã³ã°ããŒãžïŒ ã®äœæãªã©ãæ
åœããŠããŸãã ã¡ã«ã«ãªNFT NFTã®å£²è²·ãå¯èœã«ãããããã¯ããæã€ããŒã ã§ã2025幎1æã«æäŸãéå§ããçŸåšãæ¯é±ã®ããã«æ°æ©èœã远å ãããŠããŸãã ãã®ãããããã¹ããŒãæã®ããéçºãæ±ããããç°å¢ã§ããã ã¡ã«ã«ãªNFTã®ããã³ããšã³ãããŒã ã¯äž»ã«ã¡ã«ã«ãªNFTã®ããã³ããšã³ãéçºãæ
åœããŠããŸãã åãçµã¿æŠèŠ ã¡ã«ã³ã€ã³ 瀟å
ããŒã«ã®ããã³ããšã³ãæ¹ä¿® ã¡ã«ã«ãªNFT è²·åæ©èœã®å®è£
ã»æ¹å ã¡ã«ã«ãªNFTã®ãããã¡ã«ã«ãªã¢ããªå
ãã賌å
¥ã§ããããã«ããããã®å¯Ÿå¿ ãªãªãŒã¹åŸã®ã¡ã¢ãªç£èŠ ãã®ä» Web3é åã®ãã¡ã€ã³ç¥èã®ç¿åŸ 瀟å
ã®å€è·çš®ã®æ¹ãšã®ã³ãã¥ãã±ãŒã·ã§ã³ ãšã³ãžãã¢æ¥åã§ã®AIæŽ»çš ããã§ã¯å€ªåã®6ã€ã«ã€ããŠãŸãšããããšæããŸãã 瀟å
ããŒã«ã®ããã³ããšã³ãã®æ¹ä¿® èæ¯ ã¡ã«ã³ã€ã³ã§é²è¡ããŠãããããžã§ã¯ãã®äžéšãšããŠãå£åº§ã®ç¶æ³ãæå·é貚ã®é
ä¿¡äŸ¡æ Œãªã©ãã客ããŸããã®ãåãåããã«å¿
èŠãªæ
å ±ã確èªã§ãã瀟å
ããŒã«ã®æ¹ä¿®ãæ
åœããããã³ããšã³ãã®ä»æ§æŽçããå®è£
ãQAããŒã ãšã®ãã¹ãã±ãŒã¹ã®èª¿æŽãŸã§ãäžé£ã®éçºããã»ã¹ã«é¢ãããŸããã ãã£ãã㚠瀟å
ããŒã«ã®æ¹ä¿®ã«ããã£ãŠã è¡šèšæºãããªãã ããªããŒã·ã§ã³ã«éäžè¶³ã¯ãªãã ãšã©ãŒãã³ããªã³ã°ãé©åã UIã®æŽåæ§ãããã API飿ºãæ£ããã 倿Žã«æè»ã«å¯Ÿå¿ã§ããèšèšã ãšãã£ããã€ã³ãã確èªããåŸå·¥çšã§ã®ææ»ããèµ·ãã«ããç¶æ
ãŸã§ä»æ§æžã®ã¬ãã¥ãŒãè¡ããŸããã ãã®äžã§èªåã®å®è£
ã¹ããŒããæ¹ä¿®ç¯å²ãèæ
®ããé©åãªãããã¡ãå«ããŠå·¥æ°èŠç©ãããè¡ããŸããã å®è£
ã§ã¯ãåãã€ã¯ããµãŒãã¹éã®éä¿¡ã«ã¯gRPCã䜿ãããŠãããããProtocol Buffersã®å®çŸ©ããã¢ãã¯ãäœããUIãšã®æ¥ç¶ãé²ãããšåæã«Cypressã§ã®E2Eãã¹ããäœæã»æ¹ä¿®ã«åãçµãããšãã§ããŸããã ãŸãQAããŒã ãšã¯ãã¹ãã±ãŒã¹ãææå
容ã確èªããªããã仿§ãšå®è£
ã®éœéœ¬ããªããããšã«åªããŸããã åŠã³ gRPCãProtocol BuffersãCypressãšãã£ããããŸã§è§Šããæ©äŒã®å°ãªãã£ãæè¡ã«åãçµãã ããšã§ãããã³ããšã³ã以å€ã®é åã«ãäžéšçè§£ãåºãããŸããã ããããŠã仿§æžã®ç²ŸåºŠãã©ãé«ããããã©ã®çšåºŠã®ãããã¡ãèŠèŸŒãã§å·¥æ°ãçµã¿ç«ãŠãããã¬ãã¥ãŒãããããã³ãŒãã«ããã«ã¯ã©ããªæžãæ¹ãããããªã©ããããã¯ãéçºå
šäœã俯ç°ããèŠç¹ã身ã«ã€ãããšæããŠããŸãã è²·åæ©èœã®å®è£
ã»æ¹å èæ¯ ã¡ã«ã«ãªNFTå
ã®GMVïŒæµéååŒç·é¡ïŒã䌞ã°ãããã®æœçãšããŠãNFTããã賌å
¥ããã客ããŸãè²·åäŸé Œãåºããæ©èœã®è¿œå ãããŸããã ããã«äŒŽããåå詳现ããŒãžã«æ°ããUIãç¶æ
管çãå¿
èŠãšãªãããã®éšåã®æ¹ä¿®ãæ
åœããŸããã ãŸãããã®ã¿ã¹ã¯ãã¡ã«ã«ãªNFTã®ã³ãŒããè§Šãæåã®æ©èœéçºã ã£ããããæ¢åã³ãŒããåšèŸºä»æ§ã®ãã£ããã¢ãããçŽ æ©ãé²ããå¿
èŠããããŸããã ãã£ãããš ä»æ§æžã確èªããåå詳现ããŒãžã®ã©ã®ã¿ã€ãã³ã°ã§è²·åãã¿ã³ã衚瀺ããããã©ã®ç¶æ
ãã©ãèŠããããšãã£ãUIã®åºãåããæŽçããŸããã ãã®äžã§ãå®è£
ããå
容ã®å質ãæ
ä¿ããããã«VRTïŒVisual Regression TestïŒã掻çšããPlaywrightãçšããã€ã³ãã°ã¬ãŒã·ã§ã³ãã¹ãã远å ã»ä¿®æ£ããŸããã åŠã³ Playwrightã䜿ã£ãã€ã³ãã°ã¬ãŒã·ã§ã³ãã¹ããVRTã®æŽ»çšãªã©ããããŸã§è§Šããæ©äŒã®ãªãã£ããã¹ãææ³ãå®éã«äœ¿ããªããçè§£ãæ·±ããããŸããã ãŸããè²·åååŸã§UIãè€éã«å€åãã仿§ã ã£ãããšããããã³ã³ããŒãã³ãã®è²¬åãã©ãåããããä¿å®æ§ãšå¯èªæ§ãã©ããŸã§äž¡ç«ã§ãããããšãã£ãèšèšé¢ã®åŠã³ãå€ãã£ãã§ãã ã¹ããŒããæ±ããããç°å¢ã®äžã§ããæ¢åå®è£
ã®èª¿æ»ãçè§£ã䞊è¡ããŠé²ããããšã®éèŠæ§ã宿ããŸããã ãªãªãŒã¹åŸã®ã¡ã¢ãªç£èŠ èæ¯ ã¡ã«ã«ãªNFTã§ã¯ããµãŒãã¹ãå®å®ããŠæäŸãç¶ããããã«ããªãªãŒã¹åŸã®ãªãœãŒã¹ç¶æ³ã®ç£èŠãæåã®ç¢ºèªãç¶ç¶çã«è¡ã£ãŠããŸãã ç¹ã«ã¡ã¢ãªäœ¿çšéã¯ããã©ãã£ãã¯ã®å¢æžãç¹å®æ©èœã®å©çšç¶æ³ã«ãã£ãŠå€åããããããã宿çã«èŠ³æž¬ããå¿
èŠã«å¿ããŠæåã調æ»ããéçšãè¡ã£ãŠããŸãã ä»åã®åãçµã¿ã§ã¯ãæ¬çªç°å¢ã®ã¡ã¢ãªäœ¿çšç¶æ³ããã现ããææ¡ããã©ã®ã¿ã€ãã³ã°ã§ã©ã墿žããŠããã®ããæŽçããªãããä»åŸã®å®å®ããéçšã«ã€ãªããããã®èª¿æ»ãé²ããŠããŸãã ãã£ãããš ãŸãã¯ããã€ã»ã©ããªç¶æ³ã§ã¡ã¢ãªãå¢ããã®ãããææ¡ããããã«ãåPodã®ã¡ããªã¯ã¹ã確èªããåŸåã調æ»ããŸããã ãã®äžã§ããªããã®ãããªå¢å ãèµ·ããã®ã仮説ãç«ãŠãé ã«æ€èšŒãé²ããŸããã Datadogãããã°ãã¡ããªã¯ã¹ã现ãã確èªãã€ã€ãä»ããŒã ã«ãçžè«ããNode.jsãNext.jsã®å
éšæåããã£ãã·ã¥ãSSRåšãã®å¯èœæ§ãªã©ãããŸããŸãªèгç¹ããæ
å ±ãéããããšã§æ€èšŒã®æ¹åæ§ã調æŽããŠããŸãã åŠã³ æ¥ã
ã®èª¿æ»ã®äžã§åŸãããåŠã³ã¯éåžžã«å€ããšæããŠããŸãã Node.jsãNext.jsãå
éšã§ã©ã®ããã«ã¡ã¢ãªã䜿ãã®ããCPUã»GCã®ä»çµã¿ããã£ãã·ã¥ã®æ±ããªã©ãæè¡çãªçè§£ã倧ããæ·±ãŸããŸããã åæã«ãé²è¡äžã®åé¡ãæ±ãéã®ã³ãã¥ãã±ãŒã·ã§ã³ã®åãæ¹ã調æ»å
容ã®ãŸãšãæ¹ã仮説ã®ç«ãŠæ¹ãšæ€èšŒã®é²ãæ¹ã鲿ãèŠãã«ããã¿ã¹ã¯ãã©ããã£ãŠåšå²ãšå
±æããããªã©ãæ©èœéçºãšã¯ç°ãªãã¹ãã«ãæ±ããããããšã宿ããŠããŸãã Web3é åã®ãã¡ã€ã³ç¥èã®ç¿åŸ ã¡ã«ã³ã€ã³ãšã¡ã«ã«ãªNFTã®äž¡æ¹ã«é¢ããäžã§ãWeb3ã«é¢ããåºç€ç¥èãç¶ç¶çã«èº«ã«ã€ããããšãæèããŠããŸããã æå·è³ç£ãNFTã®åºæ¬æŠå¿µãã¯ãããæ³èŠå¶ãã³ã³ãã©ã€ã¢ã³ã¹ããã§ãŒã³ã®ä»çµã¿ããã©ã³ã¶ã¯ã·ã§ã³ã®æµãããŠã©ã¬ããã®æåãªã©ãæ¥åã«å¿
èŠãªç¥èã¯ç€Ÿå
ããã¥ã¡ã³ããšããŠå€ãæŽçãããŠããŸãã æ¥ã
ã®éçºãšäžŠè¡ããŠããããã®è³æãèªåããæ¢ããŠèªã¿ãèæ¯ãšãªããã¡ã€ã³çè§£ãæ·±ããããã«ããŠããŸããã Web3ã¯åŠã¶ç¯å²ãåºããç¶ç¶ããŠåãçµã¿ããé åã§ãã 瀟å
ã®å€è·çš®ã®æ¹ãšã®ã³ãã¥ãã±ãŒã·ã§ã³ ããäžã€æèçã«åãçµãã§ããã®ãã瀟å
ã®å€è·çš®ã®æ¹ãšã®ã³ãã¥ãã±ãŒã·ã§ã³ã§ãã ãããã¯ãéçºã§ã¯ãããŸããŸãªè·çš®ãšé£æºããªãã仿§ã®ç¢ºå®ããªãªãŒã¹ã«åãã調æŽãé²ããå¿
èŠããããŸãã ãã®ãããæ¥ã
ã®ããåãã ãã§ãªããäŒç€Ÿã®æœçãšããŠå®æœãããŠããããŒãã«ãã¡ã³ã¿ãŒã©ã³ãã®æ©äŒã掻çšãã€ã€ãèªåããã声ããããŠ1on1ãã©ã³ãã®æ©äŒãã€ããããã«ããŠããŸããã ããŒã å
šäœã話ããããããé°å²æ°ãæã£ãŠããããšããããç©æ¥µçã«ã³ãã¥ãã±ãŒã·ã§ã³ãåãããšãã§ããŸããã ãŸããæ®æ®µã©ã®ããã«æè¡ããã£ããã¢ããããŠããã®ããã©ããªèгç¹ã§ä»æ§ãèŠãŠããã®ãããªãä»ã®ãã£ãªã¢ãéžãã ã®ããšãã£ã話ãèãããšã§ãèªåã®ç¥ããªãã£ãèãæ¹ãç¥èã«è§Šããæ©äŒãå€ããããŸããã éçºã¹ãã«ã ãã§ã¯åŸãããªãåŠã³ãå€ããèŠéãåºãããã£ããã«ãªã£ããšæããŠããŸãã ãšã³ãžãã¢æ¥åã§ã®AIæŽ»çš Cursorãªã©ã®AIããŒã«ãç©æ¥µçã«æŽ»çšããã³ãŒãå
šäœã®æ§é ãçŽ æ©ãææ¡ããããé¢é£éšåã®æŽãåºããå¹çããé²ããããã«ããŠããŸããã éçºã»å®è£
ã§ã¯ãã¡ã³ã¿ãŒã®æ¹ããã®ã¢ããã€ã¹ãåèã«ããªãããã©ã®æ
å ±ãæž¡ããšæå³ãæ£ç¢ºã«äŒããããšãã£ãç¹ãæèããããã«ããŸããã 仿§ãæç¢ºã«ãŸãšããŠã³ã³ããã¹ããšããŠAIã«æž¡ãããšã§ãå®è£
ã®æ¹åæ§ãã¶ãã«ãããªããææ¡ãããã³ãŒãã®å質ãå®å®ããããã«ãªããŸããã ãŸããAIããè¿ã£ãŠããã³ãŒãã¯ãã®ãŸãŸäœ¿ãã®ã§ã¯ãªããèªåã®èããšã®éãã確èªãããããªããã®æžãæ¹ã«ãªãã®ããèªã¿è§£ãããšã§çè§£ãæ·±ãããã£ããã«ããªããŸããã çµæãšããŠãå®è£
ãå¹çåããã ãã§ãªããã³ãŒãã®èšèšæ¹éãæ¯èŒããªããåŠã¹ãè¯ãææã®ãããªååšã«ããªã£ãŠãããšæããŸãã ãŸãšã 3ãæãéããŠãã¡ã«ã³ã€ã³ãšã¡ã«ã«ãªNFTã®ããããç°ãªãç¹åŸŽãæã€ãããã¯ãã®éçºã«æºãããå€ãã®åŠã³ãåŸãããšãã§ããŸããã æ©èœå®è£
ã ãã§ãªãã仿§ã®è©°ãæ¹ããã¹ãã®èãæ¹ãå€è·çš®ãšã®ã³ãã¥ãã±ãŒã·ã§ã³ãªã©ããšã³ãžãã¢ãšããŠå¿
èŠãªã¹ãã«ãå¹
åºãçµéšã§ããæéã ã£ããšæããŠããŸãã æ®ãã®1ãæãããããŸã§ã®åŠã³ã掻ãããªãããããæ·±ãçè§£ãšç¢ºããªã¢ãŠãããããç©ã¿éããŠãããããšæããŸãã ææ¥ã®èšäºã¯ @Fabããã§ããåŒãç¶ããæ¥œãã¿ãã ããã
ã¯ããã« ããã«ã¡ã¯ããµã€ãªã¹ãã¯ãããžãŒã®å®è€ 浩ã§ãã ååã®èšäºã§ã¯ãEthereum Sepoliaãã¹ããããäžã®ãã«ããŒããæ§ç¯ããã€ãã³ããã°ããERC-721ãERC-1155ã®ææè
ãç¹å®ããæ¹æ³ãã玹ä»ããŸããã ååã®èšäºã¯ä»¥äžã§ãã [web3] Ethereum ã® Sepoliaäžã®ã€ãã³ããã°ãã ERC-721, ERC-1155 ã®ææè
ã®èŠã€ãæ¹ ä»åã¯ãã®ç¶ç·šãšããŠãWebSocketãæŽ»çšãããªã¢ã«ã¿ã€ã ã§ã®ææè
ã®ç§»è»¢ãè¡ãããéã®ç£èŠã®æ¹æ³ããäŒãããŸãã WebSocketã䜿ã£ãã€ãã³ãç£èŠã®ä»çµã¿ Ethereumã®ãã«ããŒãã¯éåžžHTTPSã«ããRPCéä¿¡ãæäŸããŠããŸããããªã¢ã«ã¿ã€ã ç£èŠã«ã¯WebSocketãé©ããŠããŸããWebSocketã䜿ãããšã§ãæ°ããã€ãã³ããçºçããæç¹ã§å³åº§ã«éç¥ãåãåãããšãã§ããŸãã åææ¡ä»¶ Sepoliaãã¹ããããäžã®ãã«ããŒãããã§ã«æ§ç¯ãããŠããããš äžèšã«èšèŒã®ååã®èšäºã§ãã«ããŒããæ§ç¯ããŠãã ããã [web3] Ethereum ã® ãã¹ãããã: Sepoliaäžã§ã® ãã«ããŒãæ§ç¯ èšå®æé 1. Gethã®èµ·åèšå®ã倿Žãã ãŸããGethã§WebSocketãæå¹ã«ããããã«ãèµ·åã³ãã³ãã«ä»¥äžã®ãªãã·ã§ã³ã远å ããŸãã --ws --ws.api eth,net,web3 å®éã®ã³ãã³ãäŸã¯ä»¥äžã®ããã«ãªããŸãïŒ gethlocal --sepolia --ws --ws.api eth,net,web3 --http --http.api eth,net,engine,admin --authrpc.jwtsecret ãjwt.hexãã¡ã€ã«ã®ãã¹ã --datadir ãããŒã¿ãã£ã¬ã¯ããªã®ãã¹ã--syncmode snap 2. WebSocketã§ã€ãã³ãããµãã¹ã¯ã©ã€ãããã³ãŒã src/sub.ts ãšãããã¡ã€ã«ã以äžã®å
容ã§äœæããŸãã import WebSocket from 'ws'; // Geth ããŒãã® WebSocket ãšã³ããã€ã³ã const wsUrl = 'ws://localhost:8546'; // WebSocket ã¯ã©ã€ã¢ã³ããäœæ const ws = new WebSocket(wsUrl); ws.on('open', () => { console.log('WebSocket connection established.'); const contractAddressList = [ '0xE88Df35e01e3e33Df38FB0B5e324282feCeb20c2', //ERC-721 '0x412E008d6157568F8c621FbF899e7717F0442a94' //ERC-1155 ]; contractAddressList.forEach((contractAddress) => { // eth_subscribe ã䜿çšããŠãã©ã³ã¶ã¯ã·ã§ã³ãã°ãç£èŠ const subscriptionRequest = { jsonrpc: '2.0', id: 1, method: 'eth_subscribe', params: ['logs', { address: contractAddress, // ç¹å®ã®ã³ã³ãã©ã¯ãã¢ãã¬ã¹ãæå® topics: [] // ãããã¯ãã£ã«ã¿ãæå®ïŒç©ºé
åã¯ãã¹ãŠã®ã€ãã³ããåä¿¡ïŒ } ] }; ws.send(JSON.stringify(subscriptionRequest)); }); }); ws.on('message', (data: any) => { const response = JSON.parse(data.toString()); if (response.method === 'eth_subscription') { console.log('New log:', response.params.result); } else { console.log('Response:', response); } }); ws.on('error', (error: any) => { console.error('WebSocket error:', error); }); ws.on('close', () => { console.log('WebSocket connection closed.'); }); å®è¡ãããšãWebSocketã®æ¥ç¶ã確ç«ããã以äžã®ãããªã¬ã¹ãã³ã¹ã衚瀺ãããŸãïŒ [nodemon] starting `ts-node src/sub.ts` WebSocket connection established. Response: { jsonrpc: '2.0', id: 1, result: '0x8debf94ebabaea3a86f403b2e2791a19' } ãªã¢ã«ã¿ã€ã ç£èŠã®å®äŸ ããã§ã¯ãå®éã«NFTé¢é£ã®ãã©ã³ã¶ã¯ã·ã§ã³ãçºçããéã«åä¿¡ããã€ãã³ããã°ãããã€ã玹ä»ããŸãã 1. OwnershipTransferredã€ãã³ã New log: { address: '0x412e008d6157568f8c621fbf899e7717f0442a94', topics: [ '0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0', '0x00000000000000000000000036da942099c028275321130b5e503f37da446487', '0x000000000000000000000000cebc36de334ce12dfd08f4c39e833016263ba5b0' ], data: '0x', blockNumber: '0x7a2cce', transactionHash: '0xa8edf869ba4fd375f2fdfc51e557d7a3237299f2583242bb43d839f5930fcf78', transactionIndex: '0x1e', blockHash: '0x57e194d69b6dd85dc431228189c8bf551d0e91a74ed14c6eecfba581c580c73c', logIndex: '0x1a', removed: false } ãã®ã€ãã³ãã¯ãã³ã³ãã©ã¯ãã®ãªãŒããŒã·ãã移転ã瀺ããŠããŸããEtherscanã§ã¯ ãã¡ã ã§ç¢ºèªã§ããŸãã 2. TransferSingleã€ãã³ã New log: { address: '0x412e008d6157568f8c621fbf899e7717f0442a94', topics: [ '0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62', '0x00000000000000000000000036da942099c028275321130b5e503f37da446487', '0x00000000000000000000000036da942099c028275321130b5e503f37da446487', '0x000000000000000000000000cebc36de334ce12dfd08f4c39e833016263ba5b0' ], data: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001', blockNumber: '0x7a2d00', transactionHash: '0xa9f80aced3eb829117ef1cdfaba629a6ae625af9e44febe91bfed5b3dfec3565', transactionIndex: '0x43', blockHash: '0x3823f72b6cf3590915be2b19bc2bff5acbf4f35a772c91e69b3dc4d5804bc7e2', logIndex: '0x43', removed: false } ãã®ãã°ã¯ERC-1155ã®TransferSingleã€ãã³ãã§ãåäžã®ããŒã¯ã³ç§»è»¢ãèšé²ããŠããŸãããã©ã³ã¶ã¯ã·ã§ã³ã¯ ãã¡ã ã§ç¢ºèªã§ããŸãã New log: { address: '0x412e008d6157568f8c621fbf899e7717f0442a94', topics: [ '0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62', '0x00000000000000000000000036da942099c028275321130b5e503f37da446487', '0x00000000000000000000000036da942099c028275321130b5e503f37da446487', '0x000000000000000000000000cebc36de334ce12dfd08f4c39e833016263ba5b0' ], data: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001', blockNumber: '0x7a2d0c', transactionHash: '0xb20b71a0e8b8d47ee30fa20c0afc74f82d83aa508492d6128a4dbf7258e91960', transactionIndex: '0x37', blockHash: '0x4a83395b33fd6dd60302d8d340fd4afb114b4b1208cc94b5246ff39162e0173e', logIndex: '0x64', removed: false } 3. TransferBatchã€ãã³ã New log: { address: '0x412e008d6157568f8c621fbf899e7717f0442a94', topics: [ '0x4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb', '0x00000000000000000000000036da942099c028275321130b5e503f37da446487', '0x00000000000000000000000036da942099c028275321130b5e503f37da446487', '0x000000000000000000000000cebc36de334ce12dfd08f4c39e833016263ba5b0' ], data: '0x000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002', blockNumber: '0x7a2d5e', transactionHash: '0xd35a028d7c9a9d98d7ac103f6fa75b0496967e947791572b8a8a87b2407d78b2', transactionIndex: '0x8', blockHash: '0x1f9f0e0134a8b7c57156df86e84262c4037256a7f7f143a184f57922fd1ad3b1', logIndex: '0x13', removed: false } ãã¡ãã¯ERC-1155ã®TransferBatchã€ãã³ãã§ãè€æ°ã®ããŒã¯ã³ãäžåºŠã«ç§»è»¢ãããããšã瀺ããŠããŸãã詳现㯠Etherscan ã§ç¢ºèªã§ããŸãã ã€ãã³ãããŒã¿ã®æŽ»ç𿹿³ åä¿¡ããã€ãã³ããã°ãè§£æããããšã§ã以äžã®ãããªæ
å ±ãååŸã§ããŸãïŒ ERC-721ïŒ event Transfer ããçŽè¿ã®éä¿¡å
ãç¹å® ERC-1155ïŒ event TransferSingle ãš event TransferBatch ããææè
ãšææéãèšç® ãããã®æ
å ±ããªã¢ã«ã¿ã€ã ã§åŠçããããŒã¿ããŒã¹ã«èšé²ããããšã§ãåžžã«ææ°ã®NFTææç¶æ³ãææ¡ããããšãã§ããŸãã ãŸãšã Ethereumãã«ããŒãã䜿ã£ãWebSocketæ¥ç¶ã«ãããNFTã®æææš©ç§»è»¢ããªã¢ã«ã¿ã€ã ã§ç£èŠã§ããããšãããããŸããããã®æ¹æ³ã¯ãNFTååŒãã©ãããã©ãŒã ããŠã©ã¬ãããµãŒãã¹ãªã©ãåžžã«ææ°ã®æææš©æ
å ±ãå¿
èŠãšããã¢ããªã±ãŒã·ã§ã³ã§ç¹ã«æçšã§ãã åèè³æ Geth PubSub API ããã¥ã¡ã³ã ERC-721 éä»£æ¿æ§ããŒã¯ã³èŠæ Œ ERC-1155 ãã«ãããŒã¯ã³èŠæ Œ ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post [web3] Ethereum ãã«ããŒãã䜿ã£ãERC-721, ERC-1155ã®ææè
ã®ãªã¢ã«ã¿ã€ã ç£èŠæ¹æ³ first appeared on SIOS Tech. Lab .












