read.cash Log in

@vcckvv

Joined 25 March 2022 · 17 posts

https://noise.app/vcckvv

120 KT

0 KT · 1¢ received · 0 KT · 1¢ given

Posts

@vcckvv

aiArt - 冬天貓貓embedding測試 「aiArt」 本次主題:冬天貓貓embedding測試 之前曾經提過embedding(也就是Textual Inversion)的品質通常會比DreamBooth訓練出來的模組差,不過偶爾也有出圖品質不錯的embedding,通常是在固定畫風、固定的構圖下可以生出不錯的圖,因為這是AI比較好處理的形式 這次embedding的.pt檔下載連結: https://huggingface.co/ProGamerGov/winter-cat-embeddings-sd-v2-1/resolve/main/wcat8-v1-1000.pt 咒文參考自: https://huggingface.co/ProGamerGov/winter-cat-embeddings-sd-v2-1 因為embedding比較適合弄出固定風格的圖,所以沒做什麼太大的修改,中途有試出貓娘的圖,不過還是覺得貓貓可愛就全做貓貓的圖了~ 要注意這個是stable diffusion 2.1 768px的模組專用的embedding 使用的咒文和參數: (extremely detailed CG unity 8k wallpaper),(((masterpiece))),(((best quality))),highres,((ultra-detailed)),((an extremely delicate and beautiful)),(best illustration), a cute skinny cat wearing a winter toque and scarf in the snow, realistic, at artstation and behance, art by wcat8-v1-1000, cinematic lighting, night, heavy snowfall, snowstorm, ******** Negative prompt: (photo),(photograph), cropped,out of frame,worst quality,low quality,normal quality,jpeg artifacts,lowres,(blurry),(vague),ugly,poor drawing,poor painting,amateur, bad,weird,distorted,malformed,broken,error,wrong,dirty,unclean, poor drawing picture,poor drawing line, dirty drawing,dirty painting,dirty drawing line, unclean drawing,unclean painting,unclean drawing line, ******** Steps: 20, Sampler: DDIM, CFG scale: 7, Seed: 1567866604, Size: 704x704, Model hash: 4bdfc29c Steps: 20, Sampler: DDIM, CFG scale: 7, Seed: 1172526038, Size: 704x704, Model hash: 4bdfc29c Steps: 20, Sampler: DDIM, CFG scale: 7, Seed: 54971126, Size: 704x704, Model hash: 4bdfc29c Steps: 20, Sampler: DDIM, CFG scale: 7, Seed: 753277160, Size: 704x704, Model hash: 4bdfc29c Steps: 20, Sampler: DDIM, CFG scale: 7, Seed: 1022054214, Size: 704x704, Model hash: 4bdfc29c

+2 more

@vcckvv

aiArt - microworld_PublicPrompts.ckpt模組測試 「aiArt」 本次主題:microworld_PublicPrompts.ckpt模組測試 microworld_PublicPrompts.ckpt下載連結: https://huggingface.co/db0/microworlds/resolve/main/microworld_PublicPrompts.ckpt 這次測試的模組的特色就是專門生成方塊狀的土地,然後下方通常會加一串文字,測試的時候覺得這個模組品質不算很好,好像有些常見咒文不太能正確地起作用,不過張家界(zhangjiajie)倒是意外地能表現出來 使用的咒文和參數: square microworlds,3D isometric view, floating island, (extremely detailed CG unity 8k wallpaper),(((masterpiece))),(((best quality))),highres,((an extremely delicate and beautiful)),(best illustration),(best shadow),(beautiful light and shadow), ******** Negative prompt: (photo),(photograph),(realistic), cropped,out of frame,worst quality,low quality,normal quality,jpeg artifacts,lowres,(blurry),(vague),ugly,poor drawing,poor painting,amateur, bad,weird,distorted,malformed,broken,error,wrong,dirty,unclean, poor drawing picture,poor drawing line, dirty drawing,dirty painting,dirty drawing line, unclean drawing,unclean painting,unclean drawing line, ******** Steps: 20, Sampler: DDIM, CFG scale: 10, Seed: 994105897, Size: 704x704, Model hash: a2a802b2 ------------------------------------------------ miniature square microworlds,3D isometric view, castle, (extremely detailed CG unity 8k wallpaper),(((masterpiece))),(((best quality))),highres,((an extremely delicate and beautiful)),(best illustration), ******** Negative prompt: (photo),(photograph),(realistic), cropped,out of frame,worst quality,low quality,normal quality,jpeg artifacts,lowres,(blurry),(vague),ugly,poor drawing,poor painting,amateur, background, bad,weird,distorted,malformed,broken,error,wrong,dirty,unclean, poor drawing picture,poor drawing line, dirty drawing,dirty painting,dirty drawing line, unclean drawing,unclean painting,unclean drawing line, ******** Steps: 20, Sampler: DDIM, CFG scale: 7, Seed: 994105897, Size: 704x704, Model hash: a2a802b2 ------------------------------------------------ miniature square microworlds,3D isometric view, zhangjiajie, (((best quality))),highres,((an extremely delicate and beautiful)),(best illustration), ******** Negative prompt: (photo),(photograph),(realistic), cropped,out of frame,worst quality,low quality,normal quality,jpeg artifacts,lowres,(blurry),(vague),ugly,poor drawing,poor painting,amateur, background, bad,weird,distorted,malformed,broken,error,wrong,dirty,unclean, poor drawing picture,poor drawing line, dirty drawing,dirty painting,dirty drawing line, unclean drawing,unclean painting,unclean drawing line, ******** Steps: 20, Sampler: DDIM, CFG scale: 7, Seed: 1945206683, Size: 704x704, Model hash: a2a802b2, Variation seed: 1120943799, Variation seed strength: 0.27 ------------------------------------------------ miniature square microworlds,3D isometric view, live volcano,lava, (((best quality))),highres,((an extremely delicate and beautiful)),(best illustration), ******** Negative prompt: (photo),(photograph),(realistic), cropped,out of frame,worst quality,low quality,normal quality,jpeg artifacts,lowres,(blurry),(vague),ugly,poor drawing,poor painting,amateur, background, bad,weird,distorted,malformed,broken,error,wrong,dirty,unclean, poor drawing picture,poor drawing line, dirty drawing,dirty painting,dirty drawing line, unclean drawing,unclean painting,unclean drawing line, ******** Steps: 20, Sampler: DDIM, CFG scale: 7, Seed: 978044477, Size: 704x704, Model hash: a2a802b2 ------------------------------------------------ miniature square microworlds,3D isometric view, japan shrine, (((best quality))),highres,((an extremely delicate and beautiful)),(best illustration), ******** Negative prompt: (photo),(photograph),(realistic), cropped,out of frame,worst quality,low quality,normal quality,jpeg artifacts,lowres,(blurry),(vague),ugly,poor drawing,poor painting,amateur, bad,weird,distorted,malformed,broken,error,wrong,dirty,unclean, poor drawing picture,poor drawing line, dirty drawing,dirty painting,dirty drawing line, unclean drawing,unclean painting,unclean drawing line, ******** Steps: 20, Sampler: DDIM, CFG scale: 7, Seed: 3577949912, Size: 704x704, Model hash: a2a802b2

+2 more

@vcckvv

aiArt - 和服、線稿風格 「aiArt」 本次主題:和服、線稿風格 圖一~圖四是在嘗試線稿風格時出現一些不錯的圖,所以特地保留了下來,圖五終於試出了線稿風格,不過還是有些彩色的部份,想要用Anything-V3.0插畫風格模組弄出純線稿可能還是太硬要了,比較好的做法應該是另外訓練模組 使用的咒文和參數: lineart,girl wearing kimono,black white,blank background, ******** Negative prompt: (photo),(photograph),(realistic), cropped,out of frame,worst quality,low quality,normal quality,jpeg artifacts,lowres,(blurry),(vague),ugly,poor drawing,poor painting, dysmelia,polydactyly,polymelia,oligodactyly,amelia,conjoined twins, long glabella,big eye and small eye,long neck, poor drawing,poor drawing body,poor drawing face,poor drawing head,poor drawing eye, poor drawing eyebrow,poor drawing chin,(poor drawing hand),poor drawing arm,(poor drawing finger),poor drawing leg, poor drawing posture,poor drawing anatomy,poor drawing picture,poor drawing line,poor drawing clothing, distorted,distorted body,distorted face,distorted head,distorted eye, distorted eyebrow,distorted chin,(distorted hand),distorted arm,(distorted finger),distorted leg, distorted posture,distorted anatomy,distorted drawing, distorted painting, distorted picture, malformed,malformed body,malformed face,malformed head,(malformed hand),malformed arm,(malformed finger), malformed leg,malformed posture,malformed anatomy, broken,broken face,broken head,broken eye,broken hand,broken arm,broken finger,broken leg, bad,bad body,bad face,bad head,bad eye,bad eyebrow,bad chin,(bad hand),bad arm,(bad finger),bad leg, bad hair,bad clothing,bad sock,bad shoe,bad posture,bad anatomy,bad proportion,bad drawing, bad painting, bad picture, weird,weird face,weird head,weird eye,weird eyebrow,weird chin,(weird hand),weird arm,(weird finger),weird leg, weird shoe,weird hair,weird clothing,weird sock,weird shoe,weird posture,weird anatomy,weird drawing, weird painting, weird picture, error,error drawing,error drawing line,error drawing face,error drawing head,error drawing eye,error drawing eyebrow,error drawing hand,error drawing arm,error drawing finger,error drawing leg,error drawing body,error drawing posture,error drawing anatomy,error drawing clothing, error posture,error anatomy, wrong,wrong drawing,wrong drawing line,wrong drawing face,wrong drawing head,wrong drawing eye,wrong drawing eyebrow,wrong drawing hand,wrong drawing arm,wrong drawing finger,wrong drawing leg,wrong drawing body,wrong drawing posture,wrong drawing anatomy,wrong drawing clothing, wrong posture,wrong anatomy, blurry,blurry face,blurry eye,blurry eyebrow,blurry head,blurry hand,blurry arm,blurry finger,blurry leg,blurry clothing, vague,vague face,vague eye,vague eyebrow,vague head,vague hand,vague arm,vague finger,vague leg,vague clothing, liquid face,liquid mouth, missing,(missing hand),missing arm,(missing finger) ,missing leg,missing mouth, (invisible hand),invisible arm,(invisible finger),invisible leg, (unsighted hand),unsighted arm,(unsighted finger),unsighted leg, mutated,(mutated hand), mutated arm,(mutated finger), mutated leg, too much,too much eyebrow,(too much hand),too much arm,(too much finger),too much leg, too long,too long arm,too long leg,too long neck, too short,too short arm,too short leg, small face,small head,small eye,small hand, small arm, small finger, small leg, big face,big head,big eye,big hand, big arm, big finger, big leg, dirty,dirty face,dirty drawing,dirty painting,dirty drawing line, unclean,unclean drawing,unclean painting,unclean drawing line,unclean drawing face,unclean drawing head,unclean drawing eye,unclean drawing eyebrow,unclean drawing hand,unclean drawing arm,unclean drawing finger,unclean drawing leg,unclean drawing body,unclean drawing clothing, unclean face,unclean eye,unclean eyebrow,unclean hand,unclean arm,unclean finger,unclean leg,unclean clothing, ******** Steps: 20, Sampler: DDIM, CFG scale: 7, Seed: 1821182798, Size: 832x512, Model hash: 2700c435 ----------------------------------------------------- lineart,girl wearing kimono, ******** Negative prompt: (photo),(photograph),(realistic), cropped,out of frame,worst quality,low quality,normal quality,jpeg artifacts,lowres,(blurry),(vague),ugly,poor drawing,poor painting,amateur, dysmelia,polydactyly,polymelia,oligodactyly,amelia,conjoined twins, long glabella,big eye and small eye,long neck, poor drawing,poor drawing body,poor drawing face,poor drawing head,poor drawing eye, poor drawing eyebrow,poor drawing chin,(poor drawing hand),poor drawing arm,(poor drawing finger),poor drawing leg, poor drawing posture,poor drawing anatomy,poor drawing picture,poor drawing line,poor drawing clothing, distorted,distorted body,distorted face,distorted head,distorted eye, distorted eyebrow,distorted chin,(distorted hand),distorted arm,(distorted finger),distorted leg, distorted posture,distorted anatomy,distorted drawing, distorted painting, distorted picture, malformed,malformed body,malformed face,malformed head,(malformed hand),malformed arm,(malformed finger), malformed leg,malformed posture,malformed anatomy, broken,broken face,broken head,broken eye,broken hand,broken arm,broken finger,broken leg, bad,bad body,bad face,bad head,bad eye,bad eyebrow,bad chin,(bad hand),bad arm,(bad finger),bad leg, bad hair,bad clothing,bad sock,bad shoe,bad posture,bad anatomy,bad proportion,bad drawing, bad painting, bad picture, weird,weird face,weird head,weird eye,weird eyebrow,weird chin,(weird hand),weird arm,(weird finger),weird leg, weird shoe,weird hair,weird clothing,weird sock,weird shoe,weird posture,weird anatomy,weird drawing, weird painting, weird picture, error,error drawing,error drawing line,error drawing face,error drawing head,error drawing eye,error drawing eyebrow,error drawing hand,error drawing arm,error drawing finger,error drawing leg,error drawing body,error drawing posture,error drawing anatomy,error drawing clothing, error posture,error anatomy, wrong,wrong drawing,wrong drawing line,wrong drawing face,wrong drawing head,wrong drawing eye,wrong drawing eyebrow,wrong drawing hand,wrong drawing arm,wrong drawing finger,wrong drawing leg,wrong drawing body,wrong drawing posture,wrong drawing anatomy,wrong drawing clothing, wrong posture,wrong anatomy, blurry,blurry face,blurry eye,blurry eyebrow,blurry head,blurry hand,blurry arm,blurry finger,blurry leg,blurry clothing, vague,vague face,vague eye,vague eyebrow,vague head,vague hand,vague arm,vague finger,vague leg,vague clothing, liquid face,liquid mouth, missing,(missing hand),missing arm,(missing finger) ,missing leg,missing mouth, (invisible hand),invisible arm,(invisible finger),invisible leg, (unsighted hand),unsighted arm,(unsighted finger),unsighted leg, mutated,(mutated hand), mutated arm,(mutated finger), mutated leg, too much,too much eyebrow,(too much hand),too much arm,(too much finger),too much leg, too long,too long arm,too long leg,too long neck, too short,too short arm,too short leg, small face,small head,small eye,small hand, small arm, small finger, small leg, big face,big head,big eye,big hand, big arm, big finger, big leg, dirty,dirty face,dirty drawing,dirty painting,dirty drawing line, unclean,unclean drawing,unclean painting,unclean drawing line,unclean drawing face,unclean drawing head,unclean drawing eye,unclean drawing eyebrow,unclean drawing hand,unclean drawing arm,unclean drawing finger,unclean drawing leg,unclean drawing body,unclean drawing clothing, unclean face,unclean eye,unclean eyebrow,unclean hand,unclean arm,unclean finger,unclean leg,unclean clothing, ******** Steps: 20, Sampler: DDIM, CFG scale: 7, Seed: 2979608978, Size: 832x512, Model hash: 2700c435 ------------------------------------------------ black and white lineart,girl wearing kimono,blank background, ******** Negative prompt: (photo),(photograph),(realistic), cropped,out of frame,worst quality,low quality,normal quality,jpeg artifacts,lowres,(blurry),(vague),ugly,poor drawing,poor painting, color, dysmelia,polydactyly,polymelia,oligodactyly,amelia,conjoined twins, long glabella,big eye and small eye,long neck, poor drawing,poor drawing body,poor drawing face,poor drawing head,poor drawing eye, poor drawing eyebrow,poor drawing chin,(poor drawing hand),poor drawing arm,(poor drawing finger),poor drawing leg, poor drawing posture,poor drawing anatomy,poor drawing picture,poor drawing line,poor drawing clothing, distorted,distorted body,distorted face,distorted head,distorted eye, distorted eyebrow,distorted chin,(distorted hand),distorted arm,(distorted finger),distorted leg, distorted posture,distorted anatomy,distorted drawing, distorted painting, distorted picture, malformed,malformed body,malformed face,malformed head,(malformed hand),malformed arm,(malformed finger), malformed leg,malformed posture,malformed anatomy, broken,broken face,broken head,broken eye,broken hand,broken arm,broken finger,broken leg, bad,bad body,bad face,bad head,bad eye,bad eyebrow,bad chin,(bad hand),bad arm,(bad finger),bad leg, bad hair,bad clothing,bad sock,bad shoe,bad posture,bad anatomy,bad proportion,bad drawing, bad painting, bad picture, weird,weird face,weird head,weird eye,weird eyebrow,weird chin,(weird hand),weird arm,(weird finger),weird leg, weird shoe,weird hair,weird clothing,weird sock,weird shoe,weird posture,weird anatomy,weird drawing, weird painting, weird picture, error,error drawing,error drawing line,error drawing face,error drawing head,error drawing eye,error drawing eyebrow,error drawing hand,error drawing arm,error drawing finger,error drawing leg,error drawing body,error drawing posture,error drawing anatomy,error drawing clothing, error posture,error anatomy, wrong,wrong drawing,wrong drawing line,wrong drawing face,wrong drawing head,wrong drawing eye,wrong drawing eyebrow,wrong drawing hand,wrong drawing arm,wrong drawing finger,wrong drawing leg,wrong drawing body,wrong drawing posture,wrong drawing anatomy,wrong drawing clothing, wrong posture,wrong anatomy, blurry,blurry face,blurry eye,blurry eyebrow,blurry head,blurry hand,blurry arm,blurry finger,blurry leg,blurry clothing, vague,vague face,vague eye,vague eyebrow,vague head,vague hand,vague arm,vague finger,vague leg,vague clothing, liquid face,liquid mouth, missing,(missing hand),missing arm,(missing finger) ,missing leg,missing mouth, (invisible hand),invisible arm,(invisible finger),invisible leg, (unsighted hand),unsighted arm,(unsighted finger),unsighted leg, mutated,(mutated hand), mutated arm,(mutated finger), mutated leg, too much,too much eyebrow,(too much hand),too much arm,(too much finger),too much leg, too long,too long arm,too long leg,too long neck, too short,too short arm,too short leg, small face,small head,small eye,small hand, small arm, small finger, small leg, big face,big head,big eye,big hand, big arm, big finger, big leg, dirty,dirty face,dirty drawing,dirty painting,dirty drawing line, unclean,unclean drawing,unclean painting,unclean drawing line,unclean drawing face,unclean drawing head,unclean drawing eye,unclean drawing eyebrow,unclean drawing hand,unclean drawing arm,unclean drawing finger,unclean drawing leg,unclean drawing body,unclean drawing clothing, unclean face,unclean eye,unclean eyebrow,unclean hand,unclean arm,unclean finger,unclean leg,unclean clothing, ******** Steps: 20, Sampler: DDIM, CFG scale: 7, Seed: 3864354067, Size: 832x512, Model hash: 2700c435 ------------------------------------------------ (black and white :1.5),girl wearing kimono,blank background, ******** Negative prompt: (photo),(photograph),(realistic), cropped,out of frame,worst quality,low quality,normal quality,jpeg artifacts,lowres,(blurry),(vague),ugly,poor drawing,poor painting, color, dysmelia,polydactyly,polymelia,oligodactyly,amelia,conjoined twins, long glabella,big eye and small eye,long neck, poor drawing,poor drawing body,poor drawing face,poor drawing head,poor drawing eye, poor drawing eyebrow,poor drawing chin,(poor drawing hand),poor drawing arm,(poor drawing finger),poor drawing leg, poor drawing posture,poor drawing anatomy,poor drawing picture,poor drawing line,poor drawing clothing, distorted,distorted body,distorted face,distorted head,distorted eye, distorted eyebrow,distorted chin,(distorted hand),distorted arm,(distorted finger),distorted leg, distorted posture,distorted anatomy,distorted drawing, distorted painting, distorted picture, malformed,malformed body,malformed face,malformed head,(malformed hand),malformed arm,(malformed finger), malformed leg,malformed posture,malformed anatomy, broken,broken face,broken head,broken eye,broken hand,broken arm,broken finger,broken leg, bad,bad body,bad face,bad head,bad eye,bad eyebrow,bad chin,(bad hand),bad arm,(bad finger),bad leg, bad hair,bad clothing,bad sock,bad shoe,bad posture,bad anatomy,bad proportion,bad drawing, bad painting, bad picture, weird,weird face,weird head,weird eye,weird eyebrow,weird chin,(weird hand),weird arm,(weird finger),weird leg, weird shoe,weird hair,weird clothing,weird sock,weird shoe,weird posture,weird anatomy,weird drawing, weird painting, weird picture, error,error drawing,error drawing line,error drawing face,error drawing head,error drawing eye,error drawing eyebrow,error drawing hand,error drawing arm,error drawing finger,error drawing leg,error drawing body,error drawing posture,error drawing anatomy,error drawing clothing, error posture,error anatomy, wrong,wrong drawing,wrong drawing line,wrong drawing face,wrong drawing head,wrong drawing eye,wrong drawing eyebrow,wrong drawing hand,wrong drawing arm,wrong drawing finger,wrong drawing leg,wrong drawing body,wrong drawing posture,wrong drawing anatomy,wrong drawing clothing, wrong posture,wrong anatomy, blurry,blurry face,blurry eye,blurry eyebrow,blurry head,blurry hand,blurry arm,blurry finger,blurry leg,blurry clothing, vague,vague face,vague eye,vague eyebrow,vague head,vague hand,vague arm,vague finger,vague leg,vague clothing, liquid face,liquid mouth, missing,(missing hand),missing arm,(missing finger) ,missing leg,missing mouth, (invisible hand),invisible arm,(invisible finger),invisible leg, (unsighted hand),unsighted arm,(unsighted finger),unsighted leg, mutated,(mutated hand), mutated arm,(mutated finger), mutated leg, too much,too much eyebrow,(too much hand),too much arm,(too much finger),too much leg, too long,too long arm,too long leg,too long neck, too short,too short arm,too short leg, small face,small head,small eye,small hand, small arm, small finger, small leg, big face,big head,big eye,big hand, big arm, big finger, big leg, dirty,dirty face,dirty drawing,dirty painting,dirty drawing line, unclean,unclean drawing,unclean painting,unclean drawing line,unclean drawing face,unclean drawing head,unclean drawing eye,unclean drawing eyebrow,unclean drawing hand,unclean drawing arm,unclean drawing finger,unclean drawing leg,unclean drawing body,unclean drawing clothing, unclean face,unclean eye,unclean eyebrow,unclean hand,unclean arm,unclean finger,unclean leg,unclean clothing, ******** Steps: 20, Sampler: DDIM, CFG scale: 7, Seed: 821818514, Size: 832x512, Model hash: 2700c435 ------------------------------------------------ (coloring book:1.4) ,girl wearing kimono,blank background, ******** Negative prompt: (photo),(photograph),(realistic), cropped,out of frame,worst quality,low quality,normal quality,jpeg artifacts,lowres,(blurry),(vague),ugly,poor drawing,poor painting, color painting, dysmelia,polydactyly,polymelia,oligodactyly,amelia,conjoined twins, long glabella,big eye and small eye,long neck, poor drawing,poor drawing body,poor drawing face,poor drawing head,poor drawing eye, poor drawing eyebrow,poor drawing chin,(poor drawing hand),poor drawing arm,(poor drawing finger),poor drawing leg, poor drawing posture,poor drawing anatomy,poor drawing picture,poor drawing line,poor drawing clothing, distorted,distorted body,distorted face,distorted head,distorted eye, distorted eyebrow,distorted chin,(distorted hand),distorted arm,(distorted finger),distorted leg, distorted posture,distorted anatomy,distorted drawing, distorted painting, distorted picture, malformed,malformed body,malformed face,malformed head,(malformed hand),malformed arm,(malformed finger), malformed leg,malformed posture,malformed anatomy, broken,broken face,broken head,broken eye,broken hand,broken arm,broken finger,broken leg, bad,bad body,bad face,bad head,bad eye,bad eyebrow,bad chin,(bad hand),bad arm,(bad finger),bad leg, bad hair,bad clothing,bad sock,bad shoe,bad posture,bad anatomy,bad proportion,bad drawing, bad painting, bad picture, weird,weird face,weird head,weird eye,weird eyebrow,weird chin,(weird hand),weird arm,(weird finger),weird leg, weird shoe,weird hair,weird clothing,weird sock,weird shoe,weird posture,weird anatomy,weird drawing, weird painting, weird picture, error,error drawing,error drawing line,error drawing face,error drawing head,error drawing eye,error drawing eyebrow,error drawing hand,error drawing arm,error drawing finger,error drawing leg,error drawing body,error drawing posture,error drawing anatomy,error drawing clothing, error posture,error anatomy, wrong,wrong drawing,wrong drawing line,wrong drawing face,wrong drawing head,wrong drawing eye,wrong drawing eyebrow,wrong drawing hand,wrong drawing arm,wrong drawing finger,wrong drawing leg,wrong drawing body,wrong drawing posture,wrong drawing anatomy,wrong drawing clothing, wrong posture,wrong anatomy, blurry,blurry face,blurry eye,blurry eyebrow,blurry head,blurry hand,blurry arm,blurry finger,blurry leg,blurry clothing, vague,vague face,vague eye,vague eyebrow,vague head,vague hand,vague arm,vague finger,vague leg,vague clothing, liquid face,liquid mouth, missing,(missing hand),missing arm,(missing finger) ,missing leg,missing mouth, (invisible hand),invisible arm,(invisible finger),invisible leg, (unsighted hand),unsighted arm,(unsighted finger),unsighted leg, mutated,(mutated hand), mutated arm,(mutated finger), mutated leg, too much,too much eyebrow,(too much hand),too much arm,(too much finger),too much leg, too long,too long arm,too long leg,too long neck, too short,too short arm,too short leg, small face,small head,small eye,small hand, small arm, small finger, small leg, big face,big head,big eye,big hand, big arm, big finger, big leg, dirty,dirty face,dirty drawing,dirty painting,dirty drawing line, unclean,unclean drawing,unclean painting,unclean drawing line,unclean drawing face,unclean drawing head,unclean drawing eye,unclean drawing eyebrow,unclean drawing hand,unclean drawing arm,unclean drawing finger,unclean drawing leg,unclean drawing body,unclean drawing clothing, unclean face,unclean eye,unclean eyebrow,unclean hand,unclean arm,unclean finger,unclean leg,unclean clothing, ******** Steps: 20, Sampler: DDIM, CFG scale: 7, Seed: 609553722, Size: 832x512, Model hash: 2700c435

