仿¥ãã€ãŒãµãªã¢ã ãã©ãããã©ãŒã ã¯ããããã¯ãã§ãŒã³ã®åéã§æãæåãªãã©ã³ãã®1ã€ã«ãªãããããã³ã€ã³ã®äººæ°ïŒããã³è³æ¬åïŒã«éåžžã«è¿ã¥ããŠããŸãã ãããããæ¬æ Œçãªããã·ã¢èªã®ã¬ã€ãããªããããåœå
ã®éçºè
ã¯ããããã©ã®ãããªåç©ã§ãããã©ã®ããã«äœæ¥ãããããŸã ããçè§£ããŠããŸããã ãããã£ãŠããã®èšäºã§ã¯ãEthereumã®ã¹ããŒãã³ã³ãã©ã¯ãã®éçºã®ããããåŽé¢ãå¯èœãªéãã«ããŒããããšããŸããã
éçºããŒã«ãPLèªäœãUIã®è¿œå ããã»ã¹ãªã©ã«ã€ããŠèª¬æããŸãã æçµçã«ã¯ãéåžžã®ååºãµã€ããååŸããŸããããå
éšãã§ã¯ãEthereumã¹ããŒãã³ã³ãã©ã¯ãã§åäœããŸãã èå³ã®ãã人-ç«ããé¡ãããŸãã