+2 more

@vcckvv

aiArt - 星空墜落 「aiArt」 本次主題:星空墜落 參考自元素法典第一卷的墜落法,雖然咒文基本上都是自己弄出來的 圖一是花費最多功夫弄的,先是縮小出圖尺寸做出適當的構圖,之後再用img2img才產生出夠好的原圖,後續再用SD upscale放大把各個細節進行inpainting或手繪修正:https://i.imgur.com/LQJmLMe.png 圖二嘗試了較長的直向構圖,與其說是墜落,不如說是飄浮在夜空中 圖三是從外太空墜落到地球的樣子 圖四最有意外墜落的感覺 圖五是比較接近地面的墜落 使用的咒文和參數為: (extremely detailed CG unity 8k wallpaper),(((masterpiece))),(((best quality))),highres,((ultra-detailed)),((an extremely delicate and beautiful)),(best illustration),(best shadow),(beautiful light and shadow), overlook view, (girl falling down in the sky helplessly:1.5),full body, (flowing tear water from eyes:1.3) ,helpless crying face, ,face towards the sky,floating,beautiful detailed cloudy sky,sunset,meteor,glinting stars,starry sky,Milky Way,star river,constellation,firefly,light particles exploding,small floating feathers,holding birdcage,bubble, dynamic angle,looking out to vast green field, ******** Negative prompt: (photo),(photograph),(realistic), cropped,out of frame,worst quality,low quality,normal quality,jpeg artifacts,lowres,(blurry),(vague),ugly,poor drawing,poor painting,amateur, blush, dysmelia,polydactyly,polymelia,oligodactyly,amelia,conjoined twins, long glabella,big eye and small eye,long neck, poor drawing,poor drawing body,poor drawing face,poor drawing head,poor drawing eye, poor drawing eyebrow,poor drawing chin,(poor drawing hand),poor drawing arm,(poor drawing finger),poor drawing leg, poor drawing posture,poor drawing anatomy,poor drawing picture,poor drawing line,poor drawing clothing, distorted,distorted body,distorted face,distorted head,distorted eye, distorted eyebrow,distorted chin,(distorted hand),distorted arm,(distorted finger),distorted leg, distorted posture,distorted anatomy,distorted drawing, distorted painting, distorted picture, malformed,malformed body,malformed face,malformed head,(malformed hand),malformed arm,(malformed finger), malformed leg,malformed posture,malformed anatomy, broken,broken face,broken head,broken eye,broken hand,broken arm,broken finger,broken leg, bad,bad body,bad face,bad head,bad eye,bad eyebrow,bad chin,(bad hand),bad arm,(bad finger),bad leg, bad hair,bad clothing,bad sock,bad shoe,bad posture,bad anatomy,bad proportion,bad drawing, bad painting, bad picture, weird,weird face,weird head,weird eye,weird eyebrow,weird chin,(weird hand),weird arm,(weird finger),weird leg, weird shoe,weird hair,weird clothing,weird sock,weird shoe,weird posture,weird anatomy,weird drawing, weird painting, weird picture, error,error drawing,error drawing line,error drawing face,error drawing head,error drawing eye,error drawing eyebrow,error drawing hand,error drawing arm,error drawing finger,error drawing leg,error drawing body,error drawing posture,error drawing anatomy,error drawing clothing, error posture,error anatomy, wrong,wrong drawing,wrong drawing line,wrong drawing face,wrong drawing head,wrong drawing eye,wrong drawing eyebrow,wrong drawing hand,wrong drawing arm,wrong drawing finger,wrong drawing leg,wrong drawing body,wrong drawing posture,wrong drawing anatomy,wrong drawing clothing, wrong posture,wrong anatomy, blurry,blurry face,blurry eye,blurry eyebrow,blurry head,blurry hand,blurry arm,blurry finger,blurry leg,blurry clothing, vague,vague face,vague eye,vague eyebrow,vague head,vague hand,vague arm,vague finger,vague leg,vague clothing, liquid face,liquid mouth, missing,(missing hand),missing arm,(missing finger) ,missing leg,missing mouth, (invisible hand),invisible arm,(invisible finger),invisible leg, (unsighted hand),unsighted arm,(unsighted finger),unsighted leg, mutated,(mutated hand), mutated arm,(mutated finger), mutated leg, too much,too much eyebrow,(too much hand),too much arm,(too much finger),too much leg, too long,too long arm,too long leg,too long neck, too short,too short arm,too short leg, small face,small head,small eye,small hand, small arm, small finger, small leg, big face,big head,big eye,big hand, big arm, big finger, big leg, dirty,dirty face,dirty drawing,dirty painting,dirty drawing line, unclean,unclean drawing,unclean painting,unclean drawing line,unclean drawing face,unclean drawing head,unclean drawing eye,unclean drawing eyebrow,unclean drawing hand,unclean drawing arm,unclean drawing finger,unclean drawing leg,unclean drawing body,unclean drawing clothing, unclean face,unclean eye,unclean eyebrow,unclean hand,unclean arm,unclean finger,unclean leg,unclean clothing, ******** Steps: 20, Sampler: DDIM, CFG scale: 7, Seed: 3903757314, Size: 432x256, Model hash: 2700c435, Variation seed: 4148663751, Variation seed strength: 0.12 ******* 第二步img2img的咒文參數: (extremely detailed CG unity 8k wallpaper),(((masterpiece))),(((best quality))),highres,((ultra-detailed)),((an extremely delicate and beautiful)),(best illustration),(best shadow),(beautiful light and shadow), overlook view, (girl falling down in the sky helplessly),full body, (flowing tear water from eyes:1.3) ,helpless crying face, ,face towards the sky,floating,beautiful detailed cloudy sky,sunset,meteor,glinting stars,starry sky,Milky Way,star river,constellation,firefly,light particles exploding,small floating feathers,(holding birdcage),bubble, dynamic angle,(viewer looking out to vast cloudy ground), ******* Negative prompt: (photo),(photograph),(realistic), cropped,out of frame,worst quality,low quality,normal quality,jpeg artifacts,lowres,(blurry),(vague),ugly,poor drawing,poor painting,amateur, blush, dysmelia,polydactyly,polymelia,oligodactyly,amelia,conjoined twins, long glabella,big eye and small eye,long neck, poor drawing,poor drawing body,poor drawing face,poor drawing head,poor drawing eye, poor drawing eyebrow,poor drawing chin,(poor drawing hand),poor drawing arm,(poor drawing finger),poor drawing leg, poor drawing posture,poor drawing anatomy,poor drawing picture,poor drawing line,poor drawing clothing, distorted,distorted body,distorted face,distorted head,distorted eye, distorted eyebrow,distorted chin,(distorted hand),distorted arm,(distorted finger),distorted leg, distorted posture,distorted anatomy,distorted drawing, distorted painting, distorted picture, malformed,malformed body,malformed face,malformed head,(malformed hand),malformed arm,(malformed finger), malformed leg,malformed posture,malformed anatomy, broken,broken face,broken head,broken eye,broken hand,broken arm,broken finger,broken leg, bad,bad body,bad face,bad head,bad eye,bad eyebrow,bad chin,(bad hand),bad arm,(bad finger),bad leg, bad hair,bad clothing,bad sock,bad shoe,bad posture,bad anatomy,bad proportion,bad drawing, bad painting, bad picture, weird,weird face,weird head,weird eye,weird eyebrow,weird chin,(weird hand),weird arm,(weird finger),weird leg, weird shoe,weird hair,weird clothing,weird sock,weird shoe,weird posture,weird anatomy,weird drawing, weird painting, weird picture, error,error drawing,error drawing line,error drawing face,error drawing head,error drawing eye,error drawing eyebrow,error drawing hand,error drawing arm,error drawing finger,error drawing leg,error drawing body,error drawing posture,error drawing anatomy,error drawing clothing, error posture,error anatomy, wrong,wrong drawing,wrong drawing line,wrong drawing face,wrong drawing head,wrong drawing eye,wrong drawing eyebrow,wrong drawing hand,wrong drawing arm,wrong drawing finger,wrong drawing leg,wrong drawing body,wrong drawing posture,wrong drawing anatomy,wrong drawing clothing, wrong posture,wrong anatomy, blurry,blurry face,blurry eye,blurry eyebrow,blurry head,blurry hand,blurry arm,blurry finger,blurry leg,blurry clothing, vague,vague face,vague eye,vague eyebrow,vague head,vague hand,vague arm,vague finger,vague leg,vague clothing, liquid face,liquid mouth, missing,(missing hand),missing arm,(missing finger) ,missing leg,missing mouth, (invisible hand),invisible arm,(invisible finger),invisible leg, (unsighted hand),unsighted arm,(unsighted finger),unsighted leg, mutated,(mutated hand), mutated arm,(mutated finger), mutated leg, too much,too much eyebrow,(too much hand),too much arm,(too much finger),too much leg, too long,too long arm,too long leg,too long neck, too short,too short arm,too short leg, small face,small head,small eye,small hand, small arm, small finger, small leg, big face,big head,big eye,big hand, big arm, big finger, big leg, dirty,dirty face,dirty drawing,dirty painting,dirty drawing line, unclean,unclean drawing,unclean painting,unclean drawing line,unclean drawing face,unclean drawing head,unclean drawing eye,unclean drawing eyebrow,unclean drawing hand,unclean drawing arm,unclean drawing finger,unclean drawing leg,unclean drawing body,unclean drawing clothing, unclean face,unclean eye,unclean eyebrow,unclean hand,unclean arm,unclean finger,unclean leg,unclean clothing, ******* Steps: 30, Sampler: DDIM, CFG scale: 7, Seed: 2307025818, Size: 864x512, Model hash: 2700c435, Variation seed: 1799395844, Variation seed strength: 1, Denoising strength: 1, Mask blur: 4 ------------------------------------------------ (extremely detailed CG unity 8k wallpaper),(((masterpiece))),(((best quality))),highres,((ultra-detailed)),((an extremely delicate and beautiful)),(best illustration),(best shadow),(beautiful light and shadow), girl falling from the sky,full body, tear,crying ,face towards the sky,floating,beautiful detailed cloudy sky,sunset,meteor,glinting stars,starry sky,Milky Way,star river,constellation,firefly,light particles exploding, dynamic angle,looking out to vast earth, ************* Negative prompt: (photo),(photograph),(realistic), cropped,out of frame,worst quality,low quality,normal quality,jpeg artifacts,lowres,(blurry),(vague),ugly,poor drawing,poor painting,amateur, splash, dysmelia,polydactyly,polymelia,oligodactyly,amelia,conjoined twins, long glabella,big eye and small eye,long neck, poor drawing,poor drawing body,poor drawing face,poor drawing head,poor drawing eye, poor drawing eyebrow,poor drawing chin,(poor drawing hand),poor drawing arm,(poor drawing finger),poor drawing leg, poor drawing posture,poor drawing anatomy,poor drawing picture,poor drawing line,poor drawing clothing, distorted,distorted body,distorted face,distorted head,distorted eye, distorted eyebrow,distorted chin,(distorted hand),distorted arm,(distorted finger),distorted leg, distorted posture,distorted anatomy,distorted drawing, distorted painting, distorted picture, malformed,malformed body,malformed face,malformed head,(malformed hand),malformed arm,(malformed finger), malformed leg,malformed posture,malformed anatomy, broken,broken face,broken head,broken eye,broken hand,broken arm,broken finger,broken leg, bad,bad body,bad face,bad head,bad eye,bad eyebrow,bad chin,(bad hand),bad arm,(bad finger),bad leg, bad hair,bad clothing,bad sock,bad shoe,bad posture,bad anatomy,bad proportion,bad drawing, bad painting, bad picture, weird,weird face,weird head,weird eye,weird eyebrow,weird chin,(weird hand),weird arm,(weird finger),weird leg, weird shoe,weird hair,weird clothing,weird sock,weird shoe,weird posture,weird anatomy,weird drawing, weird painting, weird picture, error,error drawing,error drawing line,error drawing face,error drawing head,error drawing eye,error drawing eyebrow,error drawing hand,error drawing arm,error drawing finger,error drawing leg,error drawing body,error drawing posture,error drawing anatomy,error drawing clothing, error posture,error anatomy, wrong,wrong drawing,wrong drawing line,wrong drawing face,wrong drawing head,wrong drawing eye,wrong drawing eyebrow,wrong drawing hand,wrong drawing arm,wrong drawing finger,wrong drawing leg,wrong drawing body,wrong drawing posture,wrong drawing anatomy,wrong drawing clothing, wrong posture,wrong anatomy, blurry,blurry face,blurry eye,blurry eyebrow,blurry head,blurry hand,blurry arm,blurry finger,blurry leg,blurry clothing, vague,vague face,vague eye,vague eyebrow,vague head,vague hand,vague arm,vague finger,vague leg,vague clothing, liquid face,liquid mouth, missing,(missing hand),missing arm,(missing finger) ,missing leg,missing mouth, (invisible hand),invisible arm,(invisible finger),invisible leg, (unsighted hand),unsighted arm,(unsighted finger),unsighted leg, mutated,(mutated hand), mutated arm,(mutated finger), mutated leg, too much,too much eyebrow,(too much hand),too much arm,(too much finger),too much leg, too long,too long arm,too long leg,too long neck, too short,too short arm,too short leg, small face,small head,small eye,small hand, small arm, small finger, small leg, big face,big head,big eye,big hand, big arm, big finger, big leg, dirty,dirty face,dirty drawing,dirty painting,dirty drawing line, unclean,unclean drawing,unclean painting,unclean drawing line,unclean drawing face,unclean drawing head,unclean drawing eye,unclean drawing eyebrow,unclean drawing hand,unclean drawing arm,unclean drawing finger,unclean drawing leg,unclean drawing body,unclean drawing clothing, unclean face,unclean eye,unclean eyebrow,unclean hand,unclean arm,unclean finger,unclean leg,unclean clothing, ************* Steps: 20, Sampler: DDIM, CFG scale: 7, Seed: 713905291, Size: 512x1024, Model hash: 2700c435 ------------------------------------------------ (extremely detailed CG unity 8k wallpaper),(((masterpiece))),(((best quality))),highres,((ultra-detailed)),((an extremely delicate and beautiful)),(best illustration),(best shadow),(beautiful light and shadow), girl falling from the sky,full body, shed tears ,blank stare, ,face towards the sky,floating,beautiful detailed cloudy sky,sunset,meteor,glinting stars,starry sky,Milky Way,star river,constellation,firefly,light particles exploding, dynamic angle,looking out to vast earth, ************* Negative prompt: (photo),(photograph),(realistic), cropped,out of frame,worst quality,low quality,normal quality,jpeg artifacts,lowres,(blurry),(vague),ugly,poor drawing,poor painting,amateur, dysmelia,polydactyly,polymelia,oligodactyly,amelia,conjoined twins, long glabella,big eye and small eye,long neck, poor drawing,poor drawing body,poor drawing face,poor drawing head,poor drawing eye, poor drawing eyebrow,poor drawing chin,(poor drawing hand),poor drawing arm,(poor drawing finger),poor drawing leg, poor drawing posture,poor drawing anatomy,poor drawing picture,poor drawing line,poor drawing clothing, distorted,distorted body,distorted face,distorted head,distorted eye, distorted eyebrow,distorted chin,(distorted hand),distorted arm,(distorted finger),distorted leg, distorted posture,distorted anatomy,distorted drawing, distorted painting, distorted picture, malformed,malformed body,malformed face,malformed head,(malformed hand),malformed arm,(malformed finger), malformed leg,malformed posture,malformed anatomy, broken,broken face,broken head,broken eye,broken hand,broken arm,broken finger,broken leg, bad,bad body,bad face,bad head,bad eye,bad eyebrow,bad chin,(bad hand),bad arm,(bad finger),bad leg, bad hair,bad clothing,bad sock,bad shoe,bad posture,bad anatomy,bad proportion,bad drawing, bad painting, bad picture, weird,weird face,weird head,weird eye,weird eyebrow,weird chin,(weird hand),weird arm,(weird finger),weird leg, weird shoe,weird hair,weird clothing,weird sock,weird shoe,weird posture,weird anatomy,weird drawing, weird painting, weird picture, error,error drawing,error drawing line,error drawing face,error drawing head,error drawing eye,error drawing eyebrow,error drawing hand,error drawing arm,error drawing finger,error drawing leg,error drawing body,error drawing posture,error drawing anatomy,error drawing clothing, error posture,error anatomy, wrong,wrong drawing,wrong drawing line,wrong drawing face,wrong drawing head,wrong drawing eye,wrong drawing eyebrow,wrong drawing hand,wrong drawing arm,wrong drawing finger,wrong drawing leg,wrong drawing body,wrong drawing posture,wrong drawing anatomy,wrong drawing clothing, wrong posture,wrong anatomy, blurry,blurry face,blurry eye,blurry eyebrow,blurry head,blurry hand,blurry arm,blurry finger,blurry leg,blurry clothing, vague,vague face,vague eye,vague eyebrow,vague head,vague hand,vague arm,vague finger,vague leg,vague clothing, liquid face,liquid mouth, missing,(missing hand),missing arm,(missing finger) ,missing leg,missing mouth, (invisible hand),invisible arm,(invisible finger),invisible leg, (unsighted hand),unsighted arm,(unsighted finger),unsighted leg, mutated,(mutated hand), mutated arm,(mutated finger), mutated leg, too much,too much eyebrow,(too much hand),too much arm,(too much finger),too much leg, too long,too long arm,too long leg,too long neck, too short,too short arm,too short leg, small face,small head,small eye,small hand, small arm, small finger, small leg, big face,big head,big eye,big hand, big arm, big finger, big leg, dirty,dirty face,dirty drawing,dirty painting,dirty drawing line, unclean,unclean drawing,unclean painting,unclean drawing line,unclean drawing face,unclean drawing head,unclean drawing eye,unclean drawing eyebrow,unclean drawing hand,unclean drawing arm,unclean drawing finger,unclean drawing leg,unclean drawing body,unclean drawing clothing, unclean face,unclean eye,unclean eyebrow,unclean hand,unclean arm,unclean finger,unclean leg,unclean clothing, ************* Steps: 20, Sampler: DDIM, CFG scale: 7, Seed: 713905291, Size: 704x704, Model hash: 2700c435 ------------------------------------------------ (extremely detailed CG unity 8k wallpaper),(((masterpiece))),(((best quality))),highres,((ultra-detailed)),((an extremely delicate and beautiful)),(best illustration),(best shadow),(beautiful light and shadow), overlook view, (girl falling from the sky helplessly),full body, (shed tears:1.2) ,helpless face, ,face towards the sky,floating,beautiful detailed cloudy sky,sunset,meteor,glinting stars,starry sky,Milky Way,star river,constellation,firefly,light particles exploding,small floating feathers, dynamic angle,looking out to vast green field, ************* Negative prompt: (photo),(photograph),(realistic), cropped,out of frame,worst quality,low quality,normal quality,jpeg artifacts,lowres,(blurry),(vague),ugly,poor drawing,poor painting,amateur, blush, dysmelia,polydactyly,polymelia,oligodactyly,amelia,conjoined twins, long glabella,big eye and small eye,long neck, poor drawing,poor drawing body,poor drawing face,poor drawing head,poor drawing eye, poor drawing eyebrow,poor drawing chin,(poor drawing hand),poor drawing arm,(poor drawing finger),poor drawing leg, poor drawing posture,poor drawing anatomy,poor drawing picture,poor drawing line,poor drawing clothing, distorted,distorted body,distorted face,distorted head,distorted eye, distorted eyebrow,distorted chin,(distorted hand),distorted arm,(distorted finger),distorted leg, distorted posture,distorted anatomy,distorted drawing, distorted painting, distorted picture, malformed,malformed body,malformed face,malformed head,(malformed hand),malformed arm,(malformed finger), malformed leg,malformed posture,malformed anatomy, broken,broken face,broken head,broken eye,broken hand,broken arm,broken finger,broken leg, bad,bad body,bad face,bad head,bad eye,bad eyebrow,bad chin,(bad hand),bad arm,(bad finger),bad leg, bad hair,bad clothing,bad sock,bad shoe,bad posture,bad anatomy,bad proportion,bad drawing, bad painting, bad picture, weird,weird face,weird head,weird eye,weird eyebrow,weird chin,(weird hand),weird arm,(weird finger),weird leg, weird shoe,weird hair,weird clothing,weird sock,weird shoe,weird posture,weird anatomy,weird drawing, weird painting, weird picture, error,error drawing,error drawing line,error drawing face,error drawing head,error drawing eye,error drawing eyebrow,error drawing hand,error drawing arm,error drawing finger,error drawing leg,error drawing body,error drawing posture,error drawing anatomy,error drawing clothing, error posture,error anatomy, wrong,wrong drawing,wrong drawing line,wrong drawing face,wrong drawing head,wrong drawing eye,wrong drawing eyebrow,wrong drawing hand,wrong drawing arm,wrong drawing finger,wrong drawing leg,wrong drawing body,wrong drawing posture,wrong drawing anatomy,wrong drawing clothing, wrong posture,wrong anatomy, blurry,blurry face,blurry eye,blurry eyebrow,blurry head,blurry hand,blurry arm,blurry finger,blurry leg,blurry clothing, vague,vague face,vague eye,vague eyebrow,vague head,vague hand,vague arm,vague finger,vague leg,vague clothing, liquid face,liquid mouth, missing,(missing hand),missing arm,(missing finger) ,missing leg,missing mouth, (invisible hand),invisible arm,(invisible finger),invisible leg, (unsighted hand),unsighted arm,(unsighted finger),unsighted leg, mutated,(mutated hand), mutated arm,(mutated finger), mutated leg, too much,too much eyebrow,(too much hand),too much arm,(too much finger),too much leg, too long,too long arm,too long leg,too long neck, too short,too short arm,too short leg, small face,small head,small eye,small hand, small arm, small finger, small leg, big face,big head,big eye,big hand, big arm, big finger, big leg, dirty,dirty face,dirty drawing,dirty painting,dirty drawing line, unclean,unclean drawing,unclean painting,unclean drawing line,unclean drawing face,unclean drawing head,unclean drawing eye,unclean drawing eyebrow,unclean drawing hand,unclean drawing arm,unclean drawing finger,unclean drawing leg,unclean drawing body,unclean drawing clothing, unclean face,unclean eye,unclean eyebrow,unclean hand,unclean arm,unclean finger,unclean leg,unclean clothing, ******** Steps: 20, Sampler: DDIM, CFG scale: 7, Seed: 3770864370, Size: 704x704, Model hash: 2700c435, Variation seed: 3281714235, Variation seed strength: 0.29 ------------------------------------------------ (extremely detailed CG unity 8k wallpaper),(((masterpiece))),(((best quality))),highres,((ultra-detailed)),((an extremely delicate and beautiful)),(best illustration),(best shadow),(beautiful light and shadow), overlook view, (girl falling down in the sky helplessly),full body, (flowing tear water from eyes:1.3) ,helpless crying face, ,face towards the sky,floating,beautiful detailed cloudy sky,sunset,meteor,glinting stars,starry sky,Milky Way,star river,constellation,firefly,light particles exploding,small floating feathers,holding birdcage,bubble, dynamic angle,looking out to vast green field, ******** Negative prompt: (photo),(photograph),(realistic), cropped,out of frame,worst quality,low quality,normal quality,jpeg artifacts,lowres,(blurry),(vague),ugly,poor drawing,poor painting,amateur, blush, dysmelia,polydactyly,polymelia,oligodactyly,amelia,conjoined twins, long glabella,big eye and small eye,long neck, poor drawing,poor drawing body,poor drawing face,poor drawing head,poor drawing eye, poor drawing eyebrow,poor drawing chin,(poor drawing hand),poor drawing arm,(poor drawing finger),poor drawing leg, poor drawing posture,poor drawing anatomy,poor drawing picture,poor drawing line,poor drawing clothing, distorted,distorted body,distorted face,distorted head,distorted eye, distorted eyebrow,distorted chin,(distorted hand),distorted arm,(distorted finger),distorted leg, distorted posture,distorted anatomy,distorted drawing, distorted painting, distorted picture, malformed,malformed body,malformed face,malformed head,(malformed hand),malformed arm,(malformed finger), malformed leg,malformed posture,malformed anatomy, broken,broken face,broken head,broken eye,broken hand,broken arm,broken finger,broken leg, bad,bad body,bad face,bad head,bad eye,bad eyebrow,bad chin,(bad hand),bad arm,(bad finger),bad leg, bad hair,bad clothing,bad sock,bad shoe,bad posture,bad anatomy,bad proportion,bad drawing, bad painting, bad picture, weird,weird face,weird head,weird eye,weird eyebrow,weird chin,(weird hand),weird arm,(weird finger),weird leg, weird shoe,weird hair,weird clothing,weird sock,weird shoe,weird posture,weird anatomy,weird drawing, weird painting, weird picture, error,error drawing,error drawing line,error drawing face,error drawing head,error drawing eye,error drawing eyebrow,error drawing hand,error drawing arm,error drawing finger,error drawing leg,error drawing body,error drawing posture,error drawing anatomy,error drawing clothing, error posture,error anatomy, wrong,wrong drawing,wrong drawing line,wrong drawing face,wrong drawing head,wrong drawing eye,wrong drawing eyebrow,wrong drawing hand,wrong drawing arm,wrong drawing finger,wrong drawing leg,wrong drawing body,wrong drawing posture,wrong drawing anatomy,wrong drawing clothing, wrong posture,wrong anatomy, blurry,blurry face,blurry eye,blurry eyebrow,blurry head,blurry hand,blurry arm,blurry finger,blurry leg,blurry clothing, vague,vague face,vague eye,vague eyebrow,vague head,vague hand,vague arm,vague finger,vague leg,vague clothing, liquid face,liquid mouth, missing,(missing hand),missing arm,(missing finger) ,missing leg,missing mouth, (invisible hand),invisible arm,(invisible finger),invisible leg, (unsighted hand),unsighted arm,(unsighted finger),unsighted leg, mutated,(mutated hand), mutated arm,(mutated finger), mutated leg, too much,too much eyebrow,(too much hand),too much arm,(too much finger),too much leg, too long,too long arm,too long leg,too long neck, too short,too short arm,too short leg, small face,small head,small eye,small hand, small arm, small finger, small leg, big face,big head,big eye,big hand, big arm, big finger, big leg, dirty,dirty face,dirty drawing,dirty painting,dirty drawing line, unclean,unclean drawing,unclean painting,unclean drawing line,unclean drawing face,unclean drawing head,unclean drawing eye,unclean drawing eyebrow,unclean drawing hand,unclean drawing arm,unclean drawing finger,unclean drawing leg,unclean drawing body,unclean drawing clothing, unclean face,unclean eye,unclean eyebrow,unclean hand,unclean arm,unclean finger,unclean leg,unclean clothing, ******** Steps: 20, Sampler: DDIM, CFG scale: 7, Seed: 2112064214, Size: 704x704, Model hash: 2700c435

+2 more

@vcckvv

aiArt - DreamBooth功能測試(訓練AI畫出特定的角色) 「aiArt」 本次主題:DreamBooth功能測試(訓練AI畫出特定的角色) 目前要訓練AI畫出特定角色的方法有兩種 一種是Textual Inversion,丟入訓練圖後會產生一個幾十KB的pt檔,然後放在embeddings 的資料夾就能使用 這個方法的原理大致是讓AI往隨機的方向畫,然後如果畫出來的結果和訓練圖接近,那麼就會把這個方向評為高分,所以它的缺點就是只能畫出AI原本就能畫出的東西,如果有角色髮形是AI之前沒見過的可能就沒辦法畫得很好,還有在模組A的環境下訓練出來的pt檔就沒辦法拿去給模組B用 我之前在測試的時候也覺得這個方法品質不算是很好,可能還有改善的空間 另外一種訓練AI畫出特定角色的方法就是今天介紹的DreamBooth,先準備一個基礎模組ckpt檔和訓練圖,然後訓練後會產生一個新的模組ckpt檔,換言之就是直接生成一個新的特化模組,出圖品質大都明顯會比Texual Inversion要好,不過檔案大小都是2GB起跳,這是它的不便之處 這次使用的是專門用來訓練DreamBooth的colab版: https://colab.research.google.com/github/TheLastBen/fast-stable-diffusion/blob/main/fast-DreamBooth.ipynb 看網路上有蠻多人在安裝DreamBooth的擴充外掛後都沒辦法正常運作,目前只有colab版的看起來運作上都沒太大問題 目標要畫的角色是孤獨搖滾的喜多,從動畫截圖了十張下來,因為品質和大小不一,所以再使用SD upscale放大成清晰圖片,並裁切縮小成512X512的圖片,最後按照指示命名成「KitaIkuyo(編號).png」: https://imgur.com/a/MKT42QH 使用的基礎模組為Anything-V3.0-pruned.ckpt 設定的參數是learning rate 1.5e-6 ,步數是 3000 steps,因為會有overfitting的問題,所以學習率和步數不是越高越好 DreamBooth的特點就是少少幾張圖也能拿來訓練,之前有看過有人只用一張圖就訓練出一定的成果,訓練步數記得有調高到一萬步以上 這次訓練時間大概是一個小時,如果圖片大小選比較大的話會花更多時間訓練 出來的成果為圖一 因為是十張隨便挑選出的圖拿去訓練,動畫的作畫也不夠精細,所以測試後的出圖品質算是普普通通,不過也會有像圖一這樣還不錯的圖 隨便測試都能有不錯的效果出來,DreamBooth可說是很神的功能,而且不只可以用來訓練畫出特定的角色,也可以訓練畫出特定的畫風,訓練模組對未來的AI繪師來說應該是必備的技能 另外如果對模組的品質不滿意,可以再使用StableDiffusion的另一個功能:模組融合,在Checkpoint Merger這個頁面可以把二個模組ckpt檔融合成新的模組 這裡把之前產生的KitaIkuyo.ckpt和Anything-V3.0-pruned.ckpt進行融合,權重設成KitaIkuyo.ckpt為0.9、Anything-V3.0-pruned.ckpt為0.1,出來的結果為圖二 可以看到整體的作畫品質提高了,雖然失去了動畫作畫的簡略上色風格,但是角色的特徵都有好好保留下來,如果沒什麼時間訓練高品質的模組,使用模組融合來提高品質算是不錯的方法 另外特別要提的一點是Anything-V3.0的模組都需要另外放上Anything-V3.0.vae.pt,這裡訓練和融合出來的新模組也是一樣要放同名的vae.pt檔,否則和之前說的一樣會有色彩品質降低的問題 使用的咒文和參數為: half portrait of KitaIkuyo school girl in school , flat color,light tune,global illumination, masterpiece,best quality,highres, ******** Negative prompt: (photo),(photograph),(realistic), cropped,out of frame,worst quality,low quality,normal quality,jpeg artifacts,lowres,(blurry),(vague),ugly,poor drawing,poor painting,amateur, dysmelia,polydactyly,polymelia,oligodactyly,amelia,conjoined twins, long glabella,big eye and small eye,long neck, poor drawing,poor drawing body,poor drawing face,poor drawing head,poor drawing eye, poor drawing eyebrow,poor drawing chin,(poor drawing hand),poor drawing arm,(poor drawing finger),poor drawing leg, poor drawing posture,poor drawing anatomy,poor drawing picture,poor drawing line,poor drawing clothing, distorted,distorted body,distorted face,distorted head,distorted eye, distorted eyebrow,distorted chin,(distorted hand),distorted arm,(distorted finger),distorted leg, distorted posture,distorted anatomy,distorted drawing, distorted painting, distorted picture, malformed,malformed body,malformed face,malformed head,(malformed hand),malformed arm,(malformed finger), malformed leg,malformed posture,malformed anatomy, broken,broken face,broken head,broken eye,broken hand,broken arm,broken finger,broken leg, bad,bad body,bad face,bad head,bad eye,bad eyebrow,bad chin,(bad hand),bad arm,(bad finger),bad leg, bad hair,bad clothing,bad sock,bad shoe,bad posture,bad anatomy,bad proportion,bad drawing, bad painting, bad picture, weird,weird face,weird head,weird eye,weird eyebrow,weird chin,(weird hand),weird arm,(weird finger),weird leg, weird shoe,weird hair,weird clothing,weird sock,weird shoe,weird posture,weird anatomy,weird drawing, weird painting, weird picture, error,error drawing,error drawing line,error drawing face,error drawing head,error drawing eye,error drawing eyebrow,error drawing hand,error drawing arm,error drawing finger,error drawing leg,error drawing body,error drawing posture,error drawing anatomy,error drawing clothing, error posture,error anatomy, wrong,wrong drawing,wrong drawing line,wrong drawing face,wrong drawing head,wrong drawing eye,wrong drawing eyebrow,wrong drawing hand,wrong drawing arm,wrong drawing finger,wrong drawing leg,wrong drawing body,wrong drawing posture,wrong drawing anatomy,wrong drawing clothing, wrong posture,wrong anatomy, blurry,blurry face,blurry eye,blurry eyebrow,blurry head,blurry hand,blurry arm,blurry finger,blurry leg,blurry clothing, vague,vague face,vague eye,vague eyebrow,vague head,vague hand,vague arm,vague finger,vague leg,vague clothing, liquid face,liquid mouth, missing,(missing hand),missing arm,(missing finger) ,missing leg,missing mouth, (invisible hand),invisible arm,(invisible finger),invisible leg, (unsighted hand),unsighted arm,(unsighted finger),unsighted leg, mutated,(mutated hand), mutated arm,(mutated finger), mutated leg, too much,too much eyebrow,(too much hand),too much arm,(too much finger),too much leg, too long,too long arm,too long leg,too long neck, too short,too short arm,too short leg, small face,small head,small eye,small hand, small arm, small finger, small leg, big face,big head,big eye,big hand, big arm, big finger, big leg, dirty,dirty face,dirty drawing,dirty painting,dirty drawing line, unclean,unclean drawing,unclean painting,unclean drawing line,unclean drawing face,unclean drawing head,unclean drawing eye,unclean drawing eyebrow,unclean drawing hand,unclean drawing arm,unclean drawing finger,unclean drawing leg,unclean drawing body,unclean drawing clothing, unclean face,unclean eye,unclean eyebrow,unclean hand,unclean arm,unclean finger,unclean leg,unclean clothing, ******** Steps: 20, Sampler: DDIM, CFG scale: 7, Seed: 4278710297, Size: 512x512, Model hash: 79c41896 ------------------------------------------------ half portrait of KitaIkuyo school girl in school ,style of KitaIkuyo ,red long hair, flat color,light tune,global illumination, masterpiece,best quality,highres, ******** Negative prompt: (photo),(photograph),(realistic), cropped,out of frame,worst quality,low quality,normal quality,jpeg artifacts,lowres,(blurry),(vague),ugly,poor drawing,poor painting,amateur, dysmelia,polydactyly,polymelia,oligodactyly,amelia,conjoined twins, long glabella,big eye and small eye,long neck, poor drawing,poor drawing body,poor drawing face,poor drawing head,poor drawing eye, poor drawing eyebrow,poor drawing chin,(poor drawing hand),poor drawing arm,(poor drawing finger),poor drawing leg, poor drawing posture,poor drawing anatomy,poor drawing picture,poor drawing line,poor drawing clothing, distorted,distorted body,distorted face,distorted head,distorted eye, distorted eyebrow,distorted chin,(distorted hand),distorted arm,(distorted finger),distorted leg, distorted posture,distorted anatomy,distorted drawing, distorted painting, distorted picture, malformed,malformed body,malformed face,malformed head,(malformed hand),malformed arm,(malformed finger), malformed leg,malformed posture,malformed anatomy, broken,broken face,broken head,broken eye,broken hand,broken arm,broken finger,broken leg, bad,bad body,bad face,bad head,bad eye,bad eyebrow,bad chin,(bad hand),bad arm,(bad finger),bad leg, bad hair,bad clothing,bad sock,bad shoe,bad posture,bad anatomy,bad proportion,bad drawing, bad painting, bad picture, weird,weird face,weird head,weird eye,weird eyebrow,weird chin,(weird hand),weird arm,(weird finger),weird leg, weird shoe,weird hair,weird clothing,weird sock,weird shoe,weird posture,weird anatomy,weird drawing, weird painting, weird picture, error,error drawing,error drawing line,error drawing face,error drawing head,error drawing eye,error drawing eyebrow,error drawing hand,error drawing arm,error drawing finger,error drawing leg,error drawing body,error drawing posture,error drawing anatomy,error drawing clothing, error posture,error anatomy, wrong,wrong drawing,wrong drawing line,wrong drawing face,wrong drawing head,wrong drawing eye,wrong drawing eyebrow,wrong drawing hand,wrong drawing arm,wrong drawing finger,wrong drawing leg,wrong drawing body,wrong drawing posture,wrong drawing anatomy,wrong drawing clothing, wrong posture,wrong anatomy, blurry,blurry face,blurry eye,blurry eyebrow,blurry head,blurry hand,blurry arm,blurry finger,blurry leg,blurry clothing, vague,vague face,vague eye,vague eyebrow,vague head,vague hand,vague arm,vague finger,vague leg,vague clothing, liquid face,liquid mouth, missing,(missing hand),missing arm,(missing finger) ,missing leg,missing mouth, (invisible hand),invisible arm,(invisible finger),invisible leg, (unsighted hand),unsighted arm,(unsighted finger),unsighted leg, mutated,(mutated hand), mutated arm,(mutated finger), mutated leg, too much,too much eyebrow,(too much hand),too much arm,(too much finger),too much leg, too long,too long arm,too long leg,too long neck, too short,too short arm,too short leg, small face,small head,small eye,small hand, small arm, small finger, small leg, big face,big head,big eye,big hand, big arm, big finger, big leg, dirty,dirty face,dirty drawing,dirty painting,dirty drawing line, unclean,unclean drawing,unclean painting,unclean drawing line,unclean drawing face,unclean drawing head,unclean drawing eye,unclean drawing eyebrow,unclean drawing hand,unclean drawing arm,unclean drawing finger,unclean drawing leg,unclean drawing body,unclean drawing clothing, unclean face,unclean eye,unclean eyebrow,unclean hand,unclean arm,unclean finger,unclean leg,unclean clothing, ******** Steps: 20, Sampler: DDIM, CFG scale: 7, Seed: 1138473959, Size: 832x512, Model hash: b97af004

@vcckvv

aiArt - depth2img功能測試 「aiArt」 這次的主題:depth2img功能測試 depth2img是StableDiffusion 2.0的新功能,和img2img一樣都是用來改造圖,不過img2img在改造上常常會產生很大的形變,因而破壞原有的構圖,而depth2img則可以盡量減少形變、在保持構圖上進行改造圖 其原理是先產生原圖的depth map深度圖,AI會自動判斷每個點的景深值,然後產生出來的改造圖會盡量保持擁有相近的深度圖,由此來避免破壞原本的構圖 要注意的是,depth2img目前好像只能用特製的模組512-depth-ema.ckpt實現,其他的模組還沒辦法用這個功能,下載連結為: https://huggingface.co/stabilityai/stable-diffusion-2-depth/resolve/main/512-depth-ema.ckpt 使用時需要在同資料夾放上這個檔案,記得要改名成512-depth-ema.yaml : https://raw.githubusercontent.com/Stability-AI/stablediffusion/main/configs/stable-diffusion/v2-midas-inference.yaml 因為載入時耗費的記憶體會比舊版的要大,所以之前的免費使用的colab版會沒辦法用,需要使用別人優化程式碼過的版本: https://colab.research.google.com/github/TheLastBen/fast-stable-diffusion/blob/main/fast_stable_diffusion_AUTOMATIC1111.ipynb#scrollTo=PjzwxTkPSPHf 這個版本即便載入較大的2.1模組檔也沒問題,記得點選那個Large_Model 這次使用的原圖是上次發過的人像照(圖一) 圖二是經過改造後就能產生出金髮白人的照片,而且可以看出大致保持相同的構圖和五官位置 圖三則是改造成青花瓷的人偶的照片 圖四是改造成大理石的雕像 圖五是把圖四當作原圖改造成的玉石像,可以發現當主題接近時(都是雕像),越不容易產生形變 ----------------------- depth2img算是蠻好用的功能,期待未來其他的模組也能使用這個功能 之前有看到有人用來自動產生3D貼圖,這功能感覺很快就會被大量商用: https://twitter.com/CarsonKatri/status/1600248599254007810 ----------------------- 使用的咒文和參數: 金髮白人 (front portrait) of young blonde student girl,long straight blonde hair,(straight side part fringe) ,(skin pores),makeup,perfect face,(young face:1.2),blush,(dark eye shadow:0.1), (((best quality))),highres, ((ultra-detailed)),((an extremely delicate and beautiful)),(best photo),(professional photograph),(best shadow),(beautiful light and shadow), cinematic lighting, ******** Negative prompt: (blurry:1.9),(vague:1.9),cropped,out of frame,worst quality,low quality,normal quality,jpeg artifacts,lowres,ugly,poor drawing,poor painting, drawing,painting,poor 3D,poor photo,amateur, hand,finger,arm,close up, bad,weird,distorted,malformed,broken,error,wrong,dirty,unclean, poor drawing picture,poor drawing line, dirty drawing,dirty painting,dirty drawing line, unclean drawing,unclean painting,unclean drawing line, ******** Steps: 20, Sampler: DDIM, CFG scale: 7, Seed: 2578675247, Size: 800x800, Model hash: d0522d12, Denoising strength: 1, Mask blur: 4 ------------------------------------------------ 青花瓷人像 blue and white porcelain statue, (((best quality))),highres, ((ultra-detailed)),((an extremely delicate and beautiful)),(best photo),(professional photograph),(best shadow),(beautiful light and shadow), ******** Negative prompt: (blurry:1.9),(vague:1.9),cropped,out of frame,worst quality,low quality,normal quality,jpeg artifacts,lowres,ugly,poor drawing,poor painting, drawing,painting,poor 3D,poor photo,amateur, bad,weird,distorted,malformed,broken,error,wrong,dirty,unclean, poor drawing picture,poor drawing line, dirty drawing,dirty painting,dirty drawing line, unclean drawing,unclean painting,unclean drawing line, ******** Steps: 20, Sampler: LMS Karras, CFG scale: 7, Seed: 3981807695, Size: 704x704, Model hash: d0522d12, Denoising strength: 1, Mask blur: 4 ------------------------------------------------ 大理石雕像 delicate clean white statue in clean white marble,perfect face,delicate clean white statue hair, (((best quality))),highres, ((ultra-detailed)),((an extremely delicate and beautiful)),(best photo),(professional photograph),(best shadow),(beautiful light and shadow), ******** Negative prompt: (blurry:1.9),(vague:1.9),cropped,out of frame,worst quality,low quality,normal quality,jpeg artifacts,lowres,ugly,poor drawing,poor painting, drawing,painting,poor 3D,poor photo,amateur, bad,weird,distorted,malformed,broken,error,wrong,dirty,unclean, poor drawing picture,poor drawing line, dirty drawing,dirty painting,dirty drawing line, unclean drawing,unclean painting,unclean drawing line, ******** Steps: 20, Sampler: DDIM, CFG scale: 7, Seed: 2216612847, Size: 704x704, Model hash: d0522d12, Denoising strength: 1, Mask blur: 4 ------------------------------------------------ 玉石像 green jade statue,perfect face,green jade stone, (((best quality))),highres, ((ultra-detailed)),((an extremely delicate and beautiful)),(best photo),(professional photograph),(best shadow),(beautiful light and shadow), ******** Negative prompt: (blurry:1.9),(vague:1.9),cropped,out of frame,worst quality,low quality,normal quality,jpeg artifacts,lowres,ugly,poor drawing,poor painting, drawing,painting,poor 3D,poor photo,amateur, bad,weird,distorted,malformed,broken,error,wrong,dirty,unclean, poor drawing picture,poor drawing line, dirty drawing,dirty painting,dirty drawing line, unclean drawing,unclean painting,unclean drawing line, ******** Steps: 20, Sampler: DDIM, CFG scale: 7, Seed: 3502842231, Size: 704x704, Model hash: d0522d12, Denoising strength: 1, Mask blur: 4

+2 more

@vcckvv

「aiArt」-雜圖 「aiArt」 這次的主題:雜圖 圖一是低多邊形3D風格,這次試驗中發現把出圖尺寸調低後,雖然細節品質會降低,但是構圖會變好,尤其是生物的身體在大尺寸下很容易各種變形扭曲,但在小尺寸出圖後情況就沒那麼嚴重 先有較好的構圖,之後再用img2img放大圖片就能產生更好的圖,這個方法算是蠻好用的方法 圖二是sci-fi王座,咒文參考來源為:https://old.reddit.com/r/StableDiffusion/comments/zjwkqm/scifi_throne/ 圖三是向量圖片海報風格 圖四是動畫風格,Anything-V3.0.ckpt模組再加上flat color上色風格,意外能產生很接近動畫的風格 圖五是肖像照片,記得還沒做過像這樣的照片,所以來玩看看,要產生滿意的臉孔意外地不太容易,這裡也是先縮小出圖尺寸來處理 --------------- 題外話:最近有看到可以「文字轉成音樂」的新的AI: https://www.riffusion.com/ 原理是借用Stable Diffusion的方法,但畫出的是頻譜圖,然後頻譜圖再轉成可以聽的音訊,雖然試驗後覺得不能產生滿意的風格,不過品質好像算還可以 --------------- 使用咒文和參數: 低多邊形3D風格 low poly 3D full body portrait of only one kawaii fox, 3d isometric render, blank background, square image, close up,flat color, ******** Negative prompt: gray,high detailed,desaturation,clothing, dysmelia,polydactyly,polymelia,oligodactyly,amelia,conjoined twins, long glabella,big eye and small eye,long neck, poor drawing,poor drawing body,poor drawing face,poor drawing head,poor drawing eye, poor drawing eyebrow,poor drawing chin,(poor drawing hand),poor drawing arm,(poor drawing finger),poor drawing leg, poor drawing posture,poor drawing anatomy,poor drawing picture,poor drawing line,poor drawing clothing, distorted,distorted body,distorted face,distorted head,distorted eye, distorted eyebrow,distorted chin,(distorted hand),distorted arm,(distorted finger),distorted leg, distorted posture,distorted anatomy,distorted drawing, distorted painting, distorted picture, malformed,malformed body,malformed face,malformed head,(malformed hand),malformed arm,(malformed finger), malformed leg,malformed posture,malformed anatomy, broken,broken face,broken head,broken eye,broken hand,broken arm,broken finger,broken leg, bad,bad body,bad face,bad head,bad eye,bad eyebrow,bad chin,(bad hand),bad arm,(bad finger),bad leg, bad hair,bad clothing,bad sock,bad shoe,bad posture,bad anatomy,bad proportion,bad drawing, bad painting, bad picture, weird,weird face,weird head,weird eye,weird eyebrow,weird chin,(weird hand),weird arm,(weird finger),weird leg, weird shoe,weird hair,weird clothing,weird sock,weird shoe,weird posture,weird anatomy,weird drawing, weird painting, weird picture, error,error drawing,error drawing line,error drawing face,error drawing head,error drawing eye,error drawing eyebrow,error drawing hand,error drawing arm,error drawing finger,error drawing leg,error drawing body,error drawing posture,error drawing anatomy,error drawing clothing, error posture,error anatomy, wrong,wrong drawing,wrong drawing line,wrong drawing face,wrong drawing head,wrong drawing eye,wrong drawing eyebrow,wrong drawing hand,wrong drawing arm,wrong drawing finger,wrong drawing leg,wrong drawing body,wrong drawing posture,wrong drawing anatomy,wrong drawing clothing, wrong posture,wrong anatomy, blurry,blurry face,blurry eye,blurry eyebrow,blurry head,blurry hand,blurry arm,blurry finger,blurry leg,blurry clothing, vague,vague face,vague eye,vague eyebrow,vague head,vague hand,vague arm,vague finger,vague leg,vague clothing, liquid face,liquid mouth, missing,(missing hand),missing arm,(missing finger) ,missing leg,missing mouth, (invisible hand),invisible arm,(invisible finger),invisible leg, (unsighted hand),unsighted arm,(unsighted finger),unsighted leg, mutated,(mutated hand), mutated arm,(mutated finger), mutated leg, too much,too much eyebrow,(too much hand),too much arm,(too much finger),too much leg, too long,too long arm,too long leg,too long neck, too short,too short arm,too short leg, small face,small head,small eye,small hand, small arm, small finger, small leg, big face,big head,big eye,big hand, big arm, big finger, big leg, dirty,dirty face,dirty drawing,dirty painting,dirty drawing line, unclean,unclean drawing,unclean painting,unclean drawing line,unclean drawing face,unclean drawing head,unclean drawing eye,unclean drawing eyebrow,unclean drawing hand,unclean drawing arm,unclean drawing finger,unclean drawing leg,unclean drawing body,unclean drawing clothing, unclean face,unclean eye,unclean eyebrow,unclean hand,unclean arm,unclean finger,unclean leg,unclean clothing, ******** Steps: 20, Sampler: DDIM, CFG scale: 10, Seed: 3686483664, Size: 400x400, Model hash: d1672608 ------------------------------------------------ sci-fi王座 (symmetry future sci-fi high tech machine throne front view:1.4), (style of lamborghini), (((masterpiece))),(((best quality))),highres,(best photo),((an extremely delicate and beautiful)), sci-fi,blank background, unreal engine 5,octane render,8K,HD, ********** Negative prompt: (blurry:1.9),(vague:1.9),cropped,out of frame,worst quality,low quality,normal quality,jpeg artifacts,lowres,ugly,poor drawing,poor painting,gray,monotone, human,bad,weird,background, ********** Steps: 20, Sampler: DDIM, CFG scale: 7, Seed: 3899258644, Size: 704x704, Model hash: 7460a6fa, Variation seed: 3527783142, Variation seed strength: 0.2 ------------------------------------------------ 向量圖片海報 shirt design, vector style, a lake and japanese pines to the left of the scene, big red sun, fresh modern look, ********** Negative prompt: (photo),(photograph),(realistic), cropped,out of frame,worst quality,low quality,normal quality,jpeg artifacts,lowres,(blurry),(vague),ugly,poor drawing,poor painting,amateur, bad,weird,distorted,malformed,broken,error,wrong,dirty,unclean, poor drawing picture,poor drawing line, dirty drawing,dirty painting,dirty drawing line, unclean drawing,unclean painting,unclean drawing line, ********** Steps: 20, Sampler: DDIM, CFG scale: 7, Seed: 4006557409, Size: 512x832, Model hash: 7460a6fa ------------------------------------------------ 動畫風格 (flat-color-style character),kyoto animation, portrait of girl with yellow hair standing at garden,normal white t-shirt,normal black skirt, side ponytail,noon,happy, ******** Negative prompt: (photo),(photograph),(realistic), cropped,out of frame,worst quality,low quality,normal quality,jpeg artifacts,lowres,(blurry),(vague),ugly,poor drawing,poor painting,amateur,gray, dysmelia,polydactyly,polymelia,oligodactyly,amelia,conjoined twins, long glabella,big eye and small eye,long neck, poor drawing,poor drawing body,poor drawing face,poor drawing head,poor drawing eye, poor drawing eyebrow,poor drawing chin,(poor drawing hand),poor drawing arm,(poor drawing finger),poor drawing leg, poor drawing posture,poor drawing anatomy,poor drawing picture,poor drawing line,poor drawing clothing, distorted,distorted body,distorted face,distorted head,distorted eye, distorted eyebrow,distorted chin,(distorted hand),distorted arm,(distorted finger),distorted leg, distorted posture,distorted anatomy,distorted drawing, distorted painting, distorted picture, malformed,malformed body,malformed face,malformed head,(malformed hand),malformed arm,(malformed finger), malformed leg,malformed posture,malformed anatomy, broken,broken face,broken head,broken eye,broken hand,broken arm,broken finger,broken leg, bad,bad body,bad face,bad head,bad eye,bad eyebrow,bad chin,(bad hand),bad arm,(bad finger),bad leg, bad hair,bad clothing,bad sock,bad shoe,bad posture,bad anatomy,bad proportion,bad drawing, bad painting, bad picture, weird,weird face,weird head,weird eye,weird eyebrow,weird chin,(weird hand),weird arm,(weird finger),weird leg, weird shoe,weird hair,weird clothing,weird sock,weird shoe,weird posture,weird anatomy,weird drawing, weird painting, weird picture, error,error drawing,error drawing line,error drawing face,error drawing head,error drawing eye,error drawing eyebrow,error drawing hand,error drawing arm,error drawing finger,error drawing leg,error drawing body,error drawing posture,error drawing anatomy,error drawing clothing, error posture,error anatomy, wrong,wrong drawing,wrong drawing line,wrong drawing face,wrong drawing head,wrong drawing eye,wrong drawing eyebrow,wrong drawing hand,wrong drawing arm,wrong drawing finger,wrong drawing leg,wrong drawing body,wrong drawing posture,wrong drawing anatomy,wrong drawing clothing, wrong posture,wrong anatomy, blurry,blurry face,blurry eye,blurry eyebrow,blurry head,blurry hand,blurry arm,blurry finger,blurry leg,blurry clothing, vague,vague face,vague eye,vague eyebrow,vague head,vague hand,vague arm,vague finger,vague leg,vague clothing, liquid face,liquid mouth, missing,(missing hand),missing arm,(missing finger) ,missing leg,missing mouth, (invisible hand),invisible arm,(invisible finger),invisible leg, (unsighted hand),unsighted arm,(unsighted finger),unsighted leg, mutated,(mutated hand), mutated arm,(mutated finger), mutated leg, too much,too much eyebrow,(too much hand),too much arm,(too much finger),too much leg, too long,too long arm,too long leg,too long neck, too short,too short arm,too short leg, small face,small head,small eye,small hand, small arm, small finger, small leg, big face,big head,big eye,big hand, big arm, big finger, big leg, dirty,dirty face,dirty drawing,dirty painting,dirty drawing line, unclean,unclean drawing,unclean painting,unclean drawing line,unclean drawing face,unclean drawing head,unclean drawing eye,unclean drawing eyebrow,unclean drawing hand,unclean drawing arm,unclean drawing finger,unclean drawing leg,unclean drawing body,unclean drawing clothing, unclean face,unclean eye,unclean eyebrow,unclean hand,unclean arm,unclean finger,unclean leg,unclean clothing, ******** Steps: 20, Sampler: DDIM, CFG scale: 7, Seed: 1423958364, Size: 832x512, Model hash: 2700c435 ------------------------------------------------ 肖像照片 (front portrait) of young japan student girl,long straight black hair,(straight side part fringe) ,(skin pores),makeup,perfect face,(young face:1.2),blush,(dark eye shadow:0.1), (((best quality))),highres, ((ultra-detailed)),((an extremely delicate and beautiful)),(best photo),(professional photograph),(best shadow),(beautiful light and shadow), cinematic lighting, ******** Negative prompt: (blurry:1.9),(vague:1.9),cropped,out of frame,worst quality,low quality,normal quality,jpeg artifacts,lowres,ugly,poor drawing,poor painting, drawing,painting,poor 3D,poor photo,amateur, hand,finger,arm,close up, bad,weird,distorted,malformed,broken,error,wrong,dirty,unclean, poor drawing picture,poor drawing line, dirty drawing,dirty painting,dirty drawing line, unclean drawing,unclean painting,unclean drawing line, ******** Steps: 20, Sampler: DDIM, CFG scale: 7, Seed: 1014343881, Size: 400x400, Model hash: 7460a6fa ------------------------------------------------