å
容
ã€ãŒãµãªã¢ã ã®ç޹ä»
ãã®èšäºã¯ãEthereumïŒãŸãã¯äžè¬çãªãããã¯ãã§ãŒã³æè¡ïŒã«å®å
šã«äžæ
£ããªäººã察象ãšããŠããªããããããã§ã¯ããã㯠ã ãã©ã³ã¶ã¯ã·ã§ã³ ã å¥çŽãªã©ã®åºæ¬çãªäºé
ã«ã€ããŠã¯èª¬æããŸããã ç§ã¯ããªããå°ãªããšãäœãèµ·ãã£ãŠããã®ãå°ãç¥ã£ãŠãããšããããšã§ãã ãã以å€ã®å Žåã¯ã以äžã®ãªã¹ãããèšäºãããããšãæ»ã£ãŠããŸã:)
è峿·±ãèšäºãžã®ãªã³ã¯ã¯æåŸã«ãããŸãã
PSç§ã¯Ubuntu 16.04ã®äžã§åããŠããã®ã§ãã€ã³ã¹ããŒã«ãéçºãå±éã®å
šããã»ã¹ã¯ãã®OSã®äžã§èª¬æãããŸãã ããã«ããããããã䜿çšããããã¹ãŠã®ããŒã«ã¯ã¯ãã¹ãã©ãããã©ãŒã ã§ããããïŒãããããç§ã¯ãã§ãã¯ããŸããã§ããïŒãå¿
èŠã«å¿ããŠä»ã®OSã§å®éšããããšãã§ããŸãã
ããŒã«
ã€ãŒãµãªã¢ã ãšã®é£æºã¯ãèšå€§ãªæ°ã®ã¯ã©ã€ã¢ã³ããéããŠå¯èœã§ãããã®äžéšã¯ç«¯æ«ããŒã¹ã§ãããGUIã®äžéšã§ãããããã€ãã®ãã€ããªãããœãªã¥ãŒã·ã§ã³ããããŸãã äžçš®ã®æšæºã¯[Geth]ïŒïŒã§ãããã¯EthereumããŒã ã«ãã£ãŠéçºãããŠããŸãã 以åã®èšäºã§ãã§ã«åœŒã«ã€ããŠæžããŠããŸããã 念ã®ãã ãç¹°ãè¿ããŸãã
ã¯ã©ã€ã¢ã³ãã¯Goã§èšè¿°ããã æšæºçãªæ¹æ³ã§ã€ã³ã¹ããŒã«ãããŸã ã
sudo apt-get install software-properties-common sudo add-apt-repository -y ppa:ethereum/ethereum sudo apt-get update sudo apt-get install ethereum
Gethèªäœã«ã¯GUIã¯ãããŸããããã¿ãŒããã«ããGUIãæäœããã®ã¯éåžžã«äŸ¿å©ã§ãã ã³ãã³ãã©ã€ã³åŒæ°ã®ã»ããå
šäœãããã§èª¬æããŸãããæãäžè¬çãªãã®ãããã€ã説æããŸãã
ä»äºã§ãã䜿ãã³ãã³ãã¯$ geth --dev --rpc --rpcaddr "0.0.0.0" --rpcapi "admin,debug,miner,shh,txpool,personal,eth,net,web3" console
ã $ geth --dev --rpc --rpcaddr "0.0.0.0" --rpcapi "admin,debug,miner,shh,txpool,personal,eth,net,web3" console
Gethã¯ããªãåªããŠããŸãããæè¿ã§ã¯Rustã§æžãããå¥ã®ã¯ã©ã€ã¢ã³ãã§ããParityã«äŒãããšãã§ããŸãã Gethãšã®äž»ãªéãã¯ãçµ±åãããWebã€ã³ã¿ãŒãã§ã€ã¹ã§ããç§ã®æèŠã§ã¯ãæ¢åã®ã€ã³ã¿ãŒãã§ã€ã¹ã®äžã§æã䟿å©ã§ãã ã€ã³ã¹ããŒã«ïŒ
sudo <(curl https://get.parity.io -Lk)
ããŠã³ããŒããå®äºããããã³ã³ãœãŒã«ã§parity
ãå®è¡ãã localhostïŒ8180ã§ãŠã©ã¬ããèªäœãèŠã€ããããšãã§ããŸãã

å¥ã®ãã©ã¹ïŒããªãã£ã¯ç«¶åä»ç€Ÿãããé«éã§ãã å°ãªããšãèè
ã¯ããèšã£ãŠããŸãããç§ã®æèŠã«ãããšãããã¯ç¹ã«ãããã¯ãã§ãŒã³ã®åæã«é¢ããŠã¯æ¬åœã«ããã§ãã
å¯äžã®æ³šæäºé
-åçã®ã³ã³ãœãŒã«ã¯ãããŸããã ãã ããæ¬¡ã®ç®çã§Gethãç°¡åã«äœ¿çšã§ããŸãã
$ parity --geth
ãã®ããŒã«ã¯ã以åã®ããŒã«ãšã¯ç°ãªããéçºè
ã®ã¿ã«åœ¹ç«ã¡ãŸãã 1ã€ã®testrpc
ããŒã ã¯ãRPCãããã³ã«ããªã³ã«ããŠãã©ã€ããŒããããã¯ãã§ãŒã³ãäœæããã¢ã«ãŠã³ãã«ETHãå«ãäºåã«äœæããã倿°ã®ã¢ã«ãŠã³ãã皌åäžã®ãã€ããŒãªã©ãäœæã§ããŸãã ãªã¹ãå
šäœã¯ãã¡ãã§ãã å®éã testrpc
ã¯åãgeth --dev --rpc ...
testrpc
ã¯ãã¢ã«ãŠã³ãã®äœæããã€ããŒã®ãªã³/ãªããããã³ãã®ä»ã®æ¥åžžçãªã¢ã¯ã·ã§ã³ã«æéãè²»ããå¿
èŠã¯ãããŸããã
ã€ã³ã¹ããŒã«npm install -g ethereumjs-testrpc

Ethereumã§æã人æ°ã®ãããŠã©ã¬ããã§ãããå®éã«ã¯ãã£ãšå€ãã®ããšãã§ããŸãã Mistã䜿çšããããã»ã¹å
šäœãã¹ãããããšã«èª¬æããçŽ æŽãããèšäºã次ã«ç€ºããŸãã ãªãªãŒã¹ããŒãžããææ°ããŒãžã§ã³ãããŠã³ããŒãã§ããŸã ã ãŠã©ã¬ããã®äœ¿çšã«å ããŠãå¥çŽã䜿çšããããšãã§ããŸãã

ã³ã³ãã©ã¯ãéçºçšã®æã人æ°ã®ããIDEã ethereum.imtqy.com/browser-solidity/ã®ãã©ãŠã¶ãŒã§æ©èœããèšå€§ãªæ°ã®æ©èœããµããŒãããŸãã
- æå®ãããRPCãããã€ããŒãžã®æ¥ç¶
- ã³ãŒãããã€ãã³ãŒã/ãªãã³ãŒãã«ã³ã³ãã€ã«ãã
- GitHub Gistãžã®æçš¿
- ã¹ããããã€ã¹ããããããã¬ãŒ
- ã¬ã¹ã§æ©èœãå®è¡ããã³ã¹ãã®èšç®
- ããŒã«ã«ã¹ãã¬ãŒãžã«ã³ãŒããä¿åãã
- ãã®ä»
ãã ãããªãŒãã³ã³ããªãŒãã¯ãããŸãããããã¯éåžžã«æ²ããããšã§ãã

Meteorã§äœæãããã¹ããŒãã³ã³ãã©ã¯ããéçºããããã®å¥ã®IDEã¯ããã®ãŸãŸäœ¿çšã§ããŸãã éå§ããã«ã¯ãæ°ããã¿ãŒããã«ãéããRPCã€ã³ã¿ãŒãã§ã€ã¹ãæå¹ã«ãªã£ãŠããããŒããèµ·åããŸãgeth --rpc --rpcapi="db,eth,net,web3,personal" --rpcport "8545" --rpcaddr "127.0.0.1" --rpccorsdomain "localhost" console
ã ãã®åŸãIDEèªäœãå®è¡ã§ããŸãã
$ git clone http://github.com/SilentCicero/meteor-dapp-cosmo.git $ cd meteor-dapp-cosmo/app $ meteor
次ã«ã localhostïŒ3000ãéããäœæ¥ãéå§ã§ããŸãã

ã¹ããŒãã³ã³ãã©ã¯ãã®éçºãå éãã仿¥ã®ææ°ããŒã«ã ããã¯ã apm install atom-ethereum-interface
ã䜿çšããŠapm install atom-ethereum-interface
ãããAtomãšãã£ã¿ãŒã®ãã©ã°ã€ã³ã§ãã äºã¯äŸ¿å©ã§ããç§ã¯èªåã§ããã䜿çšããŸãã JS EVMã䜿çšããããRPCãä»ããŠããŒãã«æ¥ç¶ãããã§ããŸãã CTRL + ALT + C
ã®ã³ã³ãã©ã¯ããã³ã³ãã€ã«ãã CTRL + ALT + S
ãããã¯ãŒã¯ã«å±éããŸãCTRL + ALT + S
ãŸããããã¯å¥çŽèªäœãæäœããããã®è¯ãã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããŸãã

ãšãã£ã¿ãŒå
ã§ãã®ãããªæ©èœè±å¯ãªæ©èœãå¿
èŠãªãå Žåã¯ãAtomã®å Žåã Solidity - language-ethereumã匷調ããæ§æãæã€å¥ã®ãã©ã°ã€ã³ããããŸãã åŸè
ã¯ãæ¬è³ªçã«Sublime textã®ãã©ã°ã€ã³ã§ãã ãAtomã§ã®ã¿åäœããããã«å€æãããŸãã
å
ç¢æ§
Solidityã ãã§ãªããããšãã°Serpent ïŒPythonã®ããã«èŠããïŒãªã©ã®ä»ã®èšèªã§ãå¥çŽãäœæã§ãããšããäºå®ãèããããšããããããããŸããã ããããéçºãã©ã³ãã€ãŒãµãªã¢ã /ããã®æåŸã®ã³ãããã¯çŽå幎åã ã£ãã®ã§ãã©ããããèšèªã¯æ²ããããªã廿¢ãããŸããã
ãããã£ãŠãSolidityã«ã€ããŠã®ã¿èšè¿°ããŸãã ãããŸã§ã®ãšããããã®èšèªã¯éçºã®æ¯èŒçåæã®æ®µéã«ãããããè€éãªæ§é ãç¬èªã®æœè±¡åã¯ãããŸããã ãããã£ãŠãããã«ã€ããŠåå¥ã«è©±ãçç±ã¯ãããŸãã-ããã°ã©ãã³ã°ã®çµéšããã人ãªã誰ã§ãã ããã¥ã¡ã³ããèªãã§ãã20ååŸã«èªç±ã«ãããæžãããšãã§ããŸã ã ãã®ãããªçµéšããªãå Žåã¯ã以äžã«å¥çŽã³ãŒãå
šäœã«ã€ããŠè©³ãã説æããŸããã
èªç¿ã«ã€ããŠã¯ãæã詳现ãªèª¬æãå«ãããã€ãã®éåžžã«è¯ãäŸããããŸãã
ç¹°ãè¿ããŸãããç§ã¯ïŒçŽ æŽãããïŒïŒèšèªã®ããã¥ã¡ã³ã ã æã«ã¯ãã·ã¢èªã«ç¿»èš³ããããã®ã«ããæ³šæããŸãã
ååºå¥çŽãäœæãã
å¥çŽãäœæããæãæ¥ãŸããã æçµçã«ã¯ããå±¥æŽæžãèªäœãé
眮ããååºã¢ããªã±ãŒã·ã§ã³ã«ãªããŸãã
- ååãã¡ãŒã«ãé£çµ¡å
ãªã©
- ãããžã§ã¯ããªã¹ã
- æè²ïŒå€§åŠãã³ãŒã¹ãªã©
- ã¹ãã«
- åè¡ç©
æåã®ã¹ããã
æåã«ãå¥çŽãã³ãã¬ãŒããšã³ã³ã¹ãã©ã¯ã¿ãŒé¢æ°ãäœæããŸã ã ã³ã³ãã©ã¯ãèªäœãšåãããã«åŒã³åºãå¿
èŠããããäžåºŠã ãåŒã³åºãããŸã-ã³ã³ãã©ã¯ãããããã¯ãã§ãŒã³ã«ããŒããããšãã ããã䜿çšããŠãåäžã®å€æ°address owner
ãåæåããŸãã ããããæ¢ã«æšæž¬ããããã«ããããã¯ãŒã¯ã«å¥çŽãã¢ããããŒããã人ã®äœæãèšé²ãããŸãã ãŸããå¥çŽç®¡çè
ã®æ©èœãå®è£
ããããã«äœ¿çšãããŸãããããã«ã€ããŠã¯åŸã§è©³ãã説æããŸãã
pragma solidity ^0.4.0; contract EthereumCV is Structures { address owner;
æ¬¡ã®æé ã§ã¯ãäœæè
ã«é¢ããåºæ¬æ
å ±ïŒååãã¡ãŒã«ãã¢ãã¬ã¹ãªã©ïŒãæå®ããæ©èœã远å ããŸãã ãããè¡ãã«ã¯ãæãäžè¬çãªmapping
ã䜿çšããŸããããã¯ãå¥çŽã®éå§æã«å®£èšããå¿
èŠããããŸãã
address owner; mapping (string => string) basic_data;
å¥çŽãããã®ããŒã¿ããåä¿¡ãã§ããããã«ããã«ã¯ã次ã®é¢æ°ãäœæããŸãã
function getBasicData (string arg) constant returns (string) { return basic_data[arg]; }
ããã§ã¯ãã¹ãŠãåçŽã§ãã constant
修食åã«æ³šæããå¿
èŠããããŸããããã¯ãã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
ã倿Žããªã颿°ã«äœ¿çšã§ããŸãïŒããã³äœ¿çšããå¿
èŠããããŸãïŒã ãã®ãããªé¢æ°ã®äž»ãªãã©ã¹ïŒsicïŒïŒã¯ãéåžžã®é¢æ°ãšããŠäœ¿çšã§ããããšã§ãã
éå¶
å±¥æŽæžãã³ã³ãã³ãã§åããããšãæ€èšãã䟡å€ããããŸãã æãåçŽãªã±ãŒã¹ã§ã¯ã次ã®ãããªé¢æ°ã䜿çšããŠååŸã§ããŸãã
function setBasicData (string key, string value) { basic_data[key] = value; }
ãã ãããã®å Žåãããšãã°setBasicData("name", "New Name")
åŒã³åºãããšã§ãã ãã§ãååã倿Žã§ããŸãã 幞ããªããšã«ããã®ãããªè©Šã¿ã1è¡ã§åæ¢ããæ¹æ³ããããŸãã
function setBasicData (string key, string value) { if (msg.sender != owner) { throw; } basic_data[key] = value; }
åæ§ã®æ§æãè€æ°å䜿çšããå¿
èŠãããããïŒããšãã°ãæ°ãããããžã§ã¯ãã远å ããå ŽåïŒãç¹å¥ãªä¿®é£Ÿåãäœæãã䟡å€ããããŸãã
modifier onlyOwner() { if (msg.sender != owner) { throw; } _;
å¿
èŠã«å¿ããŠããã¹ã¯ãŒããªã©ã®ä»ã®èªèšŒæ¹æ³ã䜿çšã§ããŸãã ããã·ã¥ã¯ã³ã³ãã©ã¯ãã«ä¿åãããå颿°åŒã³åºãã§å
¥åããããã®ãšæ¯èŒãããŸãã ãããã誰ãã¬ã€ã³ããŒããŒãã«ãšèŸæžæ»æããã£ã³ã»ã«ããªãã£ãããããã®æ¹æ³ã¯ããã»ã©å®å
šã§ã¯ãªãããšã¯æããã§ãã äžæ¹ã owner
ã¢ãã¬ã¹ã«ã¢ã¯ã»ã¹ã§ããªããªããšãäœãç·šéã§ããªããªãããããã®æ¹æ³ãçæ³çã§ã¯ãããŸããã
ã¢ãžã¥ãŒã«æ§
次ã®ã¹ãããã¯ããããžã§ã¯ããæè²ãã¹ãã«ãåºçç©ãèšè¿°ããããã®ããã€ãã®æ§é ãäœæããããšã§ãã ããã§ã¯ãã¹ãŠãåçŽã§ãæ§é ã¯CãšãŸã£ããåãæ¹æ³ã§èšè¿°ãããŠããŸãã ããããçŸåšã®å¥çŽã§ããããèšè¿°ããã®ã§ã¯ãªããå¥ã®ã©ã€ãã©ãªãŒã«ïŒæ°ãããã¡ã€ã«ã§ïŒé
眮ããŸãã ãããã£ãŠãèšå€§ãªã³ãŒãã®ã·ãŒããåé¿ãããããžã§ã¯ããæ§æã§ããŸãã
ãããè¡ãã«ã¯ãåããã£ã¬ã¯ããªã§ãæ°ããstructures.sol
ãã¡ã€ã«ãšStructures
ã©ã€ãã©ãªãäœæããŸãã ãããŠããã§ã«ãã®å
éšã§åæ§é ã«ã€ããŠèª¬æããŸãã
pragma solidity ^0.4.0; library Structures { struct Project { string name; string link; string description; } struct Education { string name; string speciality; int32 year_start; int32 year_finish; } struct Publication { string name; string link; string language; } struct Skill { string name; int32 level; } }
çµæã®ãã¡ã€ã«ãã€ã³ããŒãããããã ãã«æ®ããŸã
pragma solidity ^0.4.0; import "./structures.sol"; contract EthereumCV { mapping (string => string) basic_data; address owner; Structures.Project[] public projects; Structures.Education[] public educations; Structures.Skill[] public skills; Structures.Publication[] public publications;
æãè³¢ãã®ã¯ã Structures.Project[] projects
衚èšãProject
åã®èŠçŽ ãæã€åçé
åãäœæããããšãæå³ããããšããã§ã«æšæž¬ããŠããããšã§ãã ãããã public
修食åã䜿çšãããšãããè€éã«ãªããŸãã åºæ¬çã«ã get_project(int position) { return projects[position]; }
ãããªé¢æ°ã«çœ®ãæãget_project(int position) { return projects[position]; }
get_project(int position) { return projects[position]; }
-ã³ã³ãã€ã©ãŒã¯ãã®ãããªé¢æ°ãäœæããŸãã ããã¯å€æ°ãšåãæ¹æ³ã§åŒã³åºããprojects
ããã®å Žåã projects
ã§ãã
ããªãã¯å°ããããšãã§ããŸã-ãªãæåã«mapping (string => string) public basic_data
ãã代ããã«èªåã§ãã®ãããªé¢æ°ãäœæããã®ã§ããïŒ çç±ã¯åçŽã§ã-ãããŸã§ã®ãšããã public
ã¯ãããŒãåçããŒã¿åã§ãã倿°ã®æäœæ¹æ³ãç¥ããŸããïŒ string
ã¯ãã®ãããªåã§ãïŒã
Unimplemented feature (/src/libsolidity/codegen/ExpressionCompiler.cpp:105): Accessors for mapping with dynamically-sized keys not yet implemented.
ãããè¡ãã«ã¯ãäŸãšããŠmapping (bytes32 => string)
ãšããŠbasic_data
ã宣èšãmapping (bytes32 => string)
ã
ãšããã§ã念ã®ããã«ãããŒã«ã«ãã¡ã€ã«ã«å ããŠã Remixã¯Githubãžã®ãªã³ã¯ã䜿çšããŠãããã«Swarmãããã³ã«ã䜿çšããŠ.sol
ãã¡ã€ã«ãã€ã³ããŒãã§ããããšã«æ³šæããŠãã ããïŒããã¯Ethereumã®åæ£ã¹ãã¬ãŒãžã®ãããªãã®ã§ãã詳现ã¯ãã¡ã ïŒ
ããŒã¿ãããŠã³ããŒãããŠåé€ãã
çããã®å€ãã¯ãæ°ããããŒã¿ã䜿çšããŠäœæ¥ãå®è£
ãã䟡å€ãããããšããã§ã«æšæž¬ããŠãããšæããŸãã åºçç©ã®ãªã¹ãã®äŸã§ç€ºããŸãããä»ã®å Žåã¯ãã¹ãŠã䌌ãŠããŸãã
function editPublication (bool operation, string name, string link, string language) onlyOwner() { if (operation) { publications.push(Structures.Publication(name, link, language)); } else { delete publications[publications.length - 1]; } }
operation
ãã©ã¡ãŒã¿ãŒã䜿çšããŠãæåŸã®ãããªã±ãŒã·ã§ã³ãåé€ããå¥ã®é¢æ°ãäœæããå¿
èŠããªããªããŸããïŒããã¯æŸèæã§ãããåŠç¿ããŠããã ãã§ãïŒã é
åå
ã®èŠçŽ ãåé€ãããã®æ¹æ³ã¯ãå®éã«ã¯ãŸã£ããæ£ãããªãããšã«æ³šæããŠãã ããã ãã¡ãããèŠçŽ èªäœã¯åé€ãããŸãããã€ã³ããã¯ã¹ã®ä»£ããã«ç©ºã®ã¹ããŒã¹ãæ®ããŸãã ç§ãã¡ã®å Žåãããã¯èŽåœçã§ã¯ãããŸããïŒã¯ã©ã€ã¢ã³ãåŽã§åã
ã®èŠçŽ ã®ç©ºã確èªããŸãïŒããäžè¬çã«èšãã°ããããå¿ããªãã§ãã ããã ããã«ãé
åå
šäœãã·ããããé·ãã«ãŠã³ã¿ãŒãæžããããšã¯ããã»ã©é£ãããããŸãã ã
ããŒã¿ãæäŸããŸã
æ¢ã«è¿°ã¹ãããã«ã Project[] public projects
è¡ã®public
修食åã¯ãã€ã³ããã¯ã¹i
ãããžã§ã¯ãprojects[i]
ãè¿ã颿°ãæäŸããŸããã ãããããããžã§ã¯ãã®æ°ã¯ããããŸããã2ã€ã®æ¹æ³ããããŸãã æåã®æ¹æ³ã¯ãååšããªãèŠçŽ ã«é¢ãããšã©ãŒãçºçãããŸã§i
ãå埩åŠçããããšã§ãã 2ã€ç®ã¯ã projects
ã®ãµã€ãºãè¿ãå¥ã®é¢æ°ãäœæããããšã§ãã 2çªç®ã®æ¹æ³ã«é²ã¿ãŸããå°ãåŸã§ãçç±ã説æããŸãã
function getSize(string arg) constant returns (uint) { if (sha3(arg) == sha3("projects")) { return projects.length; } if (sha3(arg) == sha3("educations")) { return educations.length; } if (sha3(arg) == sha3("publications")) { return quotes.length; } if (sha3(arg) == sha3("skills")) { return skills.length; } throw; }
éåžžã®æ¹æ³ã§2è¡ãæ¯èŒã§ããªãããšã«æ³šæããŠãã ãã'aaa' == 'bbb'
ã çç±ã¯åãã§ããã string
ã¯åçãªããŒã¿åã§ãããããããæäœããã®ã¯ããªãèŠçã§ãã ãã®ãããããã·ã¥ãæ¯èŒããããæåããšã®æ¯èŒã«é¢æ°ã䜿çšãããã®ããããã§ãã ãã®å Žåãäžè¬çãªã©ã€ãã©ãªstringUtils.solã䜿çšã§ããŸãããã®ãããªæ©èœããããŸãã
å±éãã
ç°ãªãéçºç°å¢ã§ã¯ãã³ã³ãã€ã«ãšå±éã®ããã»ã¹ã¯ãã¡ããç°ãªããŸãããã®ãããç§ã¯æã人æ°ã®ããRemixã«éå®ããŸãã
æåã«ããã¡ãããã³ãŒãå
šäœãå
¥åããŸãïŒæçµããŒãžã§ã³ã¯ãããžã§ã¯ããªããžããªã«ãããŸã ïŒã 次ã«ã [å®è¡ç°å¢ã®éžæ]ããããããŠã³ãªã¹ãã§ã[ Javascript VM
éžæããŸããããã§ã¯ãJSãããã¯ãã§ãŒã³ãšãã¥ã¬ãŒã¿ãŒã§ã³ã³ãã©ã¯ãããã¹ãããŸããå°ãåŸã§ãå®éã®å®è¡æ¹æ³ãåŠç¿ããŸãã ãã¹ãŠãå¥çŽã©ããã«ãªã£ãŠããå Žåã¯ã[ äœæ ]ãã¿ã³ã䜿çšå¯èœã«ãªããŸããã¯ãªãã¯ããŠè¡šç€ºããŸãïŒ

ã³ã³ãã©ã¯ãããããã¯ãã§ãŒã³ã«ã¢ããããŒããããã®ã§ïŒãšãã¥ã¬ãŒã·ã§ã³ã§ã¯ãããŸãããæ¬è³ªã§ã¯ãããŸããïŒã颿°ãåŒã³åºããŠäœãèµ·ãããã確èªã§ããŸãã ããšãã°ãé»åã¡ãŒã«ãã³ã³ãã©ã¯ãã«ä¿åã§ããŸããããã«ã¯ã setBasicData
颿°ãèŠã€ãããã£ãŒã«ãã«å
¥åããŠã颿°åã®ãã¿ã³ãã¯ãªãã¯ããŸãã

颿°ã¯äœãè¿ããªãããã result: 0x
ã§ãã ããã§ãå¥çŽããé»åã¡ãŒã«ããªã¯ãšã¹ãã§ããŸãgetBasicData
颿°ãæ¢ããŠè©ŠããŠãã ããïŒ

æ®ãã®æ©èœã«ã€ããŠã¯ãèªåã§å®éšããããšããå§ãããŸãã
UIã远å
以äžã«ãUIãå¥çŽã«è¿œå ããæãäžè¬çãªæ¹æ³ã«ã€ããŠèª¬æããŸãã JSãšHTMLã䜿çšããŠä»»æã®è€éãªã€ã³ã¿ãŒãã§ã€ã¹ãäœæã§ããŸããEthereumã¯ãŒãã³ã°ããŒãïŒãŸãã¯ãã®é¡äŒŒç©ïŒã«ã¢ã¯ã»ã¹ã§ããã°ååã§ãã
ããã¯ã æ±çšJSON RPC仿§ãå®è£
ããã€ãŒãµãªã¢ã äºæã®JavaScript APIã§ãã ããã¯ãnpmã§ããŒãã¢ãžã¥ãŒã«ãšããŠãbowerããã³ã³ã³ããŒãã³ããšããŠãåã蟌ã¿å¯èœãªjsããã³meteor.jsããã±ãŒãžãšããŠå©çšã§ããŸãã
ããã¯ãéåžžã®JSã䜿çšããŠã€ãŒãµãªã¢ã APIã䜿çšããããšã奚å±ããJSã©ã€ãã©ãªã§ãã å®éããã®å©ããåããŠãããŒãã«æ¥ç¶ããã ãã§ããã©ãŠã¶ã«gethã³ã³ãœãŒã«ã®ãããªãã®ã衚瀺ãããŸãã npm
ãŸãã¯bower
çµç±ã§ã€ã³ã¹ããŒã«ïŒ
$ sudo npm install web3 $ bower install web3
node.jsãä»ããŠweb3ãæäœããäŸã次ã«ç€ºããŸãïŒæåã«testrpc
ãŸãã¯RPCã€ã³ã¿ãŒãã§ã€ã¹ãåããä»ã®ããŒããå®è¡ããŸãïŒã
$ node > var Web3 = require('web3'); > var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")); > web3.eth.accounts [ '0x5f7aaf2199f95e1b991cb7961c49be5df1050d86', '0x1c0131b72fa0f67ac9c46c5f4bd8fa483d7553c3', '0x10de59faaea051b7ea889011a2d8a560a75805a7', '0x56e71613ff0fb6a9486555325dc6bec8e6a88c78', '0x40155a39d232a0bdb98ee9f721340197af3170c5', '0x4b9f184b2527a3605ec8d62dca22edb4b240bbda', '0x117a6be09f6e5fbbd373f7f460c8a74a0800c92c', '0x111f9a2920cbf81e4236225fcbe17c8b329bacd7', '0x01b4bfbca90cbfad6d6d2a80ee9540645c7bd55a', '0x71be5d7d2a53597ef73d90fd558df23c37f3aac1' ] >
åãããšãJSãã©ãŠã¶ã³ã³ãœãŒã«ããã®ã¿ïŒ <script src="path_to/web3.js"></script>
å¿ããªãã§ãã ããïŒ

ã€ãŸãããã®æç¹ã§ããŒããèµ·åããçŸåšã®ãã§ãŒã³ãšåæãããããšãã§ããã¢ããªã±ãŒã·ã§ã³ãäœæããã ãã§ãã ãã ãã2ã€ã®åŸ®åŠãªç¹ããããŸãããŸããEthereumãããã¯ãã§ãŒã³ãåæããå¿
èŠãããããŸã åæããŠããªãå¯èœæ§ãé«ãã§ãã
2çªç®ã®ãã¥ã¢ã³ã¹ã¯ãRPCã«ã¯èªèšŒã¡ã«ããºã ãçµã¿èŸŒãŸããŠããªããããã ãã§ãJSãœãŒã¹ããããŒãã®ã¢ãã¬ã¹ãèŠã€ããŠã奜ããªããã«äœ¿çšã§ããããšã§ãã ãã¡ãããããã§ã¯ãæãåçŽãªHTTPåºæ¬èªèšŒã䜿çšããŠãNginxã«äœããã®ã©ãããŒãæžãããšãã§ããŸãããããã¯å¥ã®æ©äŒã§ãã
ãããã£ãŠãã¡ã¿ãã¹ã¯ãã©ã°ã€ã³ïŒalasãChromeã®ã¿ïŒã䜿çšããŸãã å®éãããã¯ããŒããšãã©ãŠã¶ãŒã®éã®ã¬ã€ã€ãŒã§ããããã©ãŠã¶ãŒã§web3ã䜿çšã§ããŸãããç¬èªã®ããŒãã¯ãããŸããã ã¡ã¿ãã¹ã¯ã¯éåžžã«ç°¡åã«æ©èœããŸããåããŒãžã«web3.jsãåã蟌ã¿ãã¡ã¿ãã¹ã¯RPCãµãŒããŒã«èªåçã«æ¥ç¶ããŸãã ãã®åŸãEthereumãæå€§éã«æŽ»çšã§ããŸãã
ãã©ã°ã€ã³ãã€ã³ã¹ããŒã«ããåŸãå·Šäžé
ã§Testnet
ãéžæãã ã¡ã¿ãã¹ã¯ã¿ããã§ãšãŒãã«ãååŸããŸãã ãã®æç¹ã§ã次ã®ãããªãã®ãååŸããå¿
èŠããããŸãïŒãã¡ãããã¯ãªãŒã³ãªã¹ããŒãªãŒããããŸãïŒã

Metamaskã䜿çšãããšããããã¯ãŒã¯ãžã®ã³ã³ãã©ã¯ãã®å±éã¯ãJS EVMã®å Žåãšåããããç°¡åã§ãã ãããè¡ãã«ã¯ãRemixãå床éãã [å®è¡ç°å¢ã®éžæ]ãªã¹ããã[ Injected Web3
ããInjected Web3
ãéžæããŸãïŒã»ãšãã©ã®å Žåãèªåçã«éžæãããŸãïŒã ãã®åŸã[äœæ]ãã¯ãªãã¯ããŠããããã¢ãããŠã£ã³ããŠã衚瀺ããŸãã

å°ãåŸã«ã Waiting for transaction to be mined..
å
¬éãããå¥çŽã«é¢ããæ
å ±ã«çœ®ãæããããŸã-ããã¯ã圌ããããã¯ãã§ãŒã³ã«é¥ã£ãããšãæå³ããŸãã ã¡ã¿ãã¹ã¯ãéããŠãã©ãŒã ã®ãšã³ããªãã¯ãªãã¯ãããšãå¥çŽã¢ãã¬ã¹ã確èªã§ããŸãã

ãã ããããšãã°ã editProject(...)
颿°ãåŒã³åºãå Žåã¯ããã©ã³ã¶ã¯ã·ã§ã³ã確èªããŠããããã¯ã«ãã€ãã³ã°ããããŸã§åŸ
æ©ããå¿
èŠããããŸãã
äŸ
Web3ãä»ããŠå¥çŽããããŒã¿ãåä¿¡ããæ¹æ³ãåŠã¶ã®ã¯ããªã次第ã§ãã ãããè¡ãã«ã¯ããŸããããŒãžäžã®web3ã®ååšã倿ããæ¹æ³ãåŠã¶å¿
èŠããããŸãã
window.addEventListener('load', function() {
startApp()
å
ã§ãã³ã³ãã©ã¯ããæäœããããžãã¯å
šäœãå®çŸ©ãã startApp()
ããšã©ãŒãåé¿ããŸããã
function startApp() { var address = { "3" : "0xf11398265f766b8941549c865d948ae0ac734561"

ãŸãšã
ãã¹ãŠãçè§£ããã®ã§ãã¬ã€ã¢ãŠããšJSãåŒãåããããšãã§ããŸãã Vue.jsãšSpecter.cssã䜿çšããã¹ãã«ã®èŠèŠåã®ããã«Google Chartã远å ãããŸããã çµæã¯pavlovdog.imtqy.comã§èŠãããšãã§ããŸãïŒ

çµè«ã®ä»£ããã«
ãããã¯ãã§ãŒã³ãã¯ãããžãŒãæãçŽæ¥äœ¿çšããã¢ããªã±ãŒã·ã§ã³ããã°ããäœæããæ¹æ³ãèŠãŸããã ã·ã³ãã«ãã远æ±ããããïŒçµå±ãããã¯ãã¬ãŒãã³ã°èšäºã§ãïŒãç§ã¯è¯ãæ¹æ³ã§èš±å¯ãããã¹ãã§ã¯ãªãããã€ãã®åçŽåãè¡ããŸããã
ããšãã°ãããŒãã§äœæ¥ãã代ããã«ãä»ã®èª°ãã®ã²ãŒããŠã§ã€ïŒã¡ã¿ãã¹ã¯ã«ã€ããŠè©±ããŠããïŒã䜿çšããŸãã ããã¯äŸ¿å©ã§ããããããã¯ãã§ãŒã³ãã¯ãããžãŒã¯äž»ã«åæ£åãšä»²ä»è
ã®äžåšã§ãã ç§ãã¡ã¯ããããã¹ãŠæã£ãŠããããã§ã¯ãããŸãã-ã¡ã¿ãã¹ã¯ã®äººã
ãä¿¡é ŒããŠããŸãã
å¥ã®ãããã»ã©é倧ã§ã¯ãªãåé¡ãšããŠãå¥çŽãšãã©ã³ã¶ã¯ã·ã§ã³ããããã«å±éããã³ã¹ããå¿ããŠããŸããã å®éã«ã¯ã bytes
代ããã«string
ã䜿çšããåã«10åèãã䟡å€ãããbytes
ããã®ãããªããšã¯ãäž»ã«å¥çŽãæ±ãéã®ã³ã¹ãã«åœ±é¿ããããã§ãã ç¹°ãè¿ãã«ãªããŸããããã®äŸã§ã¯Testnet
ã䜿çšããããããéã¯äžå䜿ããŸããã§ãããã Main net
äœæ¥ãããšãã¯ããã»ã©ç¡é§ã«ãã¹ãã§ã¯ãããŸããã
ãããã«ããã質åãããã°ãã³ã¡ã³ãã§å°ããããç§ã«é»åã¡ãŒã«ãæžããŠãã ããã
åç
§è³æ