+2 more

@vcckvv

aiArt - 水之森 「aiArt」 這次的主題:水之森 複雜的光影交錯、各種發光體散布、水波的反射摻雜在一起,通常能產生不錯的構圖 圖一強化了各種發光體 圖二強化了水的噴濺 圖三則是嘗試了直向的構圖,不過比較沒有森林的開闊感 圖四換成了夜中燈照的森林 圖五是簡單測試中偶然出現的特殊畫風,因為構圖不錯所以特地保留下來 使用的咒文和參數: (extremely detailed CG unity 8k wallpaper),(((masterpiece))),(((best quality))),highres,((ultra-detailed)),((an extremely delicate and beautiful)),(best illustration),(best shadow),(beautiful light and shadow), girl (wearing kimono) standing and submerge half in water in flooding forest,firefly,enchanted tree,luminous particles exploding, blue glowing vast sky,light leaked,glistening light of waves,refraction,reflection,dappled sunlight on face,,interplay of light and shadow,variation of light and shadow, depth of field, ********** Negative prompt: (photo),(photograph),(realistic), cropped,out of frame,worst quality,low quality,normal quality,jpeg artifacts,lowres,(blurry),(vague),ugly,poor drawing,poor painting,amateur, splash, dysmelia,polydactyly,polymelia,oligodactyly,amelia,conjoined twins, long glabella,big eye and small eye,long neck, poor drawing,poor drawing body,poor drawing face,poor drawing head,poor drawing eye, poor drawing eyebrow,poor drawing chin,(poor drawing hand),poor drawing arm,(poor drawing finger),poor drawing leg, poor drawing posture,poor drawing anatomy,poor drawing picture,poor drawing line,poor drawing clothing, distorted,distorted body,distorted face,distorted head,distorted eye, distorted eyebrow,distorted chin,(distorted hand),distorted arm,(distorted finger),distorted leg, distorted posture,distorted anatomy,distorted drawing, distorted painting, distorted picture, malformed,malformed body,malformed face,malformed head,(malformed hand),malformed arm,(malformed finger), malformed leg,malformed posture,malformed anatomy, broken,broken face,broken head,broken eye,broken hand,broken arm,broken finger,broken leg, bad,bad body,bad face,bad head,bad eye,bad eyebrow,bad chin,(bad hand),bad arm,(bad finger),bad leg, bad hair,bad clothing,bad sock,bad shoe,bad posture,bad anatomy,bad proportion,bad drawing, bad painting, bad picture, weird,weird face,weird head,weird eye,weird eyebrow,weird chin,(weird hand),weird arm,(weird finger),weird leg, weird shoe,weird hair,weird clothing,weird sock,weird shoe,weird posture,weird anatomy,weird drawing, weird painting, weird picture, error,error drawing,error drawing line,error drawing face,error drawing head,error drawing eye,error drawing eyebrow,error drawing hand,error drawing arm,error drawing finger,error drawing leg,error drawing body,error drawing posture,error drawing anatomy,error drawing clothing, error posture,error anatomy, wrong,wrong drawing,wrong drawing line,wrong drawing face,wrong drawing head,wrong drawing eye,wrong drawing eyebrow,wrong drawing hand,wrong drawing arm,wrong drawing finger,wrong drawing leg,wrong drawing body,wrong drawing posture,wrong drawing anatomy,wrong drawing clothing, wrong posture,wrong anatomy, blurry,blurry face,blurry eye,blurry eyebrow,blurry head,blurry hand,blurry arm,blurry finger,blurry leg,blurry clothing, vague,vague face,vague eye,vague eyebrow,vague head,vague hand,vague arm,vague finger,vague leg,vague clothing, liquid face,liquid mouth, missing,(missing hand),missing arm,(missing finger) ,missing leg,missing mouth, (invisible hand),invisible arm,(invisible finger),invisible leg, (unsighted hand),unsighted arm,(unsighted finger),unsighted leg, mutated,(mutated hand), mutated arm,(mutated finger), mutated leg, too much,too much eyebrow,(too much hand),too much arm,(too much finger),too much leg, too long,too long arm,too long leg,too long neck, too short,too short arm,too short leg, small face,small head,small eye,small hand, small arm, small finger, small leg, big face,big head,big eye,big hand, big arm, big finger, big leg, dirty,dirty face,dirty drawing,dirty painting,dirty drawing line, unclean,unclean drawing,unclean painting,unclean drawing line,unclean drawing face,unclean drawing head,unclean drawing eye,unclean drawing eyebrow,unclean drawing hand,unclean drawing arm,unclean drawing finger,unclean drawing leg,unclean drawing body,unclean drawing clothing, unclean face,unclean eye,unclean eyebrow,unclean hand,unclean arm,unclean finger,unclean leg,unclean clothing, ********** Steps: 20, Sampler: DDIM, CFG scale: 7, Seed: 1639425747, Size: 832x512, Model hash: 2700c435, Variation seed: 1134142020, Variation seed strength: 0.17 ------------------------------------------------ (extremely detailed CG unity 8k wallpaper),(((masterpiece))),(((best quality))),highres,((ultra-detailed)),((an extremely delicate and beautiful)),(best illustration),(best shadow),(beautiful light and shadow), girl (wearing kimono) standing and submerge half in water in flooding forest,firefly,enchanted tree,luminous particles exploding, bubble floating in midair,ripple,popple,riffle,choppy,water drop,drip,droplet, blue glowing vast sky,light leaked,glistening light of waves,refraction,reflection,dappled sunlight on face,,interplay of light and shadow,variation of light and shadow, depth of field, ********** Negative prompt: (photo),(photograph),(realistic), cropped,out of frame,worst quality,low quality,normal quality,jpeg artifacts,lowres,(blurry),(vague),ugly,poor drawing,poor painting,amateur, dysmelia,polydactyly,polymelia,oligodactyly,amelia,conjoined twins, long glabella,big eye and small eye,long neck, poor drawing,poor drawing body,poor drawing face,poor drawing head,poor drawing eye, poor drawing eyebrow,poor drawing chin,(poor drawing hand),poor drawing arm,(poor drawing finger),poor drawing leg, poor drawing posture,poor drawing anatomy,poor drawing picture,poor drawing line,poor drawing clothing, distorted,distorted body,distorted face,distorted head,distorted eye, distorted eyebrow,distorted chin,(distorted hand),distorted arm,(distorted finger),distorted leg, distorted posture,distorted anatomy,distorted drawing, distorted painting, distorted picture, malformed,malformed body,malformed face,malformed head,(malformed hand),malformed arm,(malformed finger), malformed leg,malformed posture,malformed anatomy, broken,broken face,broken head,broken eye,broken hand,broken arm,broken finger,broken leg, bad,bad body,bad face,bad head,bad eye,bad eyebrow,bad chin,(bad hand),bad arm,(bad finger),bad leg, bad hair,bad clothing,bad sock,bad shoe,bad posture,bad anatomy,bad proportion,bad drawing, bad painting, bad picture, weird,weird face,weird head,weird eye,weird eyebrow,weird chin,(weird hand),weird arm,(weird finger),weird leg, weird shoe,weird hair,weird clothing,weird sock,weird shoe,weird posture,weird anatomy,weird drawing, weird painting, weird picture, error,error drawing,error drawing line,error drawing face,error drawing head,error drawing eye,error drawing eyebrow,error drawing hand,error drawing arm,error drawing finger,error drawing leg,error drawing body,error drawing posture,error drawing anatomy,error drawing clothing, error posture,error anatomy, wrong,wrong drawing,wrong drawing line,wrong drawing face,wrong drawing head,wrong drawing eye,wrong drawing eyebrow,wrong drawing hand,wrong drawing arm,wrong drawing finger,wrong drawing leg,wrong drawing body,wrong drawing posture,wrong drawing anatomy,wrong drawing clothing, wrong posture,wrong anatomy, blurry,blurry face,blurry eye,blurry eyebrow,blurry head,blurry hand,blurry arm,blurry finger,blurry leg,blurry clothing, vague,vague face,vague eye,vague eyebrow,vague head,vague hand,vague arm,vague finger,vague leg,vague clothing, liquid face,liquid mouth, missing,(missing hand),missing arm,(missing finger) ,missing leg,missing mouth, (invisible hand),invisible arm,(invisible finger),invisible leg, (unsighted hand),unsighted arm,(unsighted finger),unsighted leg, mutated,(mutated hand), mutated arm,(mutated finger), mutated leg, too much,too much eyebrow,(too much hand),too much arm,(too much finger),too much leg, too long,too long arm,too long leg,too long neck, too short,too short arm,too short leg, small face,small head,small eye,small hand, small arm, small finger, small leg, big face,big head,big eye,big hand, big arm, big finger, big leg, dirty,dirty face,dirty drawing,dirty painting,dirty drawing line, unclean,unclean drawing,unclean painting,unclean drawing line,unclean drawing face,unclean drawing head,unclean drawing eye,unclean drawing eyebrow,unclean drawing hand,unclean drawing arm,unclean drawing finger,unclean drawing leg,unclean drawing body,unclean drawing clothing, unclean face,unclean eye,unclean eyebrow,unclean hand,unclean arm,unclean finger,unclean leg,unclean clothing, ********** Steps: 20, Sampler: DDIM, CFG scale: 7, Seed: 4083431895, Size: 832x512, Model hash: 2700c435 ------------------------------------------------ (extremely detailed CG unity 8k wallpaper),(((masterpiece))),(((best quality))),highres,((ultra-detailed)),((an extremely delicate and beautiful)),(best illustration),(best shadow),(beautiful light and shadow), epic vista,depth of field,dynamic angle, girl (wearing kimono) standing and submerge half in water in flooding forest ,(firefly surround:1.5),enchanted tree,pixel particles exploding,small luminous butterfly surround,bubble floating in midair, (blue vast sky behind tree),light leaked,glistening light of waves,refraction,reflection,dappled sunlight on face,,interplay of light and shadow,variation of light and shadow, ********** Negative prompt: (photo),(photograph),(realistic), cropped,out of frame,worst quality,low quality,normal quality,jpeg artifacts,lowres,(blurry),(vague),ugly,poor drawing,poor painting,amateur, dysmelia,polydactyly,polymelia,oligodactyly,amelia,conjoined twins, long glabella,big eye and small eye,long neck, poor drawing,poor drawing body,poor drawing face,poor drawing head,poor drawing eye, poor drawing eyebrow,poor drawing chin,(poor drawing hand),poor drawing arm,(poor drawing finger),poor drawing leg, poor drawing posture,poor drawing anatomy,poor drawing picture,poor drawing line,poor drawing clothing, distorted,distorted body,distorted face,distorted head,distorted eye, distorted eyebrow,distorted chin,(distorted hand),distorted arm,(distorted finger),distorted leg, distorted posture,distorted anatomy,distorted drawing, distorted painting, distorted picture, malformed,malformed body,malformed face,malformed head,(malformed hand),malformed arm,(malformed finger), malformed leg,malformed posture,malformed anatomy, broken,broken face,broken head,broken eye,broken hand,broken arm,broken finger,broken leg, bad,bad body,bad face,bad head,bad eye,bad eyebrow,bad chin,(bad hand),bad arm,(bad finger),bad leg, bad hair,bad clothing,bad sock,bad shoe,bad posture,bad anatomy,bad proportion,bad drawing, bad painting, bad picture, weird,weird face,weird head,weird eye,weird eyebrow,weird chin,(weird hand),weird arm,(weird finger),weird leg, weird shoe,weird hair,weird clothing,weird sock,weird shoe,weird posture,weird anatomy,weird drawing, weird painting, weird picture, error,error drawing,error drawing line,error drawing face,error drawing head,error drawing eye,error drawing eyebrow,error drawing hand,error drawing arm,error drawing finger,error drawing leg,error drawing body,error drawing posture,error drawing anatomy,error drawing clothing, error posture,error anatomy, wrong,wrong drawing,wrong drawing line,wrong drawing face,wrong drawing head,wrong drawing eye,wrong drawing eyebrow,wrong drawing hand,wrong drawing arm,wrong drawing finger,wrong drawing leg,wrong drawing body,wrong drawing posture,wrong drawing anatomy,wrong drawing clothing, wrong posture,wrong anatomy, blurry,blurry face,blurry eye,blurry eyebrow,blurry head,blurry hand,blurry arm,blurry finger,blurry leg,blurry clothing, vague,vague face,vague eye,vague eyebrow,vague head,vague hand,vague arm,vague finger,vague leg,vague clothing, liquid face,liquid mouth, missing,(missing hand),missing arm,(missing finger) ,missing leg,missing mouth, (invisible hand),invisible arm,(invisible finger),invisible leg, (unsighted hand),unsighted arm,(unsighted finger),unsighted leg, mutated,(mutated hand), mutated arm,(mutated finger), mutated leg, too much,too much eyebrow,(too much hand),too much arm,(too much finger),too much leg, too long,too long arm,too long leg,too long neck, too short,too short arm,too short leg, small face,small head,small eye,small hand, small arm, small finger, small leg, big face,big head,big eye,big hand, big arm, big finger, big leg, dirty,dirty face,dirty drawing,dirty painting,dirty drawing line, unclean,unclean drawing,unclean painting,unclean drawing line,unclean drawing face,unclean drawing head,unclean drawing eye,unclean drawing eyebrow,unclean drawing hand,unclean drawing arm,unclean drawing finger,unclean drawing leg,unclean drawing body,unclean drawing clothing, unclean face,unclean eye,unclean eyebrow,unclean hand,unclean arm,unclean finger,unclean leg,unclean clothing, ********** Steps: 20, Sampler: DDIM, CFG scale: 7, Seed: 3008750442, Size: 512x832, Model hash: 2700c435 ------------------------------------------------ (extremely detailed CG unity 8k wallpaper),(((masterpiece))),(((best quality))),highres,((ultra-detailed)),((an extremely delicate and beautiful)),(best illustration),(best shadow),(beautiful light and shadow), epic vista,depth of field,dynamic angle, girl (wearing kimono) standing and submerge half in water in flooding forest at night ,(firefly surround:1.5),enchanted tree,pixel particles exploding,small luminous butterfly surround,(bubble floating in midair:0.5),lamp light, light leaked,glistening light of waves,refraction,reflection,dappled sunlight on face,,interplay of light and shadow,variation of light and shadow, ********** Negative prompt: (photo),(photograph),(realistic), cropped,out of frame,worst quality,low quality,normal quality,jpeg artifacts,lowres,(blurry),(vague),ugly,poor drawing,poor painting,amateur, dysmelia,polydactyly,polymelia,oligodactyly,amelia,conjoined twins, long glabella,big eye and small eye,long neck, poor drawing,poor drawing body,poor drawing face,poor drawing head,poor drawing eye, poor drawing eyebrow,poor drawing chin,(poor drawing hand),poor drawing arm,(poor drawing finger),poor drawing leg, poor drawing posture,poor drawing anatomy,poor drawing picture,poor drawing line,poor drawing clothing, distorted,distorted body,distorted face,distorted head,distorted eye, distorted eyebrow,distorted chin,(distorted hand),distorted arm,(distorted finger),distorted leg, distorted posture,distorted anatomy,distorted drawing, distorted painting, distorted picture, malformed,malformed body,malformed face,malformed head,(malformed hand),malformed arm,(malformed finger), malformed leg,malformed posture,malformed anatomy, broken,broken face,broken head,broken eye,broken hand,broken arm,broken finger,broken leg, bad,bad body,bad face,bad head,bad eye,bad eyebrow,bad chin,(bad hand),bad arm,(bad finger),bad leg, bad hair,bad clothing,bad sock,bad shoe,bad posture,bad anatomy,bad proportion,bad drawing, bad painting, bad picture, weird,weird face,weird head,weird eye,weird eyebrow,weird chin,(weird hand),weird arm,(weird finger),weird leg, weird shoe,weird hair,weird clothing,weird sock,weird shoe,weird posture,weird anatomy,weird drawing, weird painting, weird picture, error,error drawing,error drawing line,error drawing face,error drawing head,error drawing eye,error drawing eyebrow,error drawing hand,error drawing arm,error drawing finger,error drawing leg,error drawing body,error drawing posture,error drawing anatomy,error drawing clothing, error posture,error anatomy, wrong,wrong drawing,wrong drawing line,wrong drawing face,wrong drawing head,wrong drawing eye,wrong drawing eyebrow,wrong drawing hand,wrong drawing arm,wrong drawing finger,wrong drawing leg,wrong drawing body,wrong drawing posture,wrong drawing anatomy,wrong drawing clothing, wrong posture,wrong anatomy, blurry,blurry face,blurry eye,blurry eyebrow,blurry head,blurry hand,blurry arm,blurry finger,blurry leg,blurry clothing, vague,vague face,vague eye,vague eyebrow,vague head,vague hand,vague arm,vague finger,vague leg,vague clothing, liquid face,liquid mouth, missing,(missing hand),missing arm,(missing finger) ,missing leg,missing mouth, (invisible hand),invisible arm,(invisible finger),invisible leg, (unsighted hand),unsighted arm,(unsighted finger),unsighted leg, mutated,(mutated hand), mutated arm,(mutated finger), mutated leg, too much,too much eyebrow,(too much hand),too much arm,(too much finger),too much leg, too long,too long arm,too long leg,too long neck, too short,too short arm,too short leg, small face,small head,small eye,small hand, small arm, small finger, small leg, big face,big head,big eye,big hand, big arm, big finger, big leg, dirty,dirty face,dirty drawing,dirty painting,dirty drawing line, unclean,unclean drawing,unclean painting,unclean drawing line,unclean drawing face,unclean drawing head,unclean drawing eye,unclean drawing eyebrow,unclean drawing hand,unclean drawing arm,unclean drawing finger,unclean drawing leg,unclean drawing body,unclean drawing clothing, unclean face,unclean eye,unclean eyebrow,unclean hand,unclean arm,unclean finger,unclean leg,unclean clothing, ********** Steps: 20, Sampler: DDIM, CFG scale: 7, Seed: 2495599668, Size: 832x512, Model hash: 2700c435 ------------------------------------------------ kimono girl standing and submerge half in water in flooding forest,sunshine,firefly, depth of field,blue glowing vast sky,masterpiece, ********** Negative prompt: (photo),(photograph),(realistic), cropped,out of frame,worst quality,low quality,normal quality,jpeg artifacts,lowres,(blurry),(vague),ugly,poor drawing,poor painting,amateur, dysmelia,polydactyly,polymelia,oligodactyly,amelia,conjoined twins, long glabella,big eye and small eye,long neck, poor drawing,poor drawing body,poor drawing face,poor drawing head,poor drawing eye, poor drawing eyebrow,poor drawing chin,(poor drawing hand),poor drawing arm,(poor drawing finger),poor drawing leg, poor drawing posture,poor drawing anatomy,poor drawing picture,poor drawing line,poor drawing clothing, distorted,distorted body,distorted face,distorted head,distorted eye, distorted eyebrow,distorted chin,(distorted hand),distorted arm,(distorted finger),distorted leg, distorted posture,distorted anatomy,distorted drawing, distorted painting, distorted picture, malformed,malformed body,malformed face,malformed head,(malformed hand),malformed arm,(malformed finger), malformed leg,malformed posture,malformed anatomy, broken,broken face,broken head,broken eye,broken hand,broken arm,broken finger,broken leg, bad,bad body,bad face,bad head,bad eye,bad eyebrow,bad chin,(bad hand),bad arm,(bad finger),bad leg, bad hair,bad clothing,bad sock,bad shoe,bad posture,bad anatomy,bad proportion,bad drawing, bad painting, bad picture, weird,weird face,weird head,weird eye,weird eyebrow,weird chin,(weird hand),weird arm,(weird finger),weird leg, weird shoe,weird hair,weird clothing,weird sock,weird shoe,weird posture,weird anatomy,weird drawing, weird painting, weird picture, error,error drawing,error drawing line,error drawing face,error drawing head,error drawing eye,error drawing eyebrow,error drawing hand,error drawing arm,error drawing finger,error drawing leg,error drawing body,error drawing posture,error drawing anatomy,error drawing clothing, error posture,error anatomy, wrong,wrong drawing,wrong drawing line,wrong drawing face,wrong drawing head,wrong drawing eye,wrong drawing eyebrow,wrong drawing hand,wrong drawing arm,wrong drawing finger,wrong drawing leg,wrong drawing body,wrong drawing posture,wrong drawing anatomy,wrong drawing clothing, wrong posture,wrong anatomy, blurry,blurry face,blurry eye,blurry eyebrow,blurry head,blurry hand,blurry arm,blurry finger,blurry leg,blurry clothing, vague,vague face,vague eye,vague eyebrow,vague head,vague hand,vague arm,vague finger,vague leg,vague clothing, liquid face,liquid mouth, missing,(missing hand),missing arm,(missing finger) ,missing leg,missing mouth, (invisible hand),invisible arm,(invisible finger),invisible leg, (unsighted hand),unsighted arm,(unsighted finger),unsighted leg, mutated,(mutated hand), mutated arm,(mutated finger), mutated leg, too much,too much eyebrow,(too much hand),too much arm,(too much finger),too much leg, too long,too long arm,too long leg,too long neck, too short,too short arm,too short leg, small face,small head,small eye,small hand, small arm, small finger, small leg, big face,big head,big eye,big hand, big arm, big finger, big leg, dirty,dirty face,dirty drawing,dirty painting,dirty drawing line, unclean,unclean drawing,unclean painting,unclean drawing line,unclean drawing face,unclean drawing head,unclean drawing eye,unclean drawing eyebrow,unclean drawing hand,unclean drawing arm,unclean drawing finger,unclean drawing leg,unclean drawing body,unclean drawing clothing, unclean face,unclean eye,unclean eyebrow,unclean hand,unclean arm,unclean finger,unclean leg,unclean clothing, ********** Steps: 20, Sampler: DDIM, CFG scale: 7, Seed: 353597618, Size: 832x512, Model hash: 2700c435

+2 more

@vcckvv

智能合約教學(9) NFT去中心化交易所 依照預告,這次要來實作NFT的去中心化交易所 首先實際操作一遍NFT去中心化交易所看看: https://vcckvv.github.io/SmartContract/Poolnft/ 其中用到的合約程式碼為: https://mumbai.polygonscan.com/address/0xFFC56B04A7D67fB0e565d9e938aba14c496C6060#code 1.首先還是一樣,要先有安裝MetaMask的瀏覽器外掛並且開啟起來,然後打開網頁後會要求連結MetaMask錢包、切換到Mumbai測試鏈 2.如果沒有Mumbai的MATIC幣就點選水龍頭網站連結去取得,也就是https://mumbaifaucet.com/ 3.主網頁的最下方會顯示這個帳號擁有的NFT,不過一開始沒鑄造還沒有NFT,這個網頁也只會顯示這個合約的NFT,不會像OpenSea一樣另外顯示其他合約的NFT,所以接下來我們直接去鑄造新的NFT 4.點選鑄造新的NFT的連結:https://vcckvv.github.io/SmartContract/Poolnft/mint.html ,介面如圖 5.這裡上傳圖的方式和一般NFT使用IPFS網址的方式不同,這裡允許圖上傳到任何的網頁空間或圖床網站,甚至之後圖片被刪掉也可以上傳到其他網站並修改網址,而為了保證圖片的唯一性,這裡會讀取圖片的資料並計算其sha256的hash,然後資料上鏈後就無法再改變hash,之後當我們檢視NFT時,就能透過這個hash來檢驗圖片是不是相同的資料 這裡推薦的上傳圖的網站是github給的網頁空間,不過如果有其他用的順手的上傳圖的網站也可以拿來使用,要注意有些網站不允許跨域讀取資料,所以可能可以顯示預覽圖,但是卻無法讀取資料計算出hash,這個叫CORS問題,遇到這個問題就直接換一個網站就好 上傳圖完取得圖片網址然後輸入表單欄位,確定預覽圖和hash都有顯示出來,然後輸入標題和描述,按下「鑄造」的按鈕後MetaMask會跳出視窗要簽署交易,簽署完後等待一段時間上鏈消息出來就算鑄造完成,網頁底下會產生新的NFT連結可用來檢視 值得一提的是,Mumbai測試鏈好像沒goerli鏈那麼穩定,有時會有塞車的現象,所以不一定會在30秒內完成上鏈,這時就要點選MetaMask的加速交易的功能,來快點完成上鏈 6.檢視個別的NFT網頁的介面如下圖,如果擁有創造者或擁有者的身份,則底下還會有其他的介面可以使用 7.首先是擁有者具有的拍賣功能,可以設定拍賣結束時間和直購價、起標價,如果只想要讓人直購,那麼結束時間就設成現在或過去,這樣的話一開始拍賣時間就結束,只能用直購價購買 一旦開始拍賣,在NFT列表中就會在這個NFT上額外顯示「拍賣中!」的訊息,並且點進去會有投標的介面 如果沒有人投標或是投標者就是擁有者,則擁有者可以隨時停止拍賣,但如果有別的投標者,則不能停止拍賣 一旦拍賣時間結束,這時投標者或擁有者都可以進行「完成交易」的動作,這個動作會把錢和NFT轉交過去,此時投標者才正式擁有NFT,不過要注意其他人也可以在這個時候用直購價直接買下 8.擁有者還具有傳送NFT給別人的介面功能,這個功能在拍賣中的狀態時會無法使用 9.最後是創造者和擁有者都有的「重設JSON資料」介面功能,這裡可以改掉JSON標題、描述、以及圖片網址的資料,這個功能主要是為了避免上傳的圖片網址出問題,所以可以隨時進行修改 10.和之前聊天室的功能一樣,每個帳號都可以設定自己獨有的名字,可以到這個網頁去設定:https://vcckvv.github.io/SmartContract/Poolnft/name.html 11.接下來是介紹各種NFT列表的網頁: 全部的NFT列表 - https://vcckvv.github.io/SmartContract/Poolnft/all.html 某人擁有的NFT列表 - https://vcckvv.github.io/SmartContract/Poolnft/own.html 某人鑄造的NFT列表 - https://vcckvv.github.io/SmartContract/Poolnft/creator.html 某人拍賣的NFT列表 - https://vcckvv.github.io/SmartContract/Poolnft/auction.html 某人投標的NFT列表 - https://vcckvv.github.io/SmartContract/Poolnft/bid.html 基本功能很簡單,除了全部NFT列表不用查詢外,其他網頁只要輸入帳號位址或是帳號的名字然後點選查詢的按鈕,之後就可以看到查詢的結果 而某人投標的NFT列表還要另外輸入搜尋區塊的範圍,之所以做成這樣,是因為這部份的資料沒有存在合約之中,而是使用event的方式去記錄起來,然後透過之前提到的queryFilter函數來讀取出來(需要指定搜尋區塊的範圍) 值得注意的是,Mumbai測試鏈的RPC Server在這部份運作的效能似乎比較低,在搜尋較大的區塊範圍時會拖很多時間才會回應,所以網頁有時會有卡住的樣子,因為是免費使用的RPC Server,所以這裡也不好要求太多 12.最後是Log記錄網頁:https://vcckvv.github.io/SmartContract/Poolnft/log.html 一樣是用event的方式去記錄起來,所以要輸入搜尋區塊的範圍 因為ethers.js沒有提供「時間->對應的區塊數」的函數功能,所以這裡輸入的是區塊數,然後自動顯示對應的時間 一開始預設的範圍是「24小時之前的區塊~現在的區塊」,目前的Mumbai測試鏈的出塊速度大約是6秒,所以實際在javascript中是這樣設定的: let nowBlockNum = await provider.getBlockNumber(); startBlock.value=nowBlockNum - Math.floor(24*60*60/6); endBlock.value=nowBlockNum; 雖然不算精準的設定方法但是能用就好 13.這次的做法是把NFT和交易所功能寫在同一個合約中,所以沒有之前ERC20代幣的approve問題,拍賣系統可以直接把NFT轉換到得標者的帳號而不需要再另外去做approve()的動作,因為同一個合約的內部操作都可以使用不需要權限的內部函數,比如_transfer(),一般OpenZeppelin範例的內部函數名稱都會加底線 另外一提的是,一般NFT交易所都會允許加入不同的外部NFT合約,不過那樣一來的話就需要進行嚴格的安全性檢查,這裡因為嫌麻煩就沒另外加這個功能,所以這裡所有可以拍賣交易的NFT都是這個合約本身鑄造出來的 ---------------------------------------------- Poolnft的合約主要程式碼: https://github.com/vcckvv/SmartContract/blob/gh-pages/Poolnft/Poolnft.sol 這次的合約程式碼其實沒有什麼太多好說的,用到的都是之前已經提過的技術,儲存ID集合也是使用之前用過的紅黑樹資料結構,不過還是有幾點值得提一下: 在ERC721中提供了「_mint()和_safeMint()函數」以及「_transfer()和_safeTransfer()函數」,Poolnft裡面一律使用_mint()、_transfer(),主要原因是因為_safeMint()和_safeTransfer()有可能會呼叫外部合約的函數,也就是IERC721Receiver介面的onERC721Received 這個可以在https://github.com/vcckvv/SmartContract/blob/gh-pages/Poolnft/ERC721.sol 的931行上看到,然後_checkOnERC721Received()函數會被_safeMint()和_safeTransfer()所呼叫 雖然名稱加上safe,不過在網上查了一下資料,發現有些合約就是因為這個函數呼叫而產生漏洞,所以這裡就不使用以免產生問題 ---------------------------------------------- 這次繼承的是IERC721Enumerable,而不是上次的ERC721Enumerable,所以裡面的函數都需要自己實作,包含totalSupply()、tokenOfOwnerByIndex()、tokenByIndex(),ERC721Enumerable的主要功能在於提供可以依序列出所有NFT ID的函數 另外supportsInterface()則是用來顯示這個合約有哪些ERC721的實作功能,這裡直接照抄ERC721Enumerable的函數內容就好: function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } ---------------------------------------------- function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721) { require(!auctionMap[tokenId].isActive);//拍賣時不能轉移 super._beforeTokenTransfer(from, to, tokenId);  if(from!=address(0) ){ ownMap[from].remove(tokenId); } ownMap[to].insert(tokenId); } _beforeTokenTransfer這個函數之前就只是照抄內容,不過這次要檢查不能在拍賣時進行轉移,同時如果進行轉移,就要把使用者擁有NFT ID集合進行更新的動作 ---------------------------------------------- 這次的合約程式碼就講到這裡,另外之前測試發布合約的時候遇到了一件特別的事,MetaMask直接把我發布的Poolnft合約顯示成「Rug Pull All」 我猜想可能因為這個ERC721合約有涉及到交易和提領功能,和常見的ERC721合約不同,所以誤判成詐騙合約,不過之後MetaMask似乎有做過更新,所以後來發布的合約就沒有出現相同的誤判情況 ---------------------------------------------- 這次的網頁很多,程式碼都放在這個github目錄底下:https://github.com/vcckvv/SmartContract/tree/gh-pages/Poolnft ,接下來簡單講解一些值得說的東西 ---------------------------------------------- 這次網頁程式有簡單額外判斷是否有安裝MetaMask: if(typeof window.ethereum === "undefined"){ alert("error : 尚未安裝MetaMask,此網頁需要安裝MetaMask才能使用"); throw new Error(); } ---------------------------------------------- NFT的資料需要用到base64和JSON的技術處理,好在大部份用內建的函數就可以搞定: base64解碼可以使用atob(),編碼則是使用btoa(),但要注意沒辦法直接把UTF8資料塞入btoa()中,所以另外找了個Utf8Encode()函數來轉換資料: btoa(Utf8Encode(jsonStr) ) 而要讀取JSON資料可以使用: let jsonObj=JSON.parse(decodeURIComponent(escape(uri) ) ); 這裡為了正確處理UTF8文字,所以必須加上`decodeURIComponent(escape())`的處理 ---------------------------------------------- 因為有些使用者輸入資料會顯示在網頁上,所以要做一些處理來避免「代碼注入」: function toSafeUrl(url){ return url.replace(/</g, "%3C").replace(/>/g, "%3E").replace(/'/g, "%27").replace(/"/g, "%22"); } function toSafeText(str){ return str.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;"); } 基本上就是把一些可能會被錯誤解讀的字元改成URL編碼或HTML entity碼,以避免任何可能的問題 另外因為`JSON.parse()`函數允許"\n"之類的字串自動轉換成換行字元,所以要對反斜線字元、雙引號字元、換行字元做特別的處理,這樣讀取起來才不會出差錯: function toJSONText(str){ return str.replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n'); } ---------------------------------------------- 這次的講解就到這裡,目前沒有預定接下來要講解什麼,雖然還有很多題材可以說,像是如何更新合約內容,或是常見的合約漏洞,不過因為內容更為深入,講起來也沒有像聊天室或去中心化交易所那樣有趣,所以沒有特別想說,大概之後心血來潮才會再來寫些東西 最後來簡單總結下這次學習的心得: 其實在學寫智能合約之前就覺得EVM是還不成熟的技術,實際寫了之後就更加確信了這點,寫起來限制很多,不只要注意程式不能寫太大,而且要擔心gas費不能用太多,更重要的是如果沒有花時間研究常見的漏洞,會很容易一不小心就寫出漏洞來,我寫的二個去中心化交易所合約都有遇到隔了好幾天才發現有毀滅性的漏洞 不過這還只是小事,對外行人來說智能合約可能就像是「Code is law」的具體呈現,是很去中心化的東西,不過實際上看了一些項目的合約會發現,程式碼可以設置所謂的「管理員功能」,在極端的情況下,管理員甚至有能力把合約內容換掉(比如使用代理合約的技術),也就是說管理員想做惡的話隨時可以換成惡意合約的內容,然後捲款跑人,這種東西一點也不去中心化,不過卻可以騙到那些不會看合約的人,讓人覺得把錢放在裡面就不會被搞,講難聽點,在去中心化的系統裡面構造一個可以中心化的系統,這東西就是幣圈的毒蘋果 依照我個人的觀點來看的話,EVM系統應該遲早會大改,如果不改的話大概遲早會被其他競爭者取代掉,雖然那可能是好幾年以後的事情

+7 more

@vcckvv

智能合約教學(8) NFT合約 依照預告,這次來講解怎麼寫NFT合約 首先一樣先來操作一下網站,獲得測試鏈的NFT:https://vcckvv.github.io/SmartContract/NFT/ 使用到的合約位址和程式碼: https://mumbai.polygonscan.com/address/0x8abb77ff22f8966729603bd49c5c049c4294efd5#code 這次的目標是要鑄造NFT並在OpenSea上顯示出來,因為OpenSea不支援goerli測試鏈,但是支援的rinkeby測試鏈之前有傳出不再升級、即將中止的消息(https://blog.ethereum.org/2022/06/21/testnet-deprecation/ ),所以這次是換到OpenSea另一個有支援的polygon Mumbai測試鏈 因為Mumbai測試鏈不是MetaMask內建的鏈,所以一般來說要在MetaMask中先輸入測試鏈的資料才能使用,不過這次我把新增Mumbai測試鏈的功能加到了網站之中,只要打開那個網站,MetaMask就會自動跳出要新增Mumbai測試鏈的視窗,接著也會自動要求連上Mumbai測試鏈 這邊應該沒多少人有用過Mumbai測試鏈,所以要先點網頁中的水龍頭連結https://mumbaifaucet.com/ 去取得測試鏈的原生代幣 MetaMask顯示收到MATIC幣後就可以來鑄造NFT,這個網頁有提供4種鑄造方式,前3種是同樣的兔子圖片,最後一種則是之前TEST代幣的圖標,隨便想要哪一種都可以,點選按鈕後簽署交易等待上鏈後就可以取得NFT了 接著到測試版的OpenSea上去看剛才取得的NFT:https://testnets.opensea.io/account ,如果太快打開可能OpenSea的系統還在處理所以看不到圖片,大概等交易上鏈一分多鐘後就能看到圖片了 ------------------------------------------ 接下來就來講解怎麼撰寫NFT合約,和之前撰寫ERC20代幣一樣,NFT合約實際上是符合另一個ERC721標準,只要合約中有某些特定的函數可以呼叫,那麼就會被視為NFT合約 這次一樣使用OpenZeppelin寫好的ERC721範例,來源為: https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC721 合約程式碼為: https://github.com/vcckvv/SmartContract/blob/gh-pages/NFT/NFT.sol ------------------------------------------ // SPDX-License-Identifier: MIT pragma solidity ^0.8.14; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; contract NFT is ERC721, ERC721Enumerable, Ownable { string[] uriArr; constructor() ERC721("NFT Token", "NFT") { } function mint(string memory uri) public { require(bytes(uri).length > 0); _safeMint(msg.sender, uriArr.length); uriArr.push(uri); } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(tokenId < uriArr.length); return uriArr[tokenId]; } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } } ------------------------------------------ 上面的程式碼原本有註解URI的範例輸入,不過因為之後會講到所以這裡先刪掉 ------------------------------------------ 解說: import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; 這次並沒有把OpenZeppelin的檔案從中取出放到remix上,而是使用import的形式,remix可以用這種方式,直接從github網站中讀取出需要的程式碼 不過要注意etherscan和polygonscan的Verify and Publish並不支援這種import的形式,因此我又另外弄了一個程式碼把引用到的內容都丟進來: https://github.com/vcckvv/SmartContract/blob/gh-pages/NFT/NFT_long.sol 在polygonscan上放的也是這個較長的程式碼檔案: https://mumbai.polygonscan.com/address/0x8abb77ff22f8966729603bd49c5c049c4294efd5#code ------------------------------------------ contract NFT is ERC721, ERC721Enumerable, Ownable { 這一段讓合約NFT同時繼承三個合約,意思就是同時擁有這些合約中擁有的可繼承函數和變數 Ownable的功能實際上並沒有用到,ERC721Enumerable也可以不需要使用,這邊就只是照著範例去寫,因為加了也沒什麼問題所以就沒改掉了 ------------------------------------------ string[] uriArr; 這個陣列用來儲存每個NFT的URI,後面會提到具體放的是什麼東西 一般的NFT通常是只儲存一個baseURI,在baseURI後面再加ID數字來轉換成各個NFT的URI,不過這裡讓使用者可以自由輸入自己想要的URI,所以用陣列存起來 ------------------------------------------ constructor() ERC721("NFT Token", "NFT") { } 這裡調用繼承的ERC721的建構子函數,意思是說合約NFT在產生時也會呼叫ERC721的建構子函數,如下: (在https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol 之中) constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } 所以"NFT Token"代表這個合約所有NFT的共同名字,而"NFT"代表這個合約NFT的token符號 ------------------------------------------ function mint(string memory uri) public { require(bytes(uri).length > 0); _safeMint(msg.sender, uriArr.length); uriArr.push(uri); } 進行鑄造NFT,這邊只需要呼叫繼承的函數_safeMint(),以及把輸入的URI丟到陣列uriArr之中就好 注意其中第二個參數uriArr.length就代表這次鑄造的ID,換言之第一次鑄造會是ID=0、第二次鑄造會是ID=1,依此類推 ------------------------------------------ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(tokenId < uriArr.length); return uriArr[tokenId]; } tokenURI()是用來讀取NFT的ID對應的URI,OpenSea需要呼叫這個函數才會知道NFT的圖片網址在哪裡 ------------------------------------------ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } 這二個只要照著寫就好,內容只是呼叫繼承的上層合約的函數來用(super.),沒有其他特別的用意,不過沒寫的話會出現錯誤所以就寫進來了 ------------------------------------------ 接下來解釋NFT的URI是什麼,這次提供了4種不同的URI,依序進行解說: 1.正統的IPFS星際文件系統的網址格式,比如:ipfs://QmUtb97bLLNPYTYPzCPxuLhu3q4kRcMzhtrW7W5xJVgr9B IPFS是一種網路檔案協議,可以為每一種內容不同的檔案分配一個獨一無二的網址,雖然目前並沒辦法保證檔案可以永久存在,但至少可以保證不會有內容不同的檔案共用同一個網址,所以被當作NFT這種需要永久儲存資料的建議檔案協議 這次使用的IPFS服務網站是https://www.pinata.cloud/ ,進行註冊後就可以免費上傳檔案來產生IPFS文件,不過免費版的會有流量上的限制要注意 當在裡面上傳檔案後(按下那個Upload按鈕然後選擇要上傳的檔案),網頁會給你一串代碼,比如QmUtb97bLLNPYTYPzCPxuLhu3q4kRcMzhtrW7W5xJVgr9B 把這個代碼加上ipfs:// ,就可以形成ipfs網址,也就是ipfs://QmUtb97bLLNPYTYPzCPxuLhu3q4kRcMzhtrW7W5xJVgr9B 不過這個網址沒辦法直接在一般瀏覽器上打開,如果想知道這個代碼對應的檔案內容,則需要加上「https://ipfs.io/ipfs/ 」,也就是 https://ipfs.io/ipfs/QmUtb97bLLNPYTYPzCPxuLhu3q4kRcMzhtrW7W5xJVgr9B 實際打開後我們會發現這個NFT的URI對應的檔案內容為: {"name":"raBit","description":"raBit","image":"https://ipfs.io/ipfs/QmRThPPB1PEsS6tSKdQX4p2UDm8M1EVxDHrBvuTx9dnvFe"} 這個檔案為json檔,基本上就是記錄這個NFT的名字(name)、描述(description)、和圖片網址(image),實際上最重要的只有圖片網址,名字和描述都沒有也是可以顯示在OpenSea上 也就是說如果要製造自己的NFT,首先要上傳圖片,取得圖片網址https://ipfs.io/ipfs/QmRThPPB1PEsS6tSKdQX4p2UDm8M1EVxDHrBvuTx9dnvFe ,之後再建立一個json檔把這個NFT的資料存好,再把這個json檔上傳成ipfs文件,最後用json檔的ipfs網址來進行當作URI鑄造NFT ------------------------------------------ 2.json檔的網址,比如:https://ipfs.io/ipfs/QmUtb97bLLNPYTYPzCPxuLhu3q4kRcMzhtrW7W5xJVgr9B 實際上不使用ipfs網址也可以,只要給一個網址,這個網址會給出json檔的檔案內容就可以 ------------------------------------------ 3.使用Data URI的格式來表示json檔,比如: data:application/json;base64,eyJuYW1lIjoicmFCaXQiLCJkZXNjcmlwdGlvbiI6InJhQml0IiwiaW1hZ2UiOiJodHRwczovL2lwZnMuaW8vaXBmcy9RbVJUaFBQQjFQRXNTNnRTS2RRWDRwMlVEbThNMUVWeERIckJ2dVR4OWRudkZlIn0= 可以試著把上面這串文字複製到瀏覽器的網址輸入列上然後按下enter,會發現瀏覽器會自動顯示出之前的json檔的內容,這個技術叫作Data URI,也就是把資料弄成base64編碼的文字,然後在前面加上「data:application/json;base64,」就能讓瀏覽器視為json檔 把文字轉換成base64編碼可以使用這個網站: https://www.base64encode.org/ 想要解碼的話也可以用這個網站,可以把上面的那串編碼文字丟進去看看: https://www.base64decode.org/ ------------------------------------------ 4.不只使用Data URI的格式來表示json檔,連本身包含的圖片資料也是用Data URI來表示,比如: data:application/json;base64,eyJuYW1lIjoiaWNvbiIsImRlc2NyaXB0aW9uIjoiaWNvbiIsImltYWdlIjoiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDZ0FBQUFvQ0FJQUFBQURuQzg2QUFBR3IwbEVRVlJZaGNXWWYzQlVWeFhIditmZTkvWlhOcHNmbXcwa0lWZ0lBWnFHMGdKU3RZMVd3SlpXclMyMmRPSkluYWwyT25XMFA5VFJEdTNvWUlkT2h4bFI2NHdqVXNmUkdhYlNPaTIyV29RSkZFUVVXeUFwTmlHUU5CUENralUvTm1HelNmYkhlKzhlLzNoaDgzYXorUUg5Zy9QUDIzZnZ1ZWR6enA1ejd6dnZFVFBqZW9pNEx0VHJDZGF1YVJXREdheGdwMGxJMEZVSGNCVmd4YXFqczdXOWFWZFo5TlQ4WkhjNTl3TVlKZitnWHRrYlhIdkQzZCt2WFZJdjV1d0J6VjVjek1sMDhyVTlQM3ZnbzUvTWF1N05tbTJidi81RGo4djFjY0VxRlQremZYT05kWEJXUXdBQkU2WU9OYng2MzkwUHpoejlUR0JsR2RGSFM3MWw0K3dCQUFnNWtkcXBWZ29yWk1WS2prZXN2bFlvRThDN25pOTg2ZmwzWm1CUEM0NE45TWtuS25uWnhLMG9XYVRWZnhWbXlqaXpsOGY2Si9XRTFHOSsySDN2VHZJVWNleGlZdS9YclBCSmU2YVhLaXFlYlF2NEExY0JWcXppajN0RXlKcFFjZ2U4alh2bGtnMGdvUWJheDNjMWNHTElucElMUCtWNzdDakVSSkVhcDM2ZmZPTmJHVHNSV1ZxN3JZL3l4WjFuU0xHS1BGV2VvUUlRd1NWeThaMzJuaEdoNWQ3R1AwSG90a3V1enp5Wm9RTFFGbjNXdWJVcXJLRWpQMi9nZk5uSkEyN1pmbCtnY05nNVF1N0NLeVFBa0RYclpQVmFBQ0JRMGNKc2V4cEF6b0UxMFJNbjJvN05EazZjYTZwTjdNOFE3WXVLUjJDbG5KN0lHKzRBQUdhcnM4bTUzTHJ3VHlBcnZyQUkvUEx0bDAyVkczUXV1T2NQendBZ3Fjc0ZuOVJ2YVpUelY1RFFPQlkyengrWVZGSVd4OEwyei9SN3U1Q09YOEdtVTBkZUFqTkpYWlF0bFZXcnlWdnNnN2s3dnE5ajk4WWNVTmJKWmZaOVdFbHRKRFI5N2VQdURUK0YyODlqMGRSYjN6YmI5cVgrL2lQeUZNbnF0V0JsdHYvVjZyaXlzeE5ENXZtRDJ2SXZBa2ovWTRjYU9Fc2t0QldiWFhkdUpjMWpudDhmUExDVlUxalFjOGpxYjVYbE4rVUhYenA5dUJTZzRtclhIYy9BVXdTQS9PV3VEZHZNemlZVjdVaTgrcEFJM1FoV3FyK05rN0VyVVJyR3lkMHdFeW9lU1ovNE5aZ3BVT20rNjBVcVdnQkFYL09vMlhIUVBQc1dnS0dlMDZIcHdBUEg5cFVTU0MrQTVzME1raThJNlFMQTQwTld6NytRdmYyWWxkVjFSRVUrWUNQQnFUZ0FFYXloUU1YRXRIUnJpejl2dGIvTnpCOTFIQSt0MlpKWm1KWGpvdEV1QU9yeUJhdXpDV3dCQUZ0VzV5Rms0bU1HaUtTTFBFVVVxSkxsTjRyaWhTQlNvLzAyMVhiVldkaHNqRTE0T25EV3ljcUt1RVFNQU9CVVBQbTNwL1ZJczF6ME9SWDVJUDN2WDdFeUFaQ1FWRmloMWQydjNiUkpGSDhDbWdkczhmaWdlZTRkNDczZmNpeHM3MWRPRENFVnR6TUZNMkcydm1uL1NjR3hpMDdXNU1tVmZuZDdxdW5IV1hNazJINzBBdVR5dTlZOXI2LzZCdm1DSU9sVUF5dE9ERnRkaDQzVGY3UzZqN0dRN28wNzlHWDNBR1Q4NXpmcG95OU4rSzE1ZkUrMmlHRHRsSWhGN3RiS25EaWtlejFmZmxtN2RVditCejRKOGdXMStvZTB1Z2RVNzZteEE4OFpoMSt3V3QvZ1pFeEZXbXlxSFFjNVVwQjFWa2VmOXJrS1VybG1TV2dyR3oyYlhyRkxiQlpoeTdwd1BQbmFJendTWnNCWmlmOHJYRno3Yk1ka21NNVZRNm84VHp5RjgxMjNQelVuS2dBU3BIbWdlNWc1cC82SC9OWE8yeXh3ekw5NHFpbFJYaWRLOG96bkY2VlVQTUlqa1N4bkFBQmN0c3c1bUFVT05kdy8xUlQ1Z3BCemJzMEk1QzBCT1hJSkVKaUFwWFVicGdWWHJWcVg1VDFMQUd3a2tDbVFPYkZGcGdadEtnQUlXVks3Zmxxd05xKytsK3N5dDVZTmprYzRQWjYzNDhranJOVGdlUmdKY2xLQmtSVmJ5RnM4TFJoQTlZTmJIYjREQU1kNjFIQTNsSkhwNVdiaUppNmIvLzB6VzJrNHFPVHlWV3g4SVVjekYreGIxZGp2dnkwTFBCWTFXL1p3Y2dTV09XUGNqUFNZY2ZJVnEvdW9NMVlRNmZmc3BFQmxqbmFlbmt1eDZubWlLaGpzVDhIalJoSUF1ZjJ1MjcrbnIzcUVDa0tRYnNqc05vTVZ6SVM2Zk5GNGY3ZHg4bmRJalRoYkVMbXkwYk41ejFRM3AyMzJtaDlic1hSZSs2U2U3aFdWdDJvMTYyWDFiU0pZQzNjaHJEU1A5SnFYTDJMd25IWHBmWFhwTkkvMlFSbFpqVTlnUWNFUE92T2VBZE8ydC9HMGNXajd2ZXZOdzFuYUpLQjd5RCtQQ2l1UUdsWERYV3draVpWOXVOcmJadEo3NlM3NGJyTUlMYzlyZjhhR1BoMC92blA5emZFV0FXczZuVWxEenJ3Q1VYZFoxVGYzeTZyVjArblA5SlloOUlKUFA3d2pGYXcxU2ViMGpqTkw3K3J2VkQ4WG5vR0syVi9hbU5Wd2QvckQxM3ViWHpjR3UwbzQ2ZWEwUVA3YUptQWdkRXZWVjM3aFd0UXdxM056ZUZzRXdJcFRJeXJhT1J4dWpwejVTL0RTQ1o4WlZ5d01na1lrQ0FKTUJTRlgvU2IzWFMrUzdwdmQ0RnpCVHJIU0toWldBMmQ1ZkJoRXBIdkpIWUN2VlBqblVVRm9yZyt4YXdGUGlyM3dLbkx2bEd2N0ZJR1BnN1RsdW4xOCtUK09KL05xbC9VbWlRQUFBQUJKUlU1RXJrSmdnZz09In0= 把上面這一串文字複製到瀏覽器的網址輸入列上然後按下enter,會發現瀏覽器顯示出這樣的json檔內容: {"name":"icon","description":"icon","image":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAIAAAADnC86AAAGr0lEQVRYhcWYf3BUVxXHv+fe9/ZXNpsfmw0kIVgIAZqG0gJStY1WwJZWrS22dOJInal2OnW0P9TRDu3oYIdOhxlR64wjUsfRGabSOi22WoQJFEQUWyApNiGQNBPCkjU/NmGzSfbHe+8e/3hh83az+QH9g/PP23fvuedzzp5z7zvvETPjeoi4LtTrCdauaRWDGaxgp0lI0FUHcBVgxaqjs7W9aVdZ9NT8ZHc59wMYJf+gXtkbXHvD3d+vXVIv5uwBzV5czMl08rU9P3vgo5/Mau7Nmm2bv/5Dj8v1ccEqFT+zfXONdXBWQwABE6YONbx6390Pzhz9TGBlGdFHS71l4+wBAAg5kdqpVgorZMVKjkesvlYoE8C7ni986fl3ZmBPC44N9MknKnnZxK0oWaTVfxVmyjizl8f6J/WE1G9+2H3vTvIUcexiYu/XrPBJe6aXKiqebQv4A1cBVqzij3tEyJpQcge8jXvlkg0goQbax3c1cGLInpILP+V77CjERJEap36ffONbGTsRWVq7rY/yxZ1nSLGKPFWeoQIQwSVy8Z32nhGh5d7GP0HotkuuzzyZoQLQFn3WubUqrKEjP2/gfNnJA27Zfl+gcNg5Qu7CKyQAkDXrZPVaACBQ0cJsexpAzoE10RMn2o7NDk6ca6pN7M8Q7YuKR2ClnJ7IG+4AAGars8m53LrwTyArvrAI/PLtl02VG3QuuOcPzwAgqcsFn9RvaZTzV5DQOBY2zx+YVFIWx8L2z/R7u5COX8GmU0deAjNJXZQtlVWryVvsg7k7vq9j98YcUNbJZfZ9WEltJDR97ePuDT+F289j0dRb3zbb9qX+/iPyFMnqtWBltv/V6riysxND5vmD2vIvAkj/Y4caOEsktBWbXXduJc1jnt8fPLCVU1jQc8jqb5XlN+UHXzp9uBSg4mrXHc/AUwSA/OWuDdvMziYV7Ui8+pAI3QhWqr+Nk7ErURrGyd0wEyoeSZ/4NZgpUOm+60UqWgBAX/Oo2XHQPPsWgKGe06HpwAPH9pUSSC+A5s0Mki8I6QLA40NWz7+Qvf2YldV1REU+YCPBqTgAEayhQMXEtHRriz9vtb/NzB91HA+t2ZJZmJXjotEuAOryBauzCWwBAFtW5yFk4mMGiKSLPEUUqJLlN4rihSBSo/021XbVWdhsjE14OnDWycqKuEQMAOBUPPm3p/VIs1z0ORX5IP3vX7EyAZCQVFih1d2v3bRJFH8Cmgds8figee4d473fcixs71dODCEVtzMFM2G2vmn/ScGxi07W5MmVfnd7qunHWXMk2H70AuTyu9Y9r6/6BvmCIOlUAytODFtdh43Tf7S6j7GQ7o079GX3AGT85zfpoy9N+K15fE+2iGDtlIhF7tbKnDikez1fflm7dUv+Bz4J8gW1+oe0ugdU76mxA88Zh1+wWt/gZExFWmyqHQc5UpB1Vkef9rkKUrlmSWgrGz2bXrFLbBZhy7pwPPnaIzwSZsBZif8rXFz7bMdkmM5VQ6o8TzyF8123PzUnKgASpHmge5g5p/6H/NXO2yxwzL94qilRXidK8oznF6VUPMIjkSxnAABctsw5mAUONdw/1RT5gpBzbs0I5C0BOXIJEJiApXUbpgVXrVqX5T1LAGwkkCmQObFFpgZtKgAIWVK7flqwNq++l+syt5YNjkc4PZ6348kjrNTgeRgJclKBkRVbyFs8LRhA9YNbHb4DAMd61HA3lJHp5WbiJi6b//0zW2k4qOTyVWx8IUczF+xb1djvvy0LPBY1W/ZwcgSWOWPcjPSYcfIVq/uoM1YQ6ffspEBljnaenkux6nmiKhjsT8HjRhIAuf2u27+nr3qECkKQbsjsNoMVzIS6fNF4f7dx8ndIjThbELmy0bN5z1Q3p232mh9bsXRe+6Se7hWVt2o162X1bSJYC3chrDSP9JqXL2LwnHXpfXXpNI/2QRlZjU9gQcEPOvOeAdO2t/G0cWj7vevNw1naJKB7yD+PCiuQGlXDXWwkiZV9uNrbZtJ76S74brMILc9rf8aGPh0/vnP9zfEWAWs6nUlDzrwCUXdZ1Tf3y6rV0+nP9JYh9IJPP7wjFaw1Seb0jjNL7+rvVD8XnoGK2V/amNVwd/rD13ubXzcGu0o46ea0QP7aJmAgdEvVV37hWtQwq3NzeFsEwIpTIyraORxujpz5S/DSCZ8ZVywMgkYkCAJMBSFX/Sb3XS+S7pvd4FzBTrHSKhZWA2d5fBhEpHvJHYCvVPjnUUForg+xawFPir3wKnLvlGv7FIGPg7Tlun18+T+OJ/Nql/UmiQAAAABJRU5ErkJggg=="} 然後我們再把當中原本是圖片網址的那一串「data:image/png;base64,...==」文字再複製到瀏覽器的網址輸入列上然後按下enter,會發現瀏覽器顯示出TEST幣的圖標: 也就是說我們把圖片的資料檔案也用base64編碼轉換成文字,然後因為是png檔所以在前面加上「data:image/png;base64,」來形成Data URI,把這個圖片Data URI再放到json檔,這個json檔再轉換成Data URI,最後再使用這個URI就能進行NFT的鑄造了 這個方法可以把NFT的圖片資料全部上鏈,不用擔心NFT放在網站上的資料出問題,唯一的問題就是需要花費很多的gas費來把資料上鏈 而要把圖片檔轉換成base64編碼一樣可以使用這個網站: https://www.base64encode.org/ 下面有一個Encode files to Base64 format,可以上傳圖片檔來進行base64編碼 ------------------------------------------ 最後來說一下鑄造NFT網頁中是怎麼做到新增Mumbai鏈資料的,程式碼如下: https://github.com/vcckvv/SmartContract/blob/gh-pages/NFT/index.html async function switchMumbai(){ try{ await window.ethereum.request({method: 'wallet_switchEthereumChain', params: [{ chainId: '0x13881' }],}); }catch(err){ if(err.code == 4902){//has not been added to MetaMask const chainData = [{ chainId: '0x13881', chainName: 'Mumbai', nativeCurrency:{ name: 'MATIC', symbol: 'MATIC', decimals: 18 }, rpcUrls: ['https://matic-mumbai.chainstacklabs.com'], blockExplorerUrls: ['https://mumbai.polygonscan.com/'], }]; try{ await window.ethereum.request({method: 'wallet_addEthereumChain', params: chainData,}); }catch(err2){ alert(err2.message); } } else{ alert(err.message); } } } 這個函數是先試著切換到Mumbai鏈,如果失敗的話就看錯誤碼是否為4902,是的話就代表還沒有這個鏈的資料,於是我們再使用`await window.ethereum.request({method: 'wallet_addEthereumChain', params: chainData,});`來新增Mumbai鏈的資料,chainData中包含了Mumbai鏈所有需要的資料 ------------------------------------------ 這次的解說就到這裡,下次要來實作NFT去中心化交易所,敬請期待~

@vcckvv

智能合約教學(7) 去中心化交易所 依照預告,這次要實作的是去中心化交易所 先實際操作一遍去中心化交易所看看: https://vcckvv.github.io/SmartContract/TradeCoins/ 其中用到的合約程式碼為: https://goerli.etherscan.io/address/0x756e8B0b1997a0Bc590D2e7525a7f2a54F5ff401#code 1.首先還是一樣,要先有安裝MetaMask的瀏覽器外掛並且開啟起來,然後打開網頁後會要求連結MetaMask錢包、切換到goerli測試鏈 2.接著點選「Faucet」的按鈕切換到水龍頭頁面,如果沒有goerli的ETH幣就點選水龍頭網站連結去取得,也就是https://goerlifaucet.com/ 3.之前沒有取得TEST幣的人點選「Add TEST Asset」按鈕來增加TEST代幣的資料,然後點選「Get TEST」簽署交易來獲得8個TEST代幣 4.這次新增另外一種測試代幣USD,合約程式碼在https://goerli.etherscan.io/address/0xcF364fb0cDBe5D8D4300B8030892E3e09e71D57B#code 上面可以看到,或是https://github.com/vcckvv/SmartContract/blob/gh-pages/TradeCoins/USDToken.sol ,基本上和TEST幣一樣,只是改了一些數字和名字,程式碼則是把之前多個檔案弄成一個檔案 點選「Add USD Asset」按鈕來增加USD代幣的資料,然後點選「Get USD」簽署交易來獲得1000個USD代幣 5.要注意領完幣還沒辦法進行完整的買賣,二種幣都有顯示Allowance的數字,Allowance的值代表你允許這個交易所合約可以自由動用你手中多少個代幣,這樣才有可能讓交易所把你手中的幣轉移到其他人上面以完成交易,如果為了謹慎的話可以只設定這次交易會動用到的金額數目,不過這裡為了省下麻煩,一次把Allowance設到最大,也就是2^256-1 這裡要做的事就是按下「Max TEST Allowance」、「Max USD Allowance」的按鈕後簽署交易,這樣就可以把二種幣的Allowance都調到最大 6.接下來按下「TradeCoins」按鈕回到交易頁面,上面會顯示上次的交易價格,以及排行前7低的賣單價格、排行前7高的買單價格,以及相應的掛單量,下面則是設置買賣單數據的表單 因為goerli鏈區塊產生時間通常大概12~14秒,所以這裡設定每15秒會自動更新一次顯示狀態 7.交易類型有二種:限價單(Limit Order)和市價單(Market Order),點選按鈕就能切換類型 限價單首先設定限定價格,買單要設定最大可接受價格,而賣單則是設定最小可接受價格,再設置給出的代幣數量就可以按下「Buy」、「Sell」按鈕來產生交易單子,之後放到系統中先尋找相配的買賣單進行交易撮合,同樣價格的話會優先找出較早發布的單子,然後盡可能把單子吃掉,直到自己單子的餘額不足以進行交易,或是找不到可以撮合的單子後就在系統中留下買賣單等待其他人的撮合 市價單的運作大致相同,但是吃完符合條件的單子後不會在系統中留下買賣單,而且可以把價格設為0或留空,這樣買單會自動變成價格最大值,賣單則自動變成價格最小值,會一直吃單子直到系統再也沒有單子為止,要注意市價單不會檢查有沒有吃到單子,所以也可能遇到沒吃到單子就結束交易的情況發生 為了方便,在填入價格或給出數量時會計算相應的獲得數量,或是填入獲得數量而計算出需要多少給出數量 在填入數字時會進行檢查,如果不是正常數字,那麼文字會變成紅色代表填錯了,而且代幣都會有限制小數點後的位數數量,一般代幣都是限制小數點後最多18位,而這裡的TEST幣則是小數點後最多2位 8.一旦在系統中留下單子後,可以按下「User」按鈕來到使用者的買賣單頁面,這邊可以看到目前手中有多少單子,以及這些單子內容的數據,按下「Delete Order」按鈕的話就可以把那個單子取消掉,合約系統會把裡面的餘額退給你 9.按下「Orders」按鈕可以看到系統中現在存在的單子,買賣單最多顯示前100名的單子,這個功能只是用來方便除錯 10.按下「Log」按鈕可以看到系統中所有記錄,這個記錄是用event的功能去產生的,之後會提到如何實作,記錄類型分成四種:AddOrder(增加買單或賣單)、DelOrder(取消單子)、TradeOrder(交易撮合)、Transfer(轉移代幣),這裡可以輸入區塊數來看特定時間範圍內的記錄 11.之後可以按上面的「Trading Pair」下拉選單,可以換成其他的交易對,這個系統預設有三種交易對:「ETH-TEST」、「USD-ETH」、「USD-TEST」,Log記錄或資料狀態都是分開來顯示的 ------------------------------------------ 系統介紹大概就是這樣,下面我們開始來講解程式碼,因為程式碼很多,所以這次就不全部貼上來只是重點式地講解,首先是合約程式碼的部份: https://github.com/vcckvv/SmartContract/blob/gh-pages/TradeCoins/TreeLibrary.sol https://github.com/vcckvv/SmartContract/blob/gh-pages/TradeCoins/TradeCoins.sol ------------------------------------------ 這次的程式會把買賣單進行排序,並要能夠把排名前幾的單子依序列出來,所以會用到紅黑樹的資料結構,不過solidity並沒有內建提供這種資料結構(mapping不能依序列出所有資料),所以這邊是使用別人寫好的紅黑樹程式: https://github.com/bokkypoobah/BokkyPooBahsRedBlackTreeLibrary/blob/master/contracts/BokkyPooBahsRedBlackTreeLibrary.sol 因為裡面沒有讀取節點數量的函數,以及檢查是否為空集合的函數,所以自己有簡單做了修改,其他部份則不變: https://github.com/vcckvv/SmartContract/blob/gh-pages/TradeCoins/TreeLibrary.sol 不過要使用solidity的資料結構必須先了解library和using for的使用方法,以下是簡單的範例: struct Data{ uint value; } library DataLib{ function setValue(Data storage self, uint v) external { self.value=v; } } contract Test{ using DataLib for Data; Data data; function test() public { data.setValue(123);//相當於呼叫DataLib中的setValue(data, 123) } } 個人不太喜歡這種設計,不過目前只能用這種方法來實作資料結構的話也只能習慣它 注意這裡的TreeLibrary只會儲存key,而不會儲存key對應的value,所以如果想使用C++中map那樣的資料結構的話,那麼就要用solidity的mapping去另外儲存映射資料,像是等下會說到的PriceTree 買賣單的資料結構是先以價格為key的紅黑樹PriceTree,然而同一個價格可能會存在多個單子,所以還需要另一個以單子ID為key的紅黑樹OrderTree: struct OrderTree{ TreeLibrary.Tree tree; } struct PriceTree{ TreeLibrary.Tree tree; mapping(uint => OrderTree) values; } 而在使用上,要判斷是不是沒有資料節點可以用`isEmpty()`,取得總節點數量可以用`getCount()`,判斷節點存不存在可以用`exists(key)`,插入新的節點可以用`insert(key)`,刪除則是用`remove(key)`,在PriceTree中取出key相對應的value可以用`getValue(key)` 如果要從小到大依序取出各個key,則是使用如下的方式: uint key=tree.first();//取得第一個key uint lastKey=tree.last();//取得最後一個key while(true){ ...//處理key的程式碼 if(key==lastKey){ break; } key=tree.next(key);//取得下一個key } 而如果要倒過來從大到小依序取出各個key,則是使用如下的方式: uint key=tree.last();//取得最後一個key uint firstKey=tree.first();//取得第一個key while(true){ ...//處理key的程式碼 if(key==firstKey){ break; } key=tree.prev(key);//取得上一個key } ------------------------------------------ 這次寫合約程式遇到的最大的麻煩是:Contract code size exceeds 24576 bytes 這個問題是因為合約編譯後的二進位資料限制最多只能有24576 bytes,所以你只要稍微寫大一點的合約程式,就會跳出這個警告,如果無視這個警告,那麼實際發布的時候就很可能會失敗,不過即使沒有這個限制,每個區塊依然會有gas上限,所以發布的合約資料仍然存在上限大小 那麼為了要解決這個問題,我們需要把合約中的程式碼一部份搬到library中實作,比如以下的範例函數: 原本的合約: contract Test{ function f(uint a) public { ...(很多的程式碼) } } 改造後的合約: library TestLib{ function f(uint a, Test test) external { ...(很多的程式碼,使用test存取合約中的資料) } } contract Test{ function f(uint a) public { TestLib.f(a, this); } } 不過因為有很多合約資料是不能讓外人隨意設定的,所以我實際在寫時還會用一個布林變數來加一道安全鎖: library TestLib{ function f(uint a, Test test) external { ...(很多的程式碼,使用test.data()和test.setData()來存取合約中的資料) } } contract Test{ uint public data; bool isLibCall=false; function setData(uint v) external { require(isLibCall);//只有TestLib才可以使用這個函數 data=v; } function f(uint a) public { isLibCall=true;//解鎖 TestLib.f(a, this); isLibCall=false;//加鎖  } } 注意這個方法要很確定`TestLib.f()`不會呼叫任何未知內容的外部合約函數,否則就等同把重大的修改權限交給其他人來使用 這次把合約TradeCoins的程式碼拆出一部份到TradeCoinsLib基本上就是按照這個架構在寫 ------------------------------------------ 第二個遇到的大問題是Stack Too Deep,意思就是EVM運行的Stack很小,所以只要在函數中多塞點local變數就會出現這個錯誤,這個時候就只能產生另外一個函數,呼叫這個函數來把一些需要local變數的操作移到其他的地方,或是使用struct把多個local變數包成一個local變數來操作 這次有用到的部份是Trade這個event(後面會解釋什麼是event),如果直接emit event的話就會跳出這個錯誤,所以我把它用另外一個函數eventTrade包裝起來,而且輸入參數是使用struct的TradeData(後面會說到),一樣把多個變數包成一個變數: event Trade(uint time, TradeType tradeType, address indexed buyUser, address indexed sellUser, uint32 indexed pairID, uint price, uint buyValue, uint sellValue, uint orderID, bool isEndOrder); function eventTrade(TradeData memory data) internal { emit Trade(block.timestamp, data.tradeType, data.buyUser, data.sellUser, data.pairID, data.price, data.buyValue, data.sellValue, data.orderID, data.isEndOrder); } ------------------------------------------ 還沒介紹過event,所以接下來講解一下,以下是範例: contract Test{  event msg(uint indexed key1, uint indexed key2, string memory message);//用indexed來設定key變數   function f() public { emit msg(1, 2, "message"); } } 一旦我們執行Test中f()這個函數,就會在鏈上留下一段記錄`msg(1, 2, "message")`,但這個記錄無法被合約存取,因為不被視為儲存的storage資料,不過我們可以在javascript中使用filter和queryFilter函數把這些資料讀取出來: let filter = testContract.filters.msg(); let data = await testContract.queryFilter(filter, startBlockNum, endBlockNum); 假設我們有執行過一次f(),並且資料是在區塊startBlockNum~endBlockNum之間,則我們會讀到data.length==1,並且可以用data[0].args[0]、data[0].args[1]、data[0].args[2]來各別取出key1、key2、message的資料 如果我們要指定某些key變數用來過濾搜尋的話,則可以這樣設定filter: let filter1 = testContract.filters.msg(key1);//符合key1就好 let filter2 = testContract.filters.msg(key1, key2);//符合key1和key2 let filter3 = testContract.filters.msg(null, key2);//符合key2就好 另外要注意indexed變數最多只能設3個,也就是只有三個變數能被當作key event的方便之處在於消耗gas會比一般的儲存資料要便宜很多,而且很適合用來除錯,可以檢視一些重要資料的狀態變化 這次為了方便log頁面一次把所有種類的記錄都顯示出來,所以把四種記錄都做成同一個event,然後用enum設計出四種種類的名字(AddOrder, DelOrder, TradeOrder, Transfer),而實際上在讀取tradeType的時候會是對應0~3的數字,然後有些欄位的變數在某些種類中不會被用到,有些變數則在某些種類中有別的意義: enum TradeType{ AddOrder, DelOrder, TradeOrder, Transfer } struct TradeData{ TradeType tradeType; address buyUser;//Transfer: fromAddr address sellUser;//Transfer: toAddr uint32 pairID; uint price; uint buyValue;//Transfer: token1Value uint sellValue;//Transfer: token2Value uint orderID; bool isEndOrder; } ------------------------------------------ 補上之前沒講到的修飾詞storage,以下面程式為例: Order memory order1=orderMap[id]; Order storage order2=orderMap[id]; order1是複製過來暫時的資料,所以對其進行寫入不會改到鏈上的資料 order2則是指向鏈上的資料,所以對其進行寫入會改到鏈上的資料,另外進行存取時所花費的gas費也會比較貴,所以原則上處理過程中盡量使用memory變數 另外像數值型態的區域變數,如uint、address、bool,都是不能加上修飾詞storage、memory,預設上都是memory存取,只有參考型態的區域變數,像是struct資料、mapping、array才可以使用storage去存取 ------------------------------------------ 這次有用到二種特別的變數修飾詞:immutable和constant address immutable founderAddr; uint constant public cnPriceStd=1018;//1018等同10的18次方 immutable代表這個變數在經過一開始constructor()執行後就不再改變數值,設定這個修飾詞可以使這個變數之後的讀取gas費都變少,就如同被當作不變的常數看待 constant就代表這個數是不變的常數,再加上public代表這個變數可以被外部讀取,不過外部讀取時要以函數的形式進行呼叫,也就是`cnPriceStd()` ------------------------------------------ 這次有用到另外三種函數修飾詞:internal、private、external internal代表這個函數只能被內部呼叫、不能被外部呼叫,不過可以進行繼承,private也是一樣只能被內部呼叫,不過不能被繼承 external則是反過來只能被外部呼叫、不能被內部呼叫,看資料說設定這樣的函數可以比全設成public函數要稍微省一些gas費 另外要注意,在library中的internal函數如果被contract引用,則程式碼資料會算在contract之中,所以要用public或external才不會讓contract變肥大 ------------------------------------------ 這次在吃單的過程中傳送原生代幣的方法是使用send()函數,而不是之前提到的transfer()函數,如下: function sendOrgCoin(address addr, uint value) internal { if(payable(addr).send(value)==false){ //遇到特殊合約可能出錯,這裡跳過錯誤,避免單子沒辦法被吃掉而卡住 } } send()和transfer()的差別在於send()出錯的話會回傳、繼續執行後續操作,而transfer()則是讓整個交易無效、後面的操作都無法執行 那麼什麼情況會出現傳送原生代幣錯誤呢,原因在於其他合約也可以成為交易者,並且呼叫這個合約的交易函數進行交易,但是傳送原生代幣給交易者合約時可以觸發那個合約的fallback函數,如下: contract FailSend { fallback() external payable { revert(); } } (在0.6.X之前的編譯器版本可以用沒有名字的函數當作fallback函數,不過現在新版就是寫成這樣) fallback函數會在二種情況下觸發,第一種是呼叫合約的函數時,但是其函數名字不符合現有函數的任一個,第二種是傳原生代幣給這個合約的位址,而上述的合約會使得任何傳送代幣的動作都會失敗,因為都會執行到revert() 為了避免遇到這種情況,所以我們這裡選擇使用send()來跳過錯誤,而不是用transfer()讓整個吃單系統卡住 ------------------------------------------ 雖然合約程式碼看起來很多,不過如果上面這些新講的東西都懂,然後也懂得基本的系統運作的話,那麼其他的部份閱讀起來應該都沒有問題,這裡就不再詳細解說裡面的細節,來談一下發布時會遇到的情況: 這次主要發布的合約是TradeCoins,因為裡面用到3個library:PriceTreeLib、OrderTreeLib、TradeCoinsLib,這些library要在TradeCoins發布之前都先發布出去,不過幸好remix可以幫我們依序發布並自動做好連結library,所以我們在發布的時候一樣只要選擇TradeCoins來發布,然後就會依序先把三個library發布,最後再發布出TradeCoins,過程就是簽署完等到上鏈後再簽署下一筆交易 另外,如果要在etherscan中進行Verify and Publish,那麼最好先把多個檔案的內容塞成一個檔案,然後在輸入程式碼的底下有一項Contract Library Address,在這裡輸入要連結的三個library和名字和發布位址,如果沒這麼做就會驗證失敗,比如這次的發布位址是: OrderTreeLib: 0xD94631D7f498cE63a3CC843a3A8302569E47c4ff PriceTreeLib: 0xFFC56B04A7D67fB0e565d9e938aba14c496C6060 TradeCoinsLib: 0x6344F360E4AE1bcF461A71843CbF92540a9Da023 ------------------------------------------ 接下來轉移到網頁程式碼的解說部份: https://github.com/vcckvv/SmartContract/blob/gh-pages/TradeCoins/index.html 網頁的部份一樣不談論JavaScript和HTML的操作,之前有說過的web3的部份也不用多說,主要談這次有用到的新東西: 這段程式碼可以讀取到現在最新的區塊數 let nowBlockNum = await provider.getBlockNumber(); 這段程式碼可以讀取到特定區塊的時間(timestamp),然後再用我寫好的timestampToStr函數去把它轉成字串 timestampToStr((await provider.getBlock(startBlockNum) ).timestamp); ------------------------------------------ 在ethers函數庫中有提供`ethers.utils.formatUnits()`和`ethers.utils.parseUnits()`的函數來進行數字字串和BigNumber之間的轉換,比如: ethers.utils.formatUnits("1000000000000000000", 18);//產生1.0,相當於把數字除於10^18 ethers.utils.parseUnits("1.0", 18);//產生值為1000000000000000000的BigNumber,相當於把數字乘於10^18 實際使用上有些限制,所以我又另外寫了一個formatUnits()函數,可以進行正數或負數的位數轉換 而ethers函數庫的BigNumber可以做一些整數加減乘除、比較大小的運算,完整用法可以參考ethers的網頁說明: https://docs.ethers.io/v5/api/utils/bignumber/ ------------------------------------------ 其他的部份感覺就不用特別詳細解說了,有問題的話就另外留言問吧 這次難度好像有點跳太高了,不過如果只是單純講解solidity的各種語法還蠻無聊的,試著建立一個系統然後從中學習需要的東西,對我來說還是比較有趣一些 寫完後回顧了一下這個掛單簿系統,其實覺得掛單的gas費太貴,並不是適合實際上線的系統,所以一般才會採用AMM(Automated Market Maker,自動化做市商)的系統設計,AMM雖然也有缺點但好處就是交易gas費沒那麼貴,如果要做出有實用性的掛單簿系統可能要學dydx項目那樣在鏈下進行交易撮合,之後再把結果放到鏈上,不過那樣系統就太複雜了 想說的差不多就是這樣,這次就講解到這裡,下次來談談怎麼製作NFT合約

+3 more

@vcckvv

智能合約教學(6) Web3聊天室 依照預告,這次要利用區塊鏈功能來打造一個Web3線上聊天室 Web3線上聊天室基本上就是全部的文章都會上鏈,不過這次寫的聊天室功能很陽春,沒有修改或刪除等功能,唯一有的額外功能是可以設定使用者帳戶的名字,比起位址要更好認出是誰 那麼就直接先來體驗一下:https://vcckvv.github.io/SmartContract/CoolChat/ 使用的合約在這裡:https://goerli.etherscan.io/address/0xc9e45809aaca0c8aa485d1bd558276e03e9451f6#code 這裡簡單介紹一下使用的方法: 1.沒有MetaMask錢包的人要安裝MetaMask錢包瀏覽器外掛 2.因為發文章或設定名字都需要goerli測試鏈的gas費,所以要先到goerli的水龍頭網站領取代幣:https://goerlifaucet.com/ 3.接下來打開CoolChat的網頁,會自動跳出MetaMask視窗要求和錢包帳戶連線以及切換到goerli測試鏈 4.然後設定帳戶名字,在「名字」的文字輸入框中輸入想要的名字,設定上最多30個文字,且不能設成別人已經設定的名字,接下來按下「設定名字」的按鈕,MetaMask會跳出交易簽署視窗,confirm後等待上鏈完成就算設定成功,goerli上鏈時間一般在半分鐘內就會完成,且MetaMask會自動跳出成功的通知 稍微提醒一下,在簽署交易時檢查所在鏈、費用、和合約內容算是蠻重要的事,大家最好養成習慣 5.要發文也是相同的做法,在「輸入文章內容」下面的文字輸入框中輸入文章內容,設定上最多1000個文字,接下來按下「設定名字」的按鈕,MetaMask會跳出交易簽署視窗,confirm後等待上鏈完成就算發文成功,此時頁面會自動更新,可以看到自己的文章顯示在列表的上面 注意簽署交易的速度不要太快,要等上一筆的交易上鏈後再發,否則一般都會導致交易失敗,這可能跟交易的nonce數的某些安全限制有關 6.設定上每頁最多顯示20篇文章,文章列表最下面可以選擇要看的頁面,點選後會自動捲動頁面到最上面,選擇不同頁面時不會更新總文章數,所以不會點一點就因為新文章的出現而顯示出不連續的文章編號,如果要看更新的文章只要重新整理頁面就可以了 7.這個聊天室寫下的東西都會永久記錄到goerli測試鏈,所以除非goerli測試鏈被官方停掉,都不需要擔心資料消失的問題,網頁本身實際上也只是靜態網頁,複製放到其他伺服器上也能馬上運作 接下來看一下完整的合約程式碼: https://github.com/vcckvv/SmartContract/blob/gh-pages/CoolChat/CoolChat.sol --------------------------------------- pragma solidity ^0.8.0; // SPDX-License-Identifier: CC-BY-SA-4.0 contract CoolChat { address founderAddr; mapping (address => string) addrNameMap; mapping (string => bool) nameUseMap; address[] writerArray; string[] writerNameArray; uint256[] timeArray; string[] articleArray; constructor() { founderAddr = msg.sender; } function getArticleCount() public view returns (uint256 index) { return articleArray.length; } function getArticle(uint256 index) public view returns (address, string memory, uint256, string memory) { require(index<articleArray.length); return (writerArray[index], writerNameArray[index], timeArray[index], articleArray[index]); } function getArticles(uint256 index, uint256 count) public view returns (address[] memory, string[] memory, uint256[] memory, string[] memory) { require(count>=1); require(index+count-1<articleArray.length); address[] memory outWriterArray=new address[](count); string[] memory outWriterNameArray=new string[](count); uint256[] memory outTimeArray=new uint256[](count); string[] memory outArticleArray=new string[](count); for(uint i=0; i<count; i++){ outWriterArray[i]=writerArray[index+i]; outWriterNameArray[i]=writerNameArray[index+i]; outTimeArray[i]=timeArray[index+i]; outArticleArray[i]=articleArray[index+i]; } return (outWriterArray, outWriterNameArray, outTimeArray, outArticleArray); } function addArticle(string memory str) public { require(bytes(str).length>0 && bytes(str).length<=3000);//utf8中文字最多1000字 writerArray.push(msg.sender); writerNameArray.push(addrNameMap[msg.sender]); timeArray.push(block.timestamp); articleArray.push(str); } function testMassArticle(uint256 num) public { require(msg.sender==founderAddr); string memory name=addrNameMap[msg.sender]; string[4] memory strArray=["0", "1", "2", "3"]; for(uint i=0; i<num; i++){ writerArray.push(msg.sender); writerNameArray.push(name); timeArray.push(block.timestamp); articleArray.push(strArray[i%4]); } } function isUsedName(string memory name) public view returns (bool) { return nameUseMap[name]; } function getWriterName(address addr) public view returns (string memory) { return addrNameMap[addr]; } function setWriterName(string memory name) public { require(bytes(name).length>0 && bytes(name).length<=90);//utf8中文字最多30字 require(nameUseMap[name]==false); string memory oldName=addrNameMap[msg.sender]; if(bytes(oldName).length!=0){ nameUseMap[oldName]=false; } nameUseMap[name]=true; addrNameMap[msg.sender]=name; } } --------------------------------------- 解說: pragma solidity ^0.8.0; // SPDX-License-Identifier: CC-BY-SA-4.0 這次換到版本0.8.0主要是因為會用到新的版本的功能,舊版的預設上沒辦法回傳陣列形式的變數,所以就改到了新版 SPDX-License-Identifier這段雖然是註解,但是沒加入的話會產生警告,基本上這個功能就是用來宣告版權,如果有其他偏好的版權的話可以參考這個網頁的代碼來設定:https://spdx.org/licenses/ --------------------------------------- address founderAddr; 用來存放建立合約者的帳戶位址,設定這個之後可以讓某些函數只能讓建立合約者來操作 --------------------------------------- mapping (address => string) addrNameMap; mapping (string => bool) nameUseMap; 映射的資料結構,就是給一個key值然後取出相應的資料的這樣的資料結構,不過使用上和C++的map的功能差很多,這個沒辦法從小到大一筆一筆資料列出來,如果想要更複雜的操作的資料結構都需要自己寫 addrNameMap用來儲存帳戶位址的名字,nameUseMap則用來判斷名字是不是已經有人使用 --------------------------------------- address[] writerArray; string[] writerNameArray; uint256[] timeArray; string[] articleArray; 文章的資料以陣列的形式來呈現,而且是把三種資料分開存放:寫的人的帳戶位址、寫的人設定的名字、文章時間、文章內容 其中文章時間是以timestamp形式來存放,所以是uint256,在javascript中使用以下的方式來轉換成一般的時間格式: let time = new Date(timestamp * 1000); let year = time.getFullYear(); let month = time.getMonth()+1; let date = time.getDate(); let hour = time.getHours(); let min = time.getMinutes(); let sec = time.getSeconds(); --------------------------------------- constructor() { founderAddr = msg.sender; } 如之前所述,constructor()只有在建立合約時才會呼叫,所以這裡的msg.sender就是建立合約者的帳戶位址 --------------------------------------- function getArticleCount() public view returns (uint256 index) { return articleArray.length; } 取得目前的總文章數,articleArray.length就是文章陣列的資料數目 --------------------------------------- function getArticle(uint256 index) public view returns (address, string memory, uint256, string memory) { require(index<articleArray.length); return (writerArray[index], writerNameArray[index], timeArray[index], articleArray[index]); } 取得一篇文章的資料,原本只寫了這個函數來讀取文章,不過實際測試時發現一篇一篇讀取的速度太慢了,所以下面又寫了一次讀取多個文章的函數getArticles 這裡用到了require()來檢查輸入參數是不是有問題,如果在require()中檢查出了問題就會讓這筆合約互動交易失效,之前做的所有更動都會復原,要注意如果是寫入性質的函數,一旦交易上鏈,那麼如果中途檢查錯誤而導致復原,這樣也會消耗到gas費 另外還有assert()、revert()、throw的寫法,不過一般用require()檢查就夠用了 --------------------------------------- function getArticles(uint256 index, uint256 count) public view returns (address[] memory, string[] memory, uint256[] memory, string[] memory) { require(count>=1); require(index+count-1<articleArray.length); address[] memory outWriterArray=new address[](count); string[] memory outWriterNameArray=new string[](count); uint256[] memory outTimeArray=new uint256[](count); string[] memory outArticleArray=new string[](count); for(uint i=0; i<count; i++){ outWriterArray[i]=writerArray[index+i]; outWriterNameArray[i]=writerNameArray[index+i]; outTimeArray[i]=timeArray[index+i]; outArticleArray[i]=articleArray[index+i]; } return (outWriterArray, outWriterNameArray, outTimeArray, outArticleArray); } 取得多篇文章的資料,從index開始取得count個文章,然後回傳4個陣列變數,注意4個陣列在一開始就必須設定好空間大小,因為memory的陣列不能使用push()一個一個動態塞入,只有storage的鏈上陣列資料才能這樣做,下面提到的函數addArticle()就是用動態的方式塞入新資料 值得一提的是,在JavaScript中有回傳多個變數時是以陣列的形式來呈現: let data = await contract.getArticles(startIndex, getCount); 接著就可以用data[0][index]、data[1][index]、data[2][index]、data[3][index]來讀取各別文章的資料 --------------------------------------- function addArticle(string memory str) public { require(bytes(str).length>0 && bytes(str).length<=3000);//utf8中文字最多1000字 writerArray.push(msg.sender); writerNameArray.push(addrNameMap[msg.sender]); timeArray.push(block.timestamp); articleArray.push(str); } 增加一篇文章的函數,utf8一個中文字一般會有3 bytes,所以限制1000字的話要給3000 bytes限制,不過這也意味著實際上可以塞到3000個英文字 值得注意的是string沒有提供length的功能,所以要先轉成bytes才能知道string的長度 `block.timestamp`代表現在區塊的時間 --------------------------------------- function testMassArticle(uint256 num) public { require(msg.sender==founderAddr); string memory name=addrNameMap[msg.sender]; string[4] memory strArray=["0", "1", "2", "3"]; for(uint i=0; i<num; i++){ writerArray.push(msg.sender); writerNameArray.push(name); timeArray.push(block.timestamp); articleArray.push(strArray[i%4]); } } 因為測試的時候需要產生大量的文章,所以一篇一篇產生太浪費時間也比較浪費gas,這裡寫了一個函數可以大量新增文章,使用`require(msg.sender==founderAddr)`來確保只有建立合約的人才能使用這個測試函數,這個就是之前提到的管理員專用的函數 --------------------------------------- function isUsedName(string memory name) public view returns (bool) { return nameUseMap[name]; } 檢查名字是否已經被使用 --------------------------------------- function getWriterName(address addr) public view returns (string memory) { return addrNameMap[addr]; } 取得帳戶位址現在設定的名字 --------------------------------------- function setWriterName(string memory name) public { require(bytes(name).length>0 && bytes(name).length<=90);//utf8中文字最多30字 require(nameUseMap[name]==false); string memory oldName=addrNameMap[msg.sender]; if(bytes(oldName).length!=0){ nameUseMap[oldName]=false; } nameUseMap[name]=true; addrNameMap[msg.sender]=name; } 設定帳戶位址的名字,除了基本的檢查之外,要注意把舊的名字設回沒有使用 solidity中要檢查空字串的話要直接看其長度是否為0 --------------------------------------- 合約的程式碼解說就到這裡,至於HTML、JavaScript的程式碼就比較沒什麼想特別說的,Web3的部份的功能都是之前有提到過的,想看程式碼的人可以到這裡看:https://github.com/vcckvv/SmartContract/blob/gh-pages/CoolChat/index.html 這次的合約程式碼雖然比之前複雜,不過基本的邏輯運作還是很簡單,下一篇要來挑戰更難的去中心化交易所,會用到比較複雜的資料結構和介面操作

@vcckvv

智能合約教學(5) 把代幣存到合約和外部合約呼叫 這次要來介紹怎麼把代幣存到合約中,然後讓合約來處理自己的資產,順便也會提到怎麼在自己合約中呼叫別的鏈上合約的函數 代幣分成二種:原生代幣和ERC20代幣,這次二種都會用到,原生代幣就像以太坊中的以太幣,本身並沒有ERC20合約在運作,其轉移的方式是直接透過區塊鏈系統本身,而非透過合約 接下來我們直接看這次的合約程式碼: https://github.com/vcckvv/SmartContract/blob/gh-pages/DepositCoin/DepositCoin.sol -------------------------------------- pragma solidity ^0.4.0; interface Token{ function balanceOf(address owner) external view returns (uint256); function transfer(address to, uint256 value) external returns (bool); function transferFrom(address from,address to,uint256 value)external returns (bool); } contract DepositCoin { address tokenAddr; function getContractBalance() public view returns (uint256) { return address(this).balance; } function pay() public payable{ } function withdraw() public{ msg.sender.transfer(1 wei); } function withdraw(uint256 v) public{ msg.sender.transfer(v); } function setTokenAddr(address addr) public{ tokenAddr=addr; } function getTokenAddr() public view returns (address) { return tokenAddr; } function getTokenBalance() public view returns (uint256) { Token t = Token(tokenAddr); return t.balanceOf(msg.sender); } function getContractTokenBalance() public view returns (uint256) { Token t = Token(tokenAddr); return t.balanceOf(this); } function depositToken(uint256 v) public{ Token t = Token(tokenAddr); t.transferFrom(msg.sender, this, v); } function withdrawToken(uint256 v) public{ Token t = Token(tokenAddr); t.transfer(msg.sender, v); } } -------------------------------------- 解說: interface Token{ function balanceOf(address owner) external view returns (uint256); function transfer(address to, uint256 value) external returns (bool); function transferFrom(address from,address to,uint256 value)external returns (bool); } 由於這次我們會呼叫到鏈上其他合約的函數,所以要先建立一個interface資料,裡面包含需要呼叫的函數,之後我們會再提到要怎麼去呼叫 注意這裡不用把ERC20的所有函數都列出來,只需要列出有呼叫到的部份就好 -------------------------------------- function getContractBalance() public view returns (uint256) { return address(this).balance; } 這個函數可以讀取這個合約自身擁有多少原生代幣,`this`是指這個合約本身,`address(this)`就是這個合約發布的位址,`.balance`則是讀取位址的餘額 -------------------------------------- function pay() public payable{ } 這個payable函數在執行時可以另外給出指定數目的原生代幣給合約,除了接收代幣之外沒有其他功能所以無內容,不過某些合約會額外進行emit event的動作,這個之後有想做的時候再來詳細講解 (補充:呼叫者傳了多少原生代幣,可以用`msg.value`來讀取) 當我們在Remix上用內建虛擬機進行操作時,介面中有一個VALUE輸入框,旁邊可以指定不同單位:Wei、Gwei、Finney、Ether,在VALUE輸入框輸入想要傳送的原生代幣數值後,此時按下紅色的pay函數按鈕就可以傳送原生代幣給合約 另外一提,在JavaScript上執行payable函數是這樣: const options = {value: ethers.utils.parseEther("0.00000001")};//指定傳送0.00000001 Ether給合約 let tx = await contractWithSigner.pay(options); pay函數本身沒有參數,所以是加一個options的參數,如果pay函數本身有多個參數,則options的參數會加到所有參數的最後面去,比如: let tx = await contractWithSigner.pay(param1, param2, options); 完整的測試運作程式碼在https://github.com/vcckvv/SmartContract/blob/gh-pages/DepositCoin/index.html 可以到https://vcckvv.github.io/SmartContract/DepositCoin/ 上面進行測試運作,按下那個pay按鈕就會執行上面說的pay()函數 要查詢結果或進行其他的功能可以到https://goerli.etherscan.io/address/0x416d91a77948ca36f79a9609c239a41bd5e0e566#readContract 的合約互動介面上去做,因為沒其他新東西所以這次不另外講解網頁程式碼 另外一樣要注意一下如果有多個人同時進行測試,有可能會產生意外的結果,這個時候就要注意這個合約的交易狀況: https://goerli.etherscan.io/address/0x416d91a77948ca36f79a9609c239a41bd5e0e566 -------------------------------------- function withdraw() public{ msg.sender.transfer(1 wei); } function withdraw(uint256 v) public{ msg.sender.transfer(v); } 這裡寫了二種出金函數,一種是執行後會固定傳送原生代幣1 wei給使用者,另一種則是可以指定傳送的數量有多少wei,因為輸入參數不同,所以用同樣的函數名也可以 `msg.sender.transfer(v)`這個程式碼的實際作用是把合約的原生代幣傳給`msg.sender` 另外除了wei這個單位外,還有`gwei`(10^9 wei)、`ether`(10^18 wei)的單位可以用 -------------------------------------- 補充一下,solidity目前沒內建支援浮點數,所以原生代幣和ERC20代幣的數值都是採用「uint256儲存和處理數值」+「固定位數的小數點顯示」的方式來呈現,原生代幣1 wei就是最低單位 -------------------------------------- function setTokenAddr(address addr) public{ tokenAddr=addr; } 這個函數是用來設定ERC20代幣合約的位址,設定完之後我們才可以使用其他的函數來轉移這種ERC20代幣,而我們測試的當然是之前創造的TestToken,合約位址為:0x63E1ddeB828eD1634B3165f56e2F31950b4d0B93 沒拿過的人可以到https://vcckvv.github.io/SmartContract/TestToken/ 的水龍頭網站領取 -------------------------------------- function getTokenBalance() public view returns (uint256) { Token t = Token(tokenAddr); return t.balanceOf(msg.sender); } function getContractTokenBalance() public view returns (uint256) { Token t = Token(tokenAddr); return t.balanceOf(this); } 這二個函數是用來讀取使用者帳戶或這個合約中擁有的ERC20代幣數量,使用我們之前設定好的interface Token以及代幣合約的位址,就能呼叫代幣合約的balanceOf函數 -------------------------------------- function depositToken(uint256 v) public{ Token t = Token(tokenAddr); t.transferFrom(msg.sender, this, v); } 這個函數是把使用者帳戶的ERC20代幣存到這個合約中,但要注意的是,由於動用到的是transferFrom函數(`function transferFrom(address from, address to, uint256 value)`,把value的代幣值從from帳號轉移到to帳號),因為ERC20代幣的安全規範限制,需要使用者先到代幣合約那邊執行approve函數 approve函數的輸入參數是「一個位址和一個數值」(`function approve(address spender, uint256 value)`),代表帳戶允許那個位址的人最多動用到多少自己手上的代幣,假設已經設成100,則這裡的transferFrom函數最多就只能移動100個代幣 所以要測試的話,就先要執行以下網頁的互動介面的approve函數,spender位址參數就填入這個合約的位址:0x416d91a77948ca36f79a9609c239a41bd5e0e566 https://goerli.etherscan.io/address/0x63E1ddeB828eD1634B3165f56e2F31950b4d0B93#writeContract 因為ERC20代幣的安全規範,同時又因為solidity的呼叫其他合約函數的限制,我們無法在自己的合約中呼叫approve而讓使用者帳戶直接允許合約動用它的代幣,所以目前只能要求使用者依序呼叫二種函數才能完成存入代幣的動作,一般的做法是讓approve一次把允許的數量拉到最大,這樣之後就不用每次都再呼叫approve -------------------------------------- function withdrawToken(uint256 v) public{ Token t = Token(tokenAddr); t.transfer(msg.sender, v); } 這個函數是把這個合約擁有的ERC20代幣存到使用者帳戶中,做法和depositToken差不多,只是換成呼叫transfer函數(`function transfer(address to, uint256 value)`,把value的代幣值從呼叫者帳號轉移到to帳號),transfer函數是由這個合約呼叫,所以是把合約擁有的幣轉移給現在的`msg.sender` -------------------------------------- 最後來提一下智能合約的位址產生方式,智能合約的位址是用「創造者的帳號位址」+「nonce」(每次交易都會增加的數字)丟給keccak256的hash函數來產生,所以本身沒有密鑰,如果把代幣直接傳到合約位址的話,就只能仰賴合約自身的出金函數來想辦法取出 所以為了避免有人亂傳,有些智能合約會設置一個出金函數,用來處理代幣亂傳的情況,不過當然會設定成只有管理員帳戶才能存取,怎麼設定管理員帳戶之後會提到 把代幣存到合約中的功能就介紹到這裡,下一篇我們要利用區塊鏈功能來打造一個Web3線上聊天室,裡面全部的文章都會上鏈,敬請期待~

@vcckvv

智能合約教學(4) ERC20代幣水龍頭網站 依照預告,這次要實作的ERC20代幣的水龍頭網站 首先實際操作一遍水龍頭網站看看: https://vcckvv.github.io/SmartContract/TestToken/ 和之前一樣,要安裝MetaMask的瀏覽器外掛才能運作,沒有goerli的代幣可以到那個goerli水龍頭網站連結領取 這次有加入切換成goerli鏈的功能,所以不用再先自行切換,MetaMask會自動跳出一個視窗要你切換到goerli鏈 連結帳戶、切換goerli鏈完成後,接下來就按下「新增TestToken代幣資料到MetaMask」的按鈕,MetaMask會自動跳出一個視窗要你新增一種新的ERC20代幣TestToken 按下那個Add Token按鈕就可以看到Assets多了新的代幣TEST 接下來按下「獲得TestToken代幣」的按鈕,就會跳出一個視窗要求簽署交易,簽署完等待交易上鏈,就可以看到帳戶中代幣TEST多了8.00元 接下來讓我們來看一下網頁的完整程式碼: https://github.com/vcckvv/SmartContract/blob/gh-pages/TestToken/index.html --------------------------------------- <html> <head> <title>TestToken水龍頭</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <input id="showAddress" readonly size="50" /><input id="showBalance" readonly /><br> <button onclick="onAddTokenBtn()">新增TestToken代幣資料到MetaMask</button><br> <button onclick="onGetTokenBtn()">獲得TestToken代幣</button><br> <a href="https://goerlifaucet.com/" target="_blank">goerli水龍頭</a> </body> <script src="https://cdn.ethers.io/lib/ethers-5.1.umd.min.js"></script> <script> // The Contract interface const abi = [{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"INITIAL_SUPPLY","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}]; const contractAddress = "0x63E1ddeB828eD1634B3165f56e2F31950b4d0B93"; let address = null; let provider = null; let contract = null; let contractWithSigner = null; async function init(){ try{ let response = await window.ethereum.request({method: 'eth_requestAccounts'}); address = response[0]; document.querySelector('#showAddress').value=address; //切換到goerli測試鏈 await window.ethereum.request({method: 'wallet_switchEthereumChain', params: [{ chainId: '0x5' }],}); provider = new ethers.providers.Web3Provider(window.ethereum); let balanceNum=await provider.getBalance(address); document.querySelector('#showBalance').value=ethers.utils.formatEther(balanceNum); contract = new ethers.Contract(contractAddress, abi, provider); contractWithSigner = contract.connect(provider.getSigner() ); }catch(err){ alert(err.message); } } init(); window.ethereum.on('accountsChanged', function (accounts) { init(); }); window.ethereum.on('chainChanged', async function(networkId){ if(networkId!=5){ alert("this only works on goerli"); await window.ethereum.request({method: 'wallet_switchEthereumChain', params: [{ chainId: '0x5' }],}); } }); async function onAddTokenBtn(){ try { const isAdded = await window.ethereum.request({ method: 'wallet_watchAsset', params: { type: 'ERC20', options: { address: contractAddress, symbol: "TEST", decimals: 2, image: "https://vcckvv.github.io/SmartContract/TestToken/icon.png", }, }, }); }catch(error){ alert(err.message); } } async function onGetTokenBtn(){ try{ let tx = await contractWithSigner.mint(); alert("https://goerli.etherscan.io/tx/" + tx.hash); }catch(err){ if(err.code==4001){//reject alert("User rejected tx."); } else{ alert(err.message); } } } </script> </html> --------------------------------------- 解說: let response = await window.ethereum.request({method: 'eth_requestAccounts'}); address = response[0]; document.querySelector('#showAddress').value=address; 上次沒特別提到,進行MetaMask帳戶連結後得到的response[0]就是這個帳戶的位址,這次用一個輸入框顯示出來 --------------------------------------- await window.ethereum.request({method: 'wallet_switchEthereumChain', params: [{ chainId: '0x5' }],}); 這次新增了切換到goerli測試鏈的功能,那個0x5就是goerli鏈的ID,如果是smartBCH鏈的話就要換成0x2710 --------------------------------------- let balanceNum=await provider.getBalance(address); document.querySelector('#showBalance').value=ethers.utils.formatEther(balanceNum); 這次也額外做了顯示帳戶擁有的原生代幣餘額,要注意`provider.getBalance()`取得的是沒有小數點的大數,所以還要使用`ethers.utils.formatEther()`轉換成有小數點的字串 --------------------------------------- window.ethereum.on('accountsChanged', function (accounts) { init(); }); 這個程式碼用來設定在使用者轉換帳號時要執行的函數,這裡只需要重新呼叫init()就好了 --------------------------------------- window.ethereum.on('chainChanged', async function(networkId){ if(networkId!=5){ alert("this only works on goerli"); await window.ethereum.request({method: 'wallet_switchEthereumChain', params: [{ chainId: '0x5' }],}); } }); 這個程式碼用來設定在使用者轉換區塊鏈時要執行的函數,如果不是goerli鏈就會要求切換回去 --------------------------------------- const isAdded = await window.ethereum.request({ method: 'wallet_watchAsset', params: { type: 'ERC20', options: { address: contractAddress, symbol: "TEST", decimals: 2, image: "https://vcckvv.github.io/SmartContract/TestToken/icon.png", }, }, }); 這一段程式碼就是在帳戶中新增ERC20代幣的資料,其中image參數是這個代幣的圖片網址,弄成像素值40X40的圖片大小就好: 值得一提的是,MetaMask目前沒有提供函數來判斷帳戶Assets中有哪些ERC20代幣,而且即便已經新增過代幣,執行新增代幣的程式碼還是會跳出一個視窗,所以只能設成用按按鈕的形式來新增代幣 --------------------------------------- let tx = await contractWithSigner.mint(); 這次獲取代幣的方式就只是執行鑄造函數mint(),雖然也可以弄成把合約中的儲備代幣轉移過來,不過那涉及到怎麼把代幣轉移給合約的問題,那個我們預定下一篇再說,這一篇就先解說到這裡

+1 more

@vcckvv

智能合約教學(3) ERC20代幣合約 依照預告,這次要來實作ERC20代幣 在解釋實作程式碼之前先來介紹什麼是ERC20,所謂的ERC20就是一種智能合約的標準協議,只要合約內的函數介面滿足其規定所需要的條件,那麼就可以被視為一種有代幣功能的智能合約,而具體的條件就是需要含有totalSupply、balanceOf、allowance、transfer、approve、transferFrom這些函數,除此之外一般還需要設定合約的狀態變數name、symbol、decimals 在實作上我們可以直接複製其他人寫好的範例,不用自己重新寫出全部內容,這裡使用的範例來源是: https://github.com/OpenZeppelin/openzeppelin-contracts/tree/v2.0.0/contracts/token/ERC20 首先複製這三個檔案到我們的Remix編譯器上,全都放到同一個資料夾之下就好: ERC20.sol - https://github.com/vcckvv/SmartContract/blob/gh-pages/TestToken/ERC20.sol IERC20.sol - https://github.com/vcckvv/SmartContract/blob/gh-pages/TestToken/IERC20.sol SafeMath.sol - https://github.com/vcckvv/SmartContract/blob/gh-pages/TestToken/SafeMath.sol 之後創造我們的代幣合約TestToken.sol: https://github.com/vcckvv/SmartContract/blob/gh-pages/TestToken/TestToken.sol ----------------------------------- pragma solidity ^0.4.19; import "./ERC20.sol"; contract TestToken is ERC20 { string public name = "TestToken"; string public symbol = "TEST"; uint8 public decimals = 2; uint256 public INITIAL_SUPPLY = 88888; constructor() public { _mint(msg.sender, INITIAL_SUPPLY); } function mint() public { _mint(msg.sender, 800); } } -------------------------------- 解說: import "./ERC20.sol"; 這一行用來引用同一資料夾下其他的sol程式碼檔案,因為會使用到ERC20這個contract ------------------------------------ contract TestToken is ERC20 { 這一行就像是C++中的繼承,也就是說TestToken會繼承ERC20的變數和函數,這樣做的話大部份的函數都不用重寫 ------------------------------------ string public name = "TestToken"; string public symbol = "TEST"; uint8 public decimals = 2; uint256 public INITIAL_SUPPLY = 88888; name就是代幣的完整名字,而symbol就代幣的縮寫代碼,INITIAL_SUPPLY代表一開始鑄造的代幣數量 decimals則是指代幣數量的小數點位置,比如這裡設定為2,擁有數量88888則實際上會顯示888.88;如果設定為3,擁有數量88888則實際上會顯示88.888 在變數後面加上public修飾詞,代表會自動生成相應的合約的讀取函數:name()、symbol()、decimals()、INITIAL_SUPPLY(),這樣的話我們就不用再另外寫變數的讀取函數 ------------------------------------ constructor() public { _mint(msg.sender, INITIAL_SUPPLY); } constructor()只在創造合約時呼叫,而msg.sender代表呼叫這個函數的帳戶位址,所以此時的msg.sender就是創造者的帳戶位址 _mint會進行代幣的鑄造,會把一開始的代幣全部移到msg.sender的帳戶之中 ------------------------------------ function mint() public { _mint(msg.sender, 800); } 這個函數是用來製作水龍頭功能的鑄造代幣函數,每次鑄造固定給予8.00個代幣 由於_mint()是無法公開呼叫的internal函數,TestToken繼承這種函數後無法讓它公開呼叫,所以我們要再弄一個public函數來進行鑄造,此時的msg.sender就是呼叫這個函數的使用者帳戶位址 ------------------------------------ 接著把這個合約發布到goerli測試鏈上:https://goerli.etherscan.io/address/0x63e1ddeb828ed1634b3165f56e2f31950b4d0b93#code 然後在MetaMask的goerli測試鏈的Assets頁面的下面中點選Import tokens連結 Token Contract Address輸入合約位址0x63e1ddeb828ed1634b3165f56e2f31950b4d0b93 接著Token Symbol和Token Decimal應該會自動填上,之後按Add Custom Token按鈕 再按下Import Tokens按鈕就可以看到一開始鑄造的888.88 TEST代幣了: 鑄造自己的ERC20代幣就講解到這裡,下一篇來講解怎麼利用這個代幣合約來寫一個水龍頭網站

+1 more

@vcckvv

智能合約教學(2) 和Hello World合約互動的Web3網頁 這次要來寫一個網頁程式來和前一篇發布的合約進行互動,這裡假設看的人已經對HTML和JavaScript有一定的了解,所以只會談論連結MetaMask帳戶、和合約互動的程式碼的部份 首先先實際操作一下完成的網頁:https://vcckvv.github.io/SmartContract/HelloWorld/ 沒有MetaMask錢包的人要先安裝MetaMask錢包瀏覽器外掛,因為這個網頁是預設和MetaMask進行連結 第一次連進去應該會要求帳戶的連線,由於這個程式沒有寫切換到goerli測試鏈的功能,所以記得要手動切換到goerli測試鏈上,另外如果沒goerli的幣的話,可以先去水龍頭網站領取:https://goerlifaucet.com/ 按下getValue的按鈕會執行合約中的get()函數,也就是取得合約中value的資料,然後顯示在左邊的輸入框上 按下setValue的按鈕則會執行合約中的set()函數,會把左邊的輸入框中的文字當作輸入參數來執行,按下後會跳出MetaMask的交易確認,接著網頁會等到交易上鏈後再自動執行get()函數,由此顯示出我們的set()函數操作有正確改變合約中value的資料 值得注意的是,如果有多個人在同時間測試的話,value會被設定成最後一個人修改的資料,這個時候就要注意一下合約的交易情況: https://goerli.etherscan.io/address/0x8abb77ff22f8966729603bd49c5c049c4294efd5 接下來看一下完整網頁程式:https://github.com/vcckvv/SmartContract/blob/gh-pages/HelloWorld/index.html ---------------------------------------------------- <html> <head> <title>Hello World</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <input id="showValue" readonly></input><button onclick="onGetValueBtn()">getValue</button><br> <input id="newValue" ></input><button onclick="onSetValueBtn()">setValue</button> </body> <script src="https://cdn.ethers.io/lib/ethers-5.1.umd.min.js"></script> <script> // The Contract interface const abi = [{"constant": false,"inputs": [{"name": "v","type": "string"}],"name": "set","outputs": [],"payable": false,"stateMutability": "nonpayable","type": "function"},{"constant": true,"inputs": [],"name": "get","outputs": [{"name": "","type": "string"}],"payable": false,"stateMutability": "view","type": "function"},{"inputs": [],"payable": false,"stateMutability": "nonpayable","type": "constructor"}]; const contractAddress = "0x8abb77ff22f8966729603bd49c5c049c4294efd5"; let address = null; let provider = null; let contract = null; let contractWithSigner = null; async function init(){ try{ let response = await window.ethereum.request({method: 'eth_requestAccounts'}); address = response[0]; provider = new ethers.providers.Web3Provider(window.ethereum); contract = new ethers.Contract(contractAddress, abi, provider); contractWithSigner = contract.connect(provider.getSigner() ); }catch(err){ alert(err.message); } } init(); async function onGetValueBtn(){ try{ let currentValue = await contract.get(); document.querySelector('#showValue').value=currentValue; }catch(err){ alert(err.message); } } async function onSetValueBtn(){ try{ let newValue=document.querySelector('#newValue').value; let tx = await contractWithSigner.set(newValue); alert(tx.hash); document.querySelector('#showValue').value=""; await tx.wait(); onGetValueBtn(); }catch(err){ if(err.code==4001){//reject alert("User rejected tx."); } else{ alert(err.message); } } } </script> </html> -------------------------------- 由於MetaMask沒辦法在打開本機上的HTML檔時開啟功能,所以在測試的時候要放到伺服器上來進行測試,我一般都是在自己電腦上建立一台網頁伺服器,然後放在上面進行測試比較方便,使用的軟體是Http File Server:https://www.rejetto.com/hfs/ ---------------------------------------------------- 這次使用的函數庫是ethers.js,個人的使用經驗上感覺非常便利,這裡只需要簡單地引用這個js檔就能使用: <script src="https://cdn.ethers.io/lib/ethers-5.1.umd.min.js"></script> ---------------------------------------------------- const abi = [{"constant": false,"inputs": [{"name": "v","type": "string"}],"name": "set","outputs": [],"payable": false,"stateMutability": "nonpayable","type": "function"},{"constant": true,"inputs": [],"name": "get","outputs": [{"name": "","type": "string"}],"payable": false,"stateMutability": "view","type": "function"},{"inputs": [],"payable": false,"stateMutability": "nonpayable","type": "constructor"}]; 這串abi代表合約的函數介面資料,之前在Remix進行編譯時(Compile HelloWorld.sol),編譯完介面底下會出現一個ABI的按鈕,按下去就會把產生的ABI資料複製起來,然後就可以貼到程式碼這邊 要注意之後在處理多個contract的情況時,要在上面的CONTRACT下拉表中選對發布的contract,才能得到正確的ABI ---------------------------------------------------- let response = await window.ethereum.request({method: 'eth_requestAccounts'}); address = response[0]; provider = new ethers.providers.Web3Provider(window.ethereum); contract = new ethers.Contract(contractAddress, abi, provider); contractWithSigner = contract.connect(provider.getSigner() ); 這一段就是進行MetaMask的帳戶連結,然後產生provider物件,provider物件基本功能應該是和RPC Server相連線,由此和合約進行互動 RPC Server的網址就是MetaMask設定的區塊鏈的資料中的RPC URL,如果不是商業用的RPC Server也許會有些流量限制,不過測試的時候應該不用考慮那麼多,直接用預設的免費RPC Server就好 產生provider物件之後再產生contract和contractWithSigner物件,這兩個後面和合約互動時會用到 ---------------------------------------------------- let currentValue = await contract.get(); document.querySelector('#showValue').value=currentValue; 要執行合約中讀取性質的函數的方法很簡單,像是我們要執行合約中的get(),就只需要寫成contract.get()就可以了,要注意這個動作會動用到網路,所以是非同步函數,因此要用await去等待值回傳回來 而在JavaScript使用到await的話,函數就要加上async,代表這個函數裡面有非同步的指令,而我們這裡的函數都有用到,所以都有加上async ---------------------------------------------------- let newValue=document.querySelector('#newValue').value; let tx = await contractWithSigner.set(newValue); alert(tx.hash); document.querySelector('#showValue').value=""; await tx.wait(); onGetValueBtn(); 而要執行合約中寫入性質的函數的方法也很簡單,像是我們要執行合約中的set(),就只需要寫成`contractWithSigner.set()`然後再填入輸入的參數就可以了 執行這個函數後回傳的是交易資料tx,我們可以用`await tx.wait()`來等待交易上鏈完成,然後繼續其他的動作,這裡是執行`onGetValueBtn()`用來確定我們的值有真的在鏈上被修改掉 值得一提的是,如果在MetaMask中把pending的交易啟用加速功能(需要多給費用),那麼即使交易上鏈完成,這裡的tx.wait()也沒辦法回傳繼續行動,這個也不能說算是MetaMask的bug,因為本質上算是換成不同的交易 ---------------------------------------------------- 和合約互動的基本功能這樣就完成了,不過還是有些東西沒有提到,像是切換區塊鏈、偵測帳號切換、取得帳號餘額,這些之後會再加進來講解,這裡只寫一些最基本的功能 下一篇要來解說怎麼製作自己的ERC20代幣,之後還會弄個水龍頭網站,敬請期待~

@vcckvv

智能合約教學(1) HelloWorld合約 雖然之前也改過某山寨幣的錢包兼挖礦程式,不過感覺這年頭沒寫個智能合約都沒臉跟人說自己在幣圈中也是懂點技術的人,所以接下來打算寫幾篇簡單的智能合約介紹,以及講解能和智能合約互動的Web3網頁 按照慣例,第一篇就來寫個HelloWorld程式,智能合約的HelloWorld程式就是設置一個合約的狀態變數value,然後設一個函數get()用來讀取,再設一個函數set()用來寫入,這裡的解說會假設閱讀者已經對程式語言有基本的了解,會寫簡單的程式只是沒碰過智能合約程式,所以不會從程式的基本開始講解 以下為完整程式碼: https://github.com/vcckvv/SmartContract/blob/gh-pages/HelloWorld/HelloWorld.sol -------------------------------- pragma solidity ^0.4.0; contract HelloWorld { string value; constructor() public { value = "HelloWorld!"; } function get() public view returns (string memory) { return value; } function set(string memory v) public { value = v; } } -------------------------------- 解說: pragma solidity ^0.4.0; 這一行是用來指示編譯器的最低版本,設定後可以用的版本是0.4.X,另外更新的版本會有些新功能可以使用,不過有些地方的寫法也會不太一樣,這裡作為練習就先使用這個版本,之後才打算換成新版本來寫 -------------------------------- contract HelloWorld { 這一行用來設定合約的名字HelloWorld,被大括號{}圍住的部份就是合約的內容 -------------------------------- string value; 放在合約內宣告的變數即為合約的狀態變數,代表這筆字串資料value會存在區塊鏈上 -------------------------------- constructor() public { value = "HelloWorld!"; } constructor()函數只會在合約發布時執行一次,之後就不能再呼叫,主要用來對一些變數進行初始化設定,這裡就把value設定成"HelloWorld!"這個字串 -------------------------------- function get() public view returns (string memory) { return value; } 讀取的函數get()用view returns修飾詞後面再接上想回傳的變數型態 這裡的string如果是區域變數則要加上memory的修飾詞,代表執行完後就會消失的暫時變數資料,反過來如果是會留在鏈上的變數資料則是加storage的修飾詞,不過使用上比較像是指標,之後有用到的話再去詳細解釋 函數後面加上public修飾詞,代表這些函數可以被自由地公開呼叫,後面有機會的話還會再提到其他的修飾詞,有些只能被內部使用、無法公開呼叫 -------------------------------- function set(string memory v) public { value = v; } 寫入的函數就只需要加上public修飾詞就好,也不用進行回傳 -------------------------------- 這裡使用的編譯器是Remix:https://remix.ethereum.org/ ,因為是線上網頁編譯器,所以打開就可以用,個人用起來的經驗是覺得還算方便,就算網頁當掉也有自動存檔,缺點大概就是虛擬機跑得很慢、容易當掉 介面打開後如上圖,點選左邊的File explorers按鈕後會出現檔案列表: 一開始會有些範例檔案,因為不重要所以可以全刪掉,接著點選裡面Create New File的按鈕來新增檔案HelloWorld.sol: 接著會自動開啟新的編輯視窗,之後就可以把上面的合約的程式碼複製進去,按Ctrl+S可以存檔加自動編譯 然後按左邊的Solidity Compiler按鈕,就會出現編譯器介面: 因為會自動判斷程式碼指示的編譯器版本,所以應該會自動轉成0.4.26的編譯器版本,如果沒有就自己點選版本,確定沒問題就按下Compile HelloWorld.sol的按鈕,成功的話就不會出現錯誤,且Solidity Compiler按鈕上會出現一個勾號 接著進到發布智能合約的環節,按下左邊的Deploy & run transactions按鈕: 一開始測試的時候先在內建的虛擬機上運行會比較方便,所以ENVIRONMENT是選Remix VM,ACCOUNT代表要發布合約的帳號,直接用預設的就好,CONTRACT應該是顯示HelloWorld - HelloWorld.sol這個合約,如果之後要寫內含多個contract的程式碼,要注意一下這個地方不要選錯主要發布的合約,免得之後實際發布的時候浪費錢 全部確定之後就按下Deploy按鈕,接著下面會產生一個操作函數介面,一開始是縮起來的,點選>箭頭按鈕打開後會呈現下圖的樣子: 按下get按鈕後會執行get()函數,然後顯示出回傳的值:「0: string: HelloWorld!」 在set按鈕旁邊可以輸入字串,這裡填入test然後按下set按鈕,這樣的話就會把test當作輸入字串執行set()函數 為了要檢查結果,我們再按下get按鈕,然後顯示出回傳的值:「0: string: test」,這樣就代表value的值在虛擬機中有確實地被改變成設定的值 -------------------------------- 當然,如果只有在虛擬機上玩玩實在沒什麼意思,接下來我們開始發布到測試鏈上,然後在EtherScan的介面上也來實際操作看看 首先開啟MetaMask,然後換到Goerli的測試鏈上,如果沒找到的話代表被隱藏起來,此時把Show test networks選項打開就能看到,如果沒Goerli的幣的話,可以先去水龍頭網站領取:https://goerlifaucet.com/ (這個要用google帳號登入alchemy才能領,有要填資料的話隨便填填就好)、https://faucets.chain.link/goerli (很方便領取的水龍頭,不過有時會沒辦法領,剛才點進去看又變404了,可能要有緣才能領到) 這次發布時ENVIRONMENT選擇Injected Provider - MetaMask 按下Deploy按鈕後MetaMask會跳出視窗要求簽署交易 按下Confirm之後,底下結果視窗會顯示出一個view on etherscan的連結 點進去就會看見自己剛發布在測試鏈上的創立合約的交易資料: https://goerli.etherscan.io/tx/0x43ea64aec24415cac0d0d4f15c90de68001d355a2855792913d174a203c18022 如果馬上點進去看,可能這筆交易會顯示還沒上鏈,那樣的話要再等一段時間 之後頁面中有一個[Contract 0x8abb77ff22f8966729603bd49c5c049c4294efd5 Created],0x8abb77ff22f8966729603bd49c5c049c4294efd5就是這次合約的位址,接著再點進其中的連結:https://goerli.etherscan.io/address/0x8abb77ff22f8966729603bd49c5c049c4294efd5 連結頁面底下有個Contract按鈕,按了會顯示合約編譯後的十六進位資料,不過裡面還有個Verify and Publish連結,可以把我們的程式碼輸入進去,EtherScan會自動產生操作函數的介面 點進Verify and Publish連結後,Contract Address會自動填好,Compiler Type因為是單一檔案所以選Solidity(Single file),Compiler Version選和編譯時相同的0.4.26,Open Source License Type隨便選個喜歡的就好,之後按下Continue按鈕 下一個頁面在Enter the Solidity Contract Code below底下的輸入框中複製程式碼進去 接著驗證不是機器人後就可以點下Verify and Publish按鈕,成功的話就會顯示Successfully generated ByteCode and ABI for Contract Address 之後回到https://goerli.etherscan.io/address/0x8abb77ff22f8966729603bd49c5c049c4294efd5#code 頁面就可以看到輸入的程式碼和互動介面了 點選Read Contract按鈕開啟讀取合約互動頁面,會顯示一個項目get,按下去就會顯示現在的value資料是什麼,第一次會顯示:HelloWorld! string,如果想要更新就按旁邊的[Reset]連結 接著點選Write Contract按鈕開啟寫入合約互動頁面,首先點那個Connect to Web3,選擇MetaMask錢包進行連結,會變成Connected - Web3 [...],之後就可以開始操作下面的set函數,打開項目set後在v (string)的輸入框中輸入test 然後點下Write按鈕,MetaMask會跳出交易要你簽署,按下Confirm後就完成寫入的操作,之後就會如下圖那樣,多一個View your transaction按鈕可以看這次寫入的交易 接著等到交易成功上鏈的訊息出現後就可以再到Read Contract頁面那裡,可以看到資料變成test string -------------------------------- 另外一提,在Remix中也可以在Deploy介面中的At Address旁邊的輸入框輸入我們發布好的鏈上合約位址0x8abb77ff22f8966729603bd49c5c049c4294efd5,然後點選At Address按鈕後下面也會出現合約互動介面,這個介面可以用來和鏈上合約互動,這樣就不用每次測試時都要到etherscan那邊做Verify and Publish才能有合約互動介面 -------------------------------- 以上操作完就代表我們的合約運作沒有問題,不過我們的HelloWorld還沒結束,下一篇要來介紹一下如何寫一篇網頁來和這個合約進行互動

+18 more