From 13a15c2ebdc6ad6a107b87d35e8e4119f6b55364 Mon Sep 17 00:00:00 2001 From: Akshay Date: Mon, 16 Aug 2021 23:31:18 +0200 Subject: [PATCH 001/145] Feature: Create docs for v4 introduction --- content/concepts/images/v4-nft-1.png | Bin 0 -> 6827 bytes content/concepts/v4-nft.md | 23 +++++++++++++++++++++++ content/concepts/v4-roles.md | 20 ++++++++++++++++++++ data/sidebars/concepts.yml | 7 +++++++ 4 files changed, 50 insertions(+) create mode 100644 content/concepts/images/v4-nft-1.png create mode 100644 content/concepts/v4-nft.md create mode 100644 content/concepts/v4-roles.md diff --git a/content/concepts/images/v4-nft-1.png b/content/concepts/images/v4-nft-1.png new file mode 100644 index 0000000000000000000000000000000000000000..a45eb96c9bea6a940111b8548dc50a100405211c GIT binary patch literal 6827 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 Date: Tue, 17 Aug 2021 12:11:30 +0200 Subject: [PATCH 002/145] Improve v4 docs --- content/concepts/v4-nft.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/content/concepts/v4-nft.md b/content/concepts/v4-nft.md index 1899e731..681cf482 100644 --- a/content/concepts/v4-nft.md +++ b/content/concepts/v4-nft.md @@ -10,6 +10,12 @@ A non-fungible token stored on the blockchain represents a unique asset. NFTs ca Ocean Protocol defines an [ERC721Factory](https://github.com/oceanprotocol/contracts/blob/v4Hardhat/contracts/ERC721Factory.sol) contract which will allow users to deploy ERC721 contract instances on any of the supported networks. The deployed contract can be associated with Metadata information which describes, also published on-chain. The [Metadata](https://github.com/oceanprotocol/contracts/blob/v4Hardhat/contracts/metadata/Metadata.sol) contract will store the information about the asset, and associated access rights defined through roles. +### Combining ERC721 and ERC20 + +ERC20 interface represents fungible tokens. ERC721 and ERC20 combined together can be used for sub-licensing. These sub-licenses can be traded on any AMM as the underlying contract is ERC20 compliant. + +Ocean Protocol's [ERC721Template](https://github.com/oceanprotocol/contracts/blob/v4Hardhat/contracts/templates/ERC721Template.sol) provides functionality to create comibinations of ERC721 and ERC20 contract pairs, each of this pair can represent a different sub-license. + ![Image 1](images/v4-nft-1.png) Once the contract is deployed, it will be available on the Ocean Marketplace for trade. From 6baece929bdbe9b801bdc849a3ecc3159628f2b8 Mon Sep 17 00:00:00 2001 From: Akshay Date: Tue, 17 Aug 2021 12:24:01 +0200 Subject: [PATCH 003/145] Improve v4 docs --- content/concepts/images/v4-nft-2.png | Bin 0 -> 15956 bytes content/concepts/v4-nft.md | 4 +++- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 content/concepts/images/v4-nft-2.png diff --git a/content/concepts/images/v4-nft-2.png b/content/concepts/images/v4-nft-2.png new file mode 100644 index 0000000000000000000000000000000000000000..379f67e2d9ed32b7c99ecaa61b28126d183516a0 GIT binary patch literal 15956 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 literal 0 HcmV?d00001 diff --git a/content/concepts/v4-nft.md b/content/concepts/v4-nft.md index 681cf482..8a2eac5e 100644 --- a/content/concepts/v4-nft.md +++ b/content/concepts/v4-nft.md @@ -10,13 +10,15 @@ A non-fungible token stored on the blockchain represents a unique asset. NFTs ca Ocean Protocol defines an [ERC721Factory](https://github.com/oceanprotocol/contracts/blob/v4Hardhat/contracts/ERC721Factory.sol) contract which will allow users to deploy ERC721 contract instances on any of the supported networks. The deployed contract can be associated with Metadata information which describes, also published on-chain. The [Metadata](https://github.com/oceanprotocol/contracts/blob/v4Hardhat/contracts/metadata/Metadata.sol) contract will store the information about the asset, and associated access rights defined through roles. +![Image 1](images/v4-nft-1.png) + ### Combining ERC721 and ERC20 ERC20 interface represents fungible tokens. ERC721 and ERC20 combined together can be used for sub-licensing. These sub-licenses can be traded on any AMM as the underlying contract is ERC20 compliant. Ocean Protocol's [ERC721Template](https://github.com/oceanprotocol/contracts/blob/v4Hardhat/contracts/templates/ERC721Template.sol) provides functionality to create comibinations of ERC721 and ERC20 contract pairs, each of this pair can represent a different sub-license. -![Image 1](images/v4-nft-1.png) +![Combining ERC721 and ERC20](images/v4-nft-2.png) Once the contract is deployed, it will be available on the Ocean Marketplace for trade. From fb742723a829dab208fa3b84f515a2865057dcee Mon Sep 17 00:00:00 2001 From: Akshay Date: Sun, 26 Sep 2021 23:13:44 +0200 Subject: [PATCH 004/145] Improve v4 doc --- content/concepts/v4-nft.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/content/concepts/v4-nft.md b/content/concepts/v4-nft.md index 8a2eac5e..86012c64 100644 --- a/content/concepts/v4-nft.md +++ b/content/concepts/v4-nft.md @@ -8,7 +8,7 @@ A non-fungible token stored on the blockchain represents a unique asset. NFTs ca ### How will Ocean Protocol support the NFT market? -Ocean Protocol defines an [ERC721Factory](https://github.com/oceanprotocol/contracts/blob/v4Hardhat/contracts/ERC721Factory.sol) contract which will allow users to deploy ERC721 contract instances on any of the supported networks. The deployed contract can be associated with Metadata information which describes, also published on-chain. The [Metadata](https://github.com/oceanprotocol/contracts/blob/v4Hardhat/contracts/metadata/Metadata.sol) contract will store the information about the asset, and associated access rights defined through roles. +Ocean Protocol defines an [ERC721Factory](https://github.com/oceanprotocol/contracts/blob/v4Hardhat/contracts/ERC721Factory.sol) contract, allowing users to deploy ERC721 contract instances on any supported networks.The deployed contract can be associated with Metadata information that describes the unique asset. The Metadata is also stored on-chain. The [Metadata](https://github.com/oceanprotocol/contracts/blob/v4Hardhat/contracts/metadata/Metadata.sol) contract will contain information about the NFT, and associated access rights defined through roles. ![Image 1](images/v4-nft-1.png) @@ -20,7 +20,6 @@ Ocean Protocol's [ERC721Template](https://github.com/oceanprotocol/contracts/blo ![Combining ERC721 and ERC20](images/v4-nft-2.png) -Once the contract is deployed, it will be available on the Ocean Marketplace for trade. ### Other References From 1f2c5953acb1bebd18db3b829e697e1099628de4 Mon Sep 17 00:00:00 2001 From: Akshay Date: Tue, 28 Sep 2021 11:49:24 +0200 Subject: [PATCH 005/145] Issue-#701: Improve v4-NFT doc --- content/concepts/images/v4-nft-1.PNG | Bin 0 -> 40446 bytes content/concepts/images/v4-nft-1.png | Bin 6827 -> 0 bytes content/concepts/images/v4-nft-2.png | Bin 15956 -> 0 bytes content/concepts/v4-nft.md | 33 ++++++++++++++++----------- 4 files changed, 20 insertions(+), 13 deletions(-) create mode 100644 content/concepts/images/v4-nft-1.PNG delete mode 100644 content/concepts/images/v4-nft-1.png delete mode 100644 content/concepts/images/v4-nft-2.png diff --git a/content/concepts/images/v4-nft-1.PNG b/content/concepts/images/v4-nft-1.PNG new file mode 100644 index 0000000000000000000000000000000000000000..bf850be6c055fe8a54f7278114bb3f23dbe5fe6b GIT binary patch literal 40446 zcmeFZ^;=YJ`!B2lg5=QM3Q7nANJ$6`-O?>Hw1jkng2DhpiNGKwE!|y83=Pr^GL*D* z!(QCa{d|x2*zf*f{{j1lVP*|;t#z*RI^%QJ3e!-NC%~n_y?5^(fuaKB^}TzTkbC#; zE8{!_zFFKd&;;J@yS|o}zE?6xw*eerT1%-)-Md#Fjdx{^1sp$mr(ocE?;eTU-Ru5> z6{FX^d#Q1X5Gidh)1B*$%Ex+1YY`KSKO}$T-6+jgx2&JMcp2(?X*m00Ym{3}XIO_| zocrTFsrxxW4{)D`OW|X6GJOk|`t*t{81$8x#D?O@uP){?DTF|F`Hr-21;^1hU-9)}=*%Dxe7&c=Zl^`{O5c zcTg{)-sps^a&m{ms&q=T-}KN0?76%P-97Q|yb8JQykZRv|1=;U(Rn?pLx?J}*qAad zFWb=vw>oG}rU5!mRfDtO)!8nJPh#$gpu){JbviHGi=lj?+7 z(Y^YCZ1oKUUyf3SZAw?S-> zQ$YTak$#1sEK$$d1?XCOIyc+xL2S|JG*3Ho+QoLR%ab2%xswGnNt$n*hqRw*Fcqk# z9KSg^JMCk;>GEfn{ak4FoT7%I(9Qy3!2RFT{o!rZUzlhMk0iC8i*x6|HYeTlD?>KB z$(NrMI8{>1CFD}}8s+9noI_5|2z%KUFW-SL3lk%9+ADQbBf;};q&oiDE`0F_9`%G; ziX$`yGJuv-zOJ)PfH94m|8U+xydEoeQSdq^FXB9uNauwR$}I?s_#Z9dui~;7eZ3$Z z;|fZ4oOApc{KETtp)E*R7JU2bCvKAvoon(6G^UN#5TI*Vo&Gz!;Zf+%Z-@t60 z|LP<)4Mh!|$tiYrN%Hl62=wH0;?>a2z2EMAq}HW-7_TS$lz#5anDj}e zGY5Kdp%)$|*~+uE5?QgIOV=8otKR=Sp*Ak%ERJBhh0#(*-`HosDF^)UzxOBC#{VK$ zVxedp7Et(<^8_ZXeS5zYMV@oMSocOH{Jv z-s;dv2qu5xDzrO@V*JS6!e?MOmuP8K?pM=3*2N&n?PwRbE@8;En^r)QRDv|&vU=|I ze75v$`7|J3(dGI(RCI8r*V8Lqj64)XmlQPoX^42Hiq-O+9C43Ht_NWOQgp3bqb&v=sy zyBzEad_CvUY0~*qoL$`p1&Eu=&@j4FnURy>`j1lt?cz~!)K1OqauB-b(2-k~6ha2j zyM+z?v4YJwAo^AWBcDS+~}X$fP|dBVt|aU$(ltE9WsGk%qppAdmy3IYXr#ge}8F)!jP z=Y^^q#(>&3qf)*PG{+hUt6jM)($kGfwiLE1 zc61L?!y*LC8RP4r5JylbrVkYEi%+siY0#eTI#H-~N zn~!;x>j%t%bmo871o5a#+14^L)*b^!spmwibZ4wL6F2HbkP%1JQ?A`YQpiYE{eGjV z;PJS1LY@hQY`+cvSWtJ)V#{+*!=h0ClfcxyaTXLlj_#+q!y4s^%ub&v{>7%sf-nFw zj8~Mc+Bl=5^=>al`J%1)h}cbX=N%rpNK~8PKAuymOiA;D8mkm4y)I`NV6PUHdaPV6 z{RFjx%9T7Fa|xaDPHjDXRTFq&i(`nu3Nzd&|EPu)ONBj(T=P|;sbv&A3|=o7K~SrP zyaq|ZfB(!A$$*MSjTR?~}jrU~DZ zChaEHW$YZ7U9I~2JePT#`*I+|Bt+n%)^yO0Ubq9yW01=98CS$5e9~^z%-^ag{aHoX zhQj%eY2(GB#LjUE8p<+5smHs~%d#62?N+4+oBI3>_^C`m_kM07QeJ^^WXP7zpP-O8 z?XF@IhZIR3C=PN=8bGB|E8X7YBG1g`#b3R!jvv^l}V&cy_MU&9eZJBXQg3>ByEslXY~O!OFXZThHsw>J){4%_cIg% zSB4e-E?GsZ6Z8)$GQbDw%pip#t zZErtU0`#HUQ`?Vdg)63%CM9ck@0X&DN}jtjO?--xn?uXavAY ztq_Y*Et`3ybKbbj>Y-Ia7a@$bc~uFPr&3FYJr(6lRk|u{A;$kaQ8VSktdS5|#N`#f zEWaWCC#E2(k?dKE&Hf=WaPDc@MW$kH&lq*>&{-0IbhU=I$zL9-O>l5y4_a^teyJ7I zmVU%!-+ex|LnvI5^IKCSKZmMfyDIl~B5rrAQi0=V_O1uD{hOff3e~2=pU{mzz3aIM z8h%Q#M2A}+12Xjc{n)4ot>wZXa0d3VoYcpvoL{<;Ug zx0!tAaJsqWRSVS71I!R}kc>riz)`KvKqMFip{SwfRJ&RX_Mci6o;eb#)s=rEkQBJ0 zQ8Qn2Gt;kb_C4x7xLti2EA}lj+0jiJ^VlTA3{p=<4SPt9mei{SOn zaLbcE1a>4jq(-bpoKpZl&bcufSX;OAm>oEv_c>bOJOx4zdjn$*HteGlA|oh(3An_3 zi$rpIgJ8U8!%%`?L zxRw+cS|Gs7J#z$&m4sg$c>jUDP|O9w5v1O)8KvZ_spaulu$8cFHd7EhhLkd7*s&2^ zQlNuEs(I~?bX7cP=lz=g1d5>6>&4D*86ax1|2kk=lO-zM-h;leZ7u%(K`?Of!zK6E_%boMwFcR&xo<)?Z zBqZR`VkI|P>A7cz;H7=|{8pWZOMIwni5wF__wZU%LCOcNa}%xu~a5NVlBr8xX^y2I8*y_N#6i$3*q zilK=%FM?9NFeG!fb5Qrw`RA<5_sdbplfO(ODc^bf?`Q=tcZ~E)gZC$V4+%#_X^0j+ zj*Go_9RmQ(&4*yiTYS8TQ0qRS)s>kMJlarL3xiUFLAcS z7f=IH$4~C$S|M!J)ikI)4!1lb0fJWK1+D0Fj;rW!lh1Ez4yHlSjo18|)>9#5Zvn*5D&*LtswU+($4zNof7zci5sv^SeA!^RZaBVB*drHE&e z2elE(-6CodZ`1$om#~z@7{hmt+4`OMf=?(UUDnAfog~I0I|Mc5yE0e85g*zI^5^() z%d;=PKLo>FpLJ;v4SxLdRBoM$UE6jgX6@i7v!#)DcSb^%A0o2NrXV*y)@;`+A=y-YI zYa}C-Kni(h<7^KT<65ukeaD+ciip3RXnlvS@?X8NT*>Ab(slm&<}lE!x=2gQ;HwFj zT2sz#>AQ*j2@jvE%_tF;hsz=A3Y{fxbh)c5Xay$oqKXDq`oPujSWDeGtGKbG@(AL< zX1yoeV&2(B5#aXsSh4PWtv-{;2?Uzc(-IKfO|G4^UQxN=im{#!CU&`OXJ>t>bTCm7 zIf-$IEGX%GK~cUX|F{17=KNdbPvPW2-F(GS$tVqa!}!<)(ovLi2q<$O+b{8ZM#DI> zIT7=xefZPYe3f;MFsG9WdiFj6E1WWb2Wv)v%ttyU0VrT8=b2Mt>}pECqb}f|@fZ87 z`ML5UZbyRCNMj8*t2k6u8co$~*#-AoLi(%+8;$^K=Lc=@$9+9y5v*x!7p|boJ&v6Kq|2 zWl);?K_(KGTIgEJExxv~KRU&%=G~vDS}6Ef^v^V-^Rb3VOTw~(f@0rKftHc-cIzZ{ z9bK{=r4MYR^4`itJ(0sLlG@c3o!ni$2MAkH3dlqc0=(1n2)EtwF2RvCI8r!j5Nh)) zS1%S#Wyc5&fqVvkS%5A}YmD8>MwYmYq~4QH>0M{kIBq zKX}oB5=aHqn$my20?_2`|JqC6gC?WG32IosO+}hoLh-4f_iomBtUX1g-cJ9-q#&K( z@u$23R$G-yz?rno>bnHB@y>cm+{6{Qqma5{7sHEIvY*Ta7t#PnmDPXbnKmE_saYz| z$^W!zBN&=L^C3AvhBd9w z%|z?;EVI9++GGZNCg`J%e8eR?CM1pgZjOyS5Vjn^(%+T0TUSM8fRDs3pc$pkI(akh zyWpWX&Ifo}%>-Qu_I5!(L0{F%w9~Sx(xjoBa(C-P&lW>^P1sjuR;*a%R(}&+eJVMb zIWWqNkVRU}m`cufE!k7Im=A>?{9ek?&?R|+OhA8g5p3Fr%7_hmC0r0aTP)0i{tn~6a)Y` z_TFy3x^Jl18c$eS9Y>MlWjmp#ma-w{6~WPG*Ovh0);Bl72J+p4#)8M5>e}*E)cx~i zFO7!GYdZDVl>0tK7O1AT=7?sZ1QJoWEI+pFT&3H2r!H?t^TNZHwRDsL#KP<8ms_`U zTgL=|vS4p_IM~V<+34UjL0mzQs2cD$b`vfbJl*GEu_e+k7!}k#ww_iH^&LErGaS^- z+Zr@kD1$JdZEsTQD4ltMLg2YhZug2xXF-GCLCu@>7F1HsUl}-RA#`5Y24G6eko`#hfJz|#HK$q>UKZ*D^3!4C!XfPz%PjB|;pMc7 zxm@1sf#P!?!YMAen>Fd4_xEic*jJThEMlr$>>`&!e5W2Ts)&AJgiob*@JtsF>pJjZ zvx9;B_w*3`GB>{xuJj>ou{)U5*~TxQ$XR>lld`z?lAF*LC%yS%6#xk;)X_WjwCWO# znfU4&A};pcq)Kzqas2`1XKi87wadKIq3{OoL{<7PPQ5<3YMm?6I-9?fMECOT>9K7^ z$WYE}UJ(a%Y+Y*0Y`NxiF;UJL{@`?~kZRi6$V$o9Qw#b?TV5Gv_+KtUU6U0|crGTSZpbE~=i?>DxQ5xx7;UM7@lIQ5RhRX8gE+k=D0^q0-=7cZ% zLBU~Ky+(QpeG($I+pNVO@g#JjN9rvXD=_*5&o!|R^pf-qg+y9A*ojW=XFgiY;-7QU zx=j8t)-_o=pGwn(VNP&nk$k;M>mxjYh+AETcPd>vWpf zlEA9gPcez#jAIq@xUfL9w$o^vxcZR+e-E65tYzW3RE7E=M*y(TA#d`mE7de4RZ2rT zpCK-vc>SekCtfK^3vVw#SU$GvE*}&0;J7XO`dGBw*^I;O>1`cPv9ihhI~y2vOpUX6 zktQcZqWPIomlSOmAsRdup03@*(TU(y6G(t}fxDnzjU_mu%iBHjmTSN#T>}l|eMmZg zN(kYuxUtw>_Kq>Y-)w)2asKty3a1{$;!U?~r{2P8bJVuk?a~29UR){Kp#aFjsdcos z2C~d1I7S9!4l%S^yE zzxrL@#5#sO+IqMlxg;FpqH%65LC#qw+Qk=%t%-;srCnY*S>(jyLBXpu63Kgt* zG+_b~$uhWIQTMlXZArtZIYL6|v^o$}M9Q6bk+cZ#SKOy7?Nnixz1Mv)qsYde|9fR#$vBe|yeja6iLn*8O^oV|}fdOi?dH%zL4D+N-(Dci|)gda2I9u@PSC03@Z@NUCxPOy`0Fre%o(yf6Yq`U_mlD=r_w;kR3#eHqk zPLs^GmtPiSh31z5BE9o>bh0Q0HLk^(oPWl$^8Ds9%7tI z)$5ntMSsk(@y~-5N+(XWCO4O`Ixq_V^PSzI&j>&|iiFkTWea{MXIXW4$xa402 z10mSg{;ycE7`}v*l!427oxV4x(bn{*rZacG5qi*}ZSXu3heh%Ef)7=YieGZSgWgIRy2nI5JXF%nWWsi@y4h<3rjyUkSS8x6cThnBf#Rg! zr3j|Iu508a{7k&@0Zr5BzxL6aAl?j3_0g3^pUJXoWu_Dd zXlR9?#s_fti!GevzM~=0LB^;|I>-s9n)j?ywPDtCwY;dDw95~58G##G_c1tA(Uwnx z>k8O4ush@8iW=h2Nv%a9(J@h8A8QQ>MwOFqdKJs_pY@v_`veN~P+|Pop8#`y5~Z(P z^>^=jK`+#S5m|c&^&+)eNb^RWXUUcgcmYVH^N1w^FQQY2axTWbf3h9)#7j+aWuk9y z`*Mea(toL9^dm^OP+-IT$KLI2KyU3ZvW4IEU1r^BQD0@$xsSe2A?{-OnelDf{0HWS zCXnv;dxhFx-)%*0r?u8)BNsfI3Q_@wL=<5ZWeJENO%!A1gTG0lL09c1fjjD*iVHu6 z^I>6e1r=Z9)j*1UkBvE{q0^k3x+1OMQa%&%=ft^-Z1Szo`kjPhimgeD$Qs|AQ`s_J zvlC-Jw&`@Mcg|`e6G~R6VoZ&i&86b>2e76I9t)iL_Nw;wt9$q4tbS64kS4UYHwoJ@RY_@z6d|WhlejiIoW|{)W4{X%W8# zErXHQ%2E6;)i-FK-5~%6i`7)U+|#2TeJn}>Nk~Yb;SR|TdH0i>d&5<(;RAMU1Hif;rA#jSER~94V0G8w{O04r0uo4K&0(+`bR9Di+?pH zrWqbCpHM&ubfe$E>5Ld=O=*I{S~#ypoXmvWIHe4yr*HRRZ%INB^?RwozV9~;38a>j zoE8igHiLjH-RcNP>?k$<39h`#l3 z#Ntv1;iCNIUgVdWpzdADQ}Vs@MaeYx8i#iC^z-y}O63TTaFtX0+a4JM`B{KR0JznY zAEkm_w6~4QR}#kFt#*2l)cQ8Crln@7EQxW|$x<-awu&6ma@DeDnQA}#F3BksJl{rZ z>3BhO`^CM&p&cf4E!kqipbYSZ7Ec+d@Eiy0gpMC^Oy-t**{~Uz&Aywu^2h#9T=NW$ ze^|^{A-^}JU9;M|XOd2kNKDuH+TT~PRI@PEY;B@TuLE3{NGtHxV&YlFi^YVfAszX0ZA{(}R^R%=bST2Ev0kCnNL*dEX~%&U!6$ps@tC?$&XPUfG)iR(wDqeA=h9Q!M1d zDUQ+pq>hj6H7ES9&rFKeym~OHJiC%63(e*4i}Y(FK@(0^@gg~pLGcS6koWrSR#xX* zY~9;60)B}*m}Hr{saC8d)#1_5?6$g`gTvzU4DJ;V2j`}9IRd+l@Np2XMAldbo&3R@^R+qaB}ZS*g(Thq6@?x(iuJW&3KSGY2st{`fxM zwc9!KSQNBIY%s>{?cDAV9HAG-13MS>8uLk(f`cF5MPKa(Cn$l6m zFtwdo;6t1piYX4wify?LlJLxmxm&yrhU{S>ABvbTMtRT%pQe z85hUpsAF{fWBT&6E;|Bmm6Afi?su5AV$e-!BA+R99JCQIGQg1fyuB`mEs>~pnr{B$ z0ur@1XGgMp&(?GP?@|8MS%0%QJ1RrP(LgcXp{>U8@I$_TSEaZ6>)J5|QYZQ#Q#_WT zo8K*bW`OWxS0(c)4F@#nv8Z`e**i1e~5*xMJdj zL$f`)7)TIk;aSdqRdIYWWXL7N@Ota9+RNZ-T#Di%%JWkhP?F7=gFY(T0xNdW%++Zk zX}4A?m5Ie%hEu#M6$Mn*?n!;vaZpdW+Gmw`YRVpj^8mL{8zgkIv+1kE3~`=P8&$;o z>9P-!fd|{P1t9jeBZj!|pJ)m?=noXj412UzmG+M!=}uGqWr0(pCRpH1kb7+y=YJo; zal?b(y?^?F>8BkoVsGP6;a+So?(hunKOhodW(xX1rzEk=5p84W{~1r~oa7bgrHk_ia`ufI zDO?tQO2V$Unv`jxpNntpxP=(1M89+GC1tJRrc;G38og>ePiljam6bEsW)&=;WNUIwv0@6 z9bRzC_Zk`gV;IBIvs6p3Qe9^GMr4<=M;og7|5P&t4bUC&>B3ZQkylfwqPQ_m9L#ZW{4uToQzbu<6jlbRq!8`bM_L(VzkIW1fbheVu_aaKsY^}Cwpic9m z?f~bDq@4b@&|RFh+;EeO8p-=x_eb2b(~Bj8LXx<8WvCZhp#wAF~wS>rT$&Y zxMSbWCsqHY{EFT7wr!o}MtV;13BzZald7kmd;X(QB0Ljy@Z%>k2k_v3hE3J@l^zi9Z4isIqaGjiP z=%x)8al--oB`#^81g=O+c*Xm*m!|AKK1xwN82DsT5N`+5A!ES}NSnc=ikd)vs0 zpYvU_T1}2oRx2zWV>$DAR0o2NMhi3wWBMuW-BDK6Z-Yp6iSIc$3+oX0b_L!v!d|K` z&uyqJP!_5wJ3p@Fq~_-;0zqmdk6%xOnG#_*5=edd0ip$QpbrHs0Hb?-XLJE`X{7b| zy&DJo%~)u|hWU3m>;4H+4U;&&3zxWMoeN-s$HeVPEYuF2eQ2$+5_ae~AUZs6D2YY9 z%00|t9gdfZ!@}p7x0LjRL>{d~^omQd?{j&BE)-AJhE;MLJ5d*6m? zH?dbfey|jeE`{Z1^F$jA%aBN8fbBdE@2>S3jcT{xpm_1KNWJ6K?FBLm)oX zQTlYBr$uURwc%!eZ-%l{($AG2xwcSIiE5%y?LvuOu>|@#QFDwge$lMqqrCt(u`Pty zNP~HSOhaI?;69L6@0{DHHOD9AUo^Vp^cvmQ2q#~vON37Hg||Dec)6+^+Y^m+I7=DV zQ1h>7F6>qyPznYpzVK4MFtati_Z2ue3jMK^29U*2wAbmpu2C3CqKGYUEU{d4C z`p1=oGP%qq^E^Gg3jr$xsx?%amOm67R#CKrzhs3kb&oS!3#hX8?eNggTdvn;y9jHU z%iLBezf&wGw>9o9EKJ^9R8DSOvX~Ez@08*146AkQt|`{)qxTFmXOiMXE$OHG6z}qV z?3^{AV$EwyJbZ=~ZRv(zU3@l^SI!2OHP1no8_PX9*Wvt(M*b4EXg!gQ#TeOFZo$pl zu9)uw>}67*OI?~GOvU08lgsFnz;4lBTjswam!sc*BWH%=YHn-LJz{|qk#IbY>Ilv7 z@ae-p|1-_}>Ksgvpd2bS(;^@Vq1T0X2>()Tb%Q4Fo+h*PEA9H~Ibp?$KE_|cBu2aw z?+PADiFyC`$E-OfRJOqfLzEa&rq34R+0cuji8+i}j-f3y-^;r7uXUL_VpNlm>;dAd zfveO~tJJ(|{lO&q7o4{}W^Bz^uwudE;mAJIcS*+@{JsM-7nXFWUp_NOdTJ%;7gqYV zUzngql9fzQmm?)m`HRWBrqGGFe08x{_e|Zlc{eZ2*eE4%QLV?~o>RAOGUavF1)KFt zR<;4&%DzbNV1^t-F%}@BY9$!a$wEll$d~xECnb!9mb- zr{u1EWDfW9+dKzy>=+9)U4NGv%I+C zo<5nG=we$q)TlS?LYj94btAuG5y!O$b^l2QI(+*Z_<{DKfWN~`Rcsg{MTj)$VU@PsKaiT-g}~ochaP|NFH-zrUzA9WOMwT5cr|nATT{KFI26tAPP> zbCytaTvNZ;awClc3js0>Fgpr}3ea7j<#bo_3x?k8UK^|zBqsPaZP&Zuls`5bbx+gwWwftWl&P*K}KnlgveUwNgJx&QkaWAy)P=u z1wT~yE^gsY@uM&k)(pW|gc;BTf>lfH(I$P%c6J&4i%883AYnu~C?TR4coe0YcS0X< z+-*DCT#+8I+FMZ+*m#juc+{iBY2xm7qu6j+*gfc;=bq3Hg~%Eq(|GQp zQ9=7(9(zfN@z;%~L_?`F^2s(vh*}0Kpm&*HV=Xbfr!|0U%RZ-u#u@g)w&6v$NJWJs zR&0uD;Q0n$G|+kavYJS=_pq2Yyfc;5^2*tKqr(rpzZ-gRUH(u8WFRW6b>eFmj)B9J z*H#ixuM*tZR2BUW&FuCC-Gge+Lo4ty6S8z&?VZM-R~8EwkisyQUtW@_EqvQan@*q8 z;%Yi;0KxjdmpKOE42l__H*ZxgZHI0Jo;a-vvi#WYH-1K#?L29R!~CB2Gah5r4v-Qc z3$98%QRV3eM6jGfY9%)MDz|slEy{7;%>H6zufkTed^&5?lA)eAsdvG>eRTS-)NDea zgoydfOFU2g)df)Ah~mJQ(g#!6Ft(8SYtmS<7-SeWP{nN;w*X11)(* z1;N(89lG=`p*7=rR4kLXMJ(pSrA zmfx&$#H?0n_QPvi-_XQadOZo~c!#f@(5tpwG&88rpy#>Ab0}a%WDzC2nLDmTg~!6yWr#@(!FvUiQVhuN??56`6fG1F z5g|BjJM3=_K8-lRp5WLR`HvKsxKH$iC+Yrkn`9K8>g1%ihc`{6HTFPv1G8AiEY>?d zV&)YHO5j3B92YM~CaLiWvvA2PiS54mihC~apP0r(ogq7jSMx=4#zbaF>_@J@iMa~; zo=5Qw*0pcFsdsofDL-%c%wmj=o!Un14V-pWn4l|044R^*3KOPRwiVN$lVFalG)%s1 z?^%2g&Qe;$BGwJPM<@{`UdZpVKQaq(i%=zdex}A?=pb!cKdUe$PX(%V)WMZA?$t5w zNY;fu+Gk$4Af2UJ&gInX)-60V}q|*CXBoxP;o#M|6z!3$g2h=nM^qj zIMbWoQ+O?Tw$&Br98N|aS)x~7)=CurO!2k)tfFvi2w6_$%oR;8y~?gM{DJ*6<^ zO<3T%Tq~H^kf1uBk9$g?u@5!hd(BA)y?I3kM}PcC)@v!59@FRmK|ehIYhtUl&-Aq; zL_fC|9t1}#PJO!>6Q3}X#t#Y~S#^w7yp;3SQXfwi9t(bVz)E-y^NY58b7%Uhaae@6 zg%39Z!f-S@e&IeEDPv@HAS2){E@DFL;XEW^-0Zm578Z>p=?vFJ-#`9QMV}t}8P)fQ z7B2E7#{m+HjJoL1q4!h2RJxXDSm_k}qszL<^8r3I4rfLJZcAlUf9{1r3;7dw)a&)= z9qpnYQ|#7Sw!MLW61gLdLJwB?xmnkurMP$^c|rw52U5Q}hQS|1;JbJa0$vKAKd;59kb0S!;uRU$yOk_n=5m(iYm8xt^!o#OZMbtcJG)C+v&ujX0O#aT&e`Bll}oG);1b0A{pJF@cG>w=K=)XQ=llM3m@tgN5~tJezXL>fS|z5h%o(Z`rI=1_pjxdr9kFMiVTYv{@@-P zvrOSLG9u?!v(8u$fewmC&+~DZ`@*o0o1xt?A=P{_f20>ye&%5khf(G8#(l+%rQ#vC z9cdZnNOtQCMdwJX&P?*%X{H@kY+WYHlM=)aLy=>Uo*olU_C~cNIScP2mM^iuc_7#a zD~%sp@}n3M=5gnt(+tht(vH%qdHw+k4NGvFpg9~ ziu7*Og8>}&Hpd@z1GA;2)P%dK+aUBf9JYQ3mXb^mCP6orsC&}Ex^ES}Xi|^G?SXk( z;zCaHIwV+3jK^b72>d5;JGE}*W1rpOI9PQMJSBk6qXmY8YsgL9`CgkB{*dIJVe$5R zAVtc|^&S$UrmJQ1DWoMXVb4#=IAhS(#3pZsG|XKYi%CN2yoMx>30HcB)@j-x(f|ZT z3DD5}91_qg#cSJ9UVsS~i(nhpGpnx1IK{*$+y%U)lWvqWo#$*|F9 zKSrEGW1~?t8_Hk{5j8(K_{n$}6uFtbcyDpJj@bzg0EaMs#-~nZ{8n>+l9@icUdcAj zYQIBENlT^HeWqce0`a_fgq6>%&1A(Seb4_zKQb*HvcEM_ zA3NGqW1qje<6NX}%+u&Gvgih>Im$c8Tn?n7f*w4Oq6zs9!g|m$8Ai=CEXATsrUh-P zYh!r9-p`brvPuc5 zLx1{7cu?alRM_a6l-E!7zWpV-oDfT8JS5Xr=Me5y_nQ96*YfuI(;0B{U- zS5jAfbchTQIKU?vXa7|jrkZ&6VDm?u&S0-(RZbZuMOl*gQO75^$FlvuiutxjD`l%P zSr5bkWX;G}*Qt?OPwR6FdbU=(>Me>+3L4qfEuU?0c1o!d#Y)(!f z5#RkYoCFh7VmYAqt!E+L#=ZUEx?T+P;F?%@A7wl=WQMT#CgxjE&dw8j?T}vGMkDHu zCOz1lXKZf+DqIm^o?Cz|7ILa#27P12f06iH?5{YPc~C!%U7H& zQHd=$EI3%gyY*#m$JhxAY;B$=wnm)nugftsr8xzrC;a!{bqJxzWj#5m z^C|}V-Uc!Ch}TMnKh?g=gV0{3Pb9sL?C_3RU8o5$V^#0tVr)nTHY;~W-4}W%-zDE7 zB8N~aY}V+fpU0|8jqXH(nyqeJs`eM6aOp?#LPcF*0}{WGL#`8z8)xh#z#!OIHePE= zJ?bizJzq>Cd;rKHRGy3*B=}lWO8VY@w^1hM>a!?a{TPa+PkbP(OdFOs-r%WU&mHYZ zgulzosW&s1{QaTL)266w^b{NVa$L?~{UXFaJEx?Io|OphUvk6jz>)TkUk1|C-;7i( zNCeQ~c=-Dt{BdZ7Pmz$QIvNP)OWp%mC(iyi#}}Utn4dd8)`*dyl>FK~Pa)F+elB6O2ta#|HDD$b@|LOjso#XlhoqW{|547@M7HzewjWzT zriQF>^$*sR-{f#PwlZ3k&42*(tmsEFWzIrggB0HV&7vY1h1~xzPP|bJ#(9t}&pXUP z(D6~XHbH~JRsoO1*2P&%%iGzkP>1@9Z1aaIIMqf0MNYK)L$s}tocQ=)gAeDew#EkP zF2)au&j~w+uC?vt$RxTS$#t_yo_$|DDOcm7Pvf>~sej>1CpX|#w%ry{Dj5hw1YMy8 zGhZFN+msGK1B&d%b$jOZgY@e|*BI^AKk$8A+QuS13xklXH4`FAW93bb7fG9;SU z{xcVQIlqwkw~WsUivofgyHh<1h}_~G8FE3EU5>zXYv5%^IoK8tHBP*MR;Y!5K(Omi*VSUlfXEVHv`iW#;__F2KRK|u_zWmjmPdY{ zKZ;nSbRBQEjSOo#S=qhos+pFXI#~!fh!g~_*~_)7?*R=g-|lE>WLDcww||;@yPpKT zS-_A5Zw2mz#(#3?>J_Rgt6=v{nVeQ~-Z3(YIF~0R?`)C^an~_Ctzb(?rRBi|w8LM75NMMD!d9x&F%i3guPWTw)h`p6Pc(pO z?ykT;@s}bBm@JJr?;=W!+L=o&r2uA*o-ulf`gTSgsL}(ej^}HRi+cS|Q)Ua9Wo73! z<$yiv{fUg{qEF^@s!Up}6D!%3)M)v+Hdfc*=WTrL15DjliIoJj0^f^kguCOZGjb;o z8fx%cHUHl}6#=CSIv;Qf&=R}7Ivh{9>!(dl<`i_C)8~4A(X$P(#qbav!9y`=>g!N# zsp2%%rks>1f&JfC<-N7a%U^6t#7V=B`W%$U4p2s-Eb6urQoL zlPt`c6;2Z_W4J1H4yPZBzQU9ykbbn9V-D(TThkJM8Bl*JXf&dSpIm3)YRmS<3*^qp@c<3W&p=xik4OIog=^oz4|} zu2YvLuq0g**}td=yuE>5p6uLlGX}VZ%k}Z(CB&kis!c|R7?PWtTObawRV9u7r3cxh zv8!rzd>*Oheeh%QXCR5pdu<#FKeH1|%&mk5me?{K3x*@{f6$SP$U3kyRwz zhCdxdH+tj9&}DXy<=Hn>_ke*271ujCq2_!HS5Z;X_64LADfZHH*PavpM}#haLzim) zHEE;{HJsS6Cqsv=AwGvxv|dMkh_pw%i5w*JJ=DMquy><$C_~V6jf2r0Rg@Hzlo64% zLJ7d^)SdJU1Leo>KQLYsvt{N$Lr>nyDmE3%4iRlU>>Zegvd)Atzp7j0t-P_HuDBbe zCos4FS6N^axYBZ*n)mNNUZ}{Ng#n#j?m;-tis>bE%o0$!`S8zb9iVZHSl|*U^8Y>? zq$o(u(WvKt5%t}HQ2&4Y6{2jH4&jXIlx*3~9%USvA>uO2-a2GtyCXBs%1)AOS=n0- z5lPNo;f&l_zxVa|{(isz=ydP*`}Kakp0DTgF`lnx>j>ss>EFnV$B+yv3=%jerrzcU z>Rvn%7i{(IGU`OS<3Rsg@o|qSn3zo~zy5V#Vq;Kwv>VENtCU4ajKD}eHH@-M0GNv`;-fUfDbXFw!JM3tQu3J0| z_*$2y-EQ0u`<(Jxz`aBs+MCF$@m>J<-rFMsLai1Sfd>=7n{Kw=_+H+nBROjbT=R0@ z)Kwl#IPeO@vQPGl6>5NYDN-cx#b@g?mrVc)7|DzdQ)(Ve9Povdp}o&5nvMUvQ(&_S zYRmZy41?ok1b@^|HSsG4EXn_acd}bY92U@@XUQw z4a}T#)Cui32`lvZ<-fuVtburD{5EblXXXH2{v@L1_R&aEbX&tTIs*H z?DSlY01VBOrZpYc_qE26DXQKylIjgFM=xBLnsE_fX6%wwl4<9j=D8fI#p z%YZi!M)DDc(Zfu?@DyYPZauf!I5KAAd|z)nkm@u51P`vLqii?eLR(YKFMZvYQcR4^ z7y3vcC_~Xpk;>r~tbj|nX*b^WLu~*(ze$M!|G%I}icK{WY@MiU#{Et6w60Rjw;6AP z>o}sgC4ai9{9D!WBp+Blk0$YR#9$m>8> z0yF-0`g=BF!>ZTrUSHB+Tkr6ls58edT&j)~H4Y=K0u=-~BWFT?bYaS@&x~^+Xs;6l zf7X#-IbFaEluJ@?-zY%G9c1!0c&>FwDOCwsT1X{sgu~g{kNhr{dipf@@uAp#V0Ut; z)dD`Rs19Ah;JrSHDmtl8O*Fxf?Pj^PM~$4QuZ5h5EQ@zu90L8&UCF;|;2t6uEtJlGhjuqb0~47* zX{#=xx~GIK(R~ORxCyDfW8(cR6Rvav8)S%#!)xY?Mi2NnjdQCV#0Fm2e?EIs%^^4N z?cdB`4Am?%w`~Cuf$Q}0`+6cGBKlo|fclfc)NEF!fxPlko`2lcV(|*pG~8a z!9s^^_5Blw=J`wLiA0d+chIRW7JvUTrI8S@j*86f?CnhgV{QL5rVU?t8@!q^Y!Tsq zc|N06q$lxHLgoOYl_%&)aLV=M%Z5JJn7C#&{2kvWdi_!*tTo*nerqVy&n0k-xRLH! z=qZRRp@BUBbGMpCPF+6iA&7nw8m^SST`f?PuD-Z@_$ieDh4ue0f^#{Bb79xxMWY~X zeTH+gjH<$xGc#IJ`X22=S@+cBLa22c3&toClL7*8l+)=&%*m`mF$vlA1Wq9;M%}4h zCNs@s>uQN^y z^jWs7bF{&-96~yL)f_tCC@Y5=T3ji5;)tU@_*}X*ky{vHobbm97sd@m1rYRmqMYqC zWUosTl!x{j2#mKmQ%je?Qq7*5L9P z&LHVR=I%`k#WZ41Zx-lY=+B zOna%q-+mLM6mZ}v$>%zB<@I!VkZ?DR5Px&3_vP2gNyb@Ef(T1XcNtsGmnB>8i~;(R zo!_07Oz=P644gu@F?S)0(YEzF?+0th@=o|9y!A(kPh^FIWW!U-;XGqBPX@Emg0(vlIq#} z959`wTI-*DJuexxlnY+Bpy7*+RizUoA4k-H5>)M zvS7Kh?!;KmF#WAmvIYOiJ3^ah=h) z(&Fs*wT)pL*&oY!vg+KNmonnIHttP6!gX!f$tcV>4jk0{Az~hxKnf|B!6I;6kLZ|x z(lV;gHMq-di4;Ft&FS?HSdE=gR2gpFo}Cl0;^9 zRWm%>W|SIA-55r%$jT>bP{FhQx^TJTe}}5fsqd0G2nDLlJR4op6`E#PP#;r^gFjJp zY$d)r?U%KD7UCRzQHHbfV?jK4$TWgW=L3{aC~qO%@@60ZPz5u)?7E8O=c!>YnYyO#E`P?ljz#}1$oiW@wJ(*5u!oT~Y-wSal)@#=N%N|F>WiAGvt6g8m(4w)9W`Y0#-xo&3Ys8_1_Y51p6CJ*Fxz#qrq3Z zqN~dcn%WZU1Z%5JY(Y>?`&#c^teUKH(6~;)%wkR%*uM**#p?L-mCSo&*8`n}ke#XP zQAy;}OvemVW3U59v&nj)NyN z%@{6zOtF}0kiftF0%Iy_xVTE>TnQT7n*y)Av=~_UN#3iF+9RjvCXZgaFzNYZKxCQf zF0W*8fo{JQ1DcSG=TaD=i}j6t>cE~ z#y3(AH%GeJEDoZgg6rFP9Wie&{-|;3enwrOUlcE9TqKX$EQ213_j6}hdjNY!{g7XT z+{;>L@6R4ZFjcxA%#{iz#8eqn8yld8UKfc*Lb6P)C~O-Bcw{5M$Ryr zm$G8G6AUIV_B1B#dwBFkHtMQ=hhO}VavnWA@OPZ+B>-6wN&3?tr*Va`&_F5re2q7PPBs>*{3vtRTCErn{s z`op&TK6nP^R;nP03C>tY%x;zsgZh(_G?W&wl;o*Klzw`}(Z_uG)A)R%LSGyx&rg7o zu+VQscJ8qyuTaC{8=IBkETi7F58khPg*$4ppUV^xM(W4PVAe2OC7_kpH>w|L_JM9n zPWH1`c_inMo~#O#!#_JaRcj_VqpwRZ6kJB4hwt`=#G$xs7u@d3(?N%A!o8$2yy*(C zMe3G!_SLSjsg|7>EWR*M_j<)$t6_~q`x{iGU&aQtRhn4!SE7_DoTEa?ym{ydoz6hC z-_^^$OJ+D}Dmneua$)11A`?xT5STK6^=d$9 zTZSj1BntfBTe1Xxghd!5Lbk(~dgCvWc5wzxhOfi0<4yeD0_5D!eWScCwM?Uvgi5TJ zRT!Ih??J!u4Fgg~y99A%hWUefCJ{4Wg-4}z`bLC@V+z~bq+VTUI}&LoOMJcC zSqxNPVh-=PLbJTTKQ3%Op4}F#YXvHjYd0ibtgerU0T=Di;3ZE~iKHuM5cBvR5A0Ar zZ}nf9c>f?Gz-s@4J|rw69M6eofAgvJJi2^Y(6y0EU%34>}%bVnBj^yM|e#B^&FNiJ~>&00*wNJ zp8vLj$+Dl`JY#D)EJS4 zEBu!&k-J@_`eU#@MC>kO_{_6Ue_Q@GcNL~t227I~`(Kc(^Fg!yAbEfm?kW0}Woh4+hE#pAS3)X=0F=3iTl^uzMODT>2Phtm z;_rR^3}5?*ebAf_q|!f}gn+QR`Xvp@|NS|3m{)pwU3I@!{ufi)o2%5FeO()=E)>*> zSHZcG-_;yIp<2ZWmad%}wJuFM!pzSiE&^bPcqGt4;gb78)84Q-cfexY-=4accAEX$ z!RN=`AXRne$2{kBag83X>X|RMo9jpgEKqrhbT2ANt)+2=j-mHPEF}K+2dIVyNgWR^ zG(O?Dv{rUnnq%1ku^NGAc~+c^1Lt zxguN0{bt7>sP!;q~&F3IQnL|DU}W3{_(-)`3$DO?d)uX5<<+~4=Q zQ|lc%os&U)Q0DZ`{RMXSg8Se&$F`J<2VtB81ds^xGB3qnP24kC3?CgyqJY*KgFm^X zL6!y6*C=9QZyf(aG`d-%FO|+Czb9U0-~ICRS7AfyvWIeAjBx8sA?eDDjzl{9RIl*j zGFe4$E+O3R+p@@9nk8ET9ECJ3tqGe(|0%iIr@VyAEKwQ@{Gqplpxf9clNMT*#&e&WL3 z!ra6~=W}50nLV)xxJaloJI#w-cGACr>qFrgfVBvWX*cV##wcsb(%DlcsWT?pf0On#M&MnjY!U9i{Ht~YNNwo?S&fp7zc_JtOU$FoHBZt-{k&uVP8RliztFPp|o zbo9*c^Jugxm`oS{A}L36tcRL%27|1B$}s$z&-Y!7ZTE?0WFfS|MUR8$?qs@kxc#-Q z>6$ViD`Y|7_ZL!Ghw^YpT~GN$nPQQqS@t-8u6gNL;knMYwk{9ODq+%wA2H5D@{a`+ z-wryDDGa3leWd~W=T)tUQf<&3@TXUJTh;(#L1ylzgbwFZzAi+)3>oi#wQvOuBf|zGG>}Nlb-{jm& zMmCy;`!fQLH-)fC5mMnGD?WH0{+g9CDiv~RrnD4wr#kl2zUl{1wMYk5#mcWnZxUb& zEHG)mou}@*U0@S)f2=ff>QyqvW&Z|o_n@@ls&`|3_B2}Da>KV~zFMIDdG?y6thDvB z(#^Y1?!fm9CK!)&vloTlUAVNU(E>bG#8U4S;g0s>5*|Sq~ z@Ln<9mGZhu(A3n2t%=OD6!1j<_fT>PHRej;pa*hy);c*%>a^FA5LqwKJ{c!cqWZu0*B#Xsyo* zOs)H{%~zMtA{k4q8DInF)@jmH1Zv8gkZ%u!-+>DCFyrsA^q48W%p?aoeBP688eS4W zQ;Fz7{RgLwX(_4F*=FsrsL?K)X3Q<$TB7N)xmy5T-&dsr)MOOOI4bCebeOMA z^dcU<#}yoXz44oRFK;$qgVX~xRBHCV6l-l`8<1iGWFQdajh0tdUY_Y0i8Tsqv>tpn zkByFwc7kWWefzeS-bm*(ioJm#)6RIiI)-;BvJqFM3dz-_xp)${YH-0esXN`;?gd5S zMB4*0##bO}H=B9#Fsk-wmAj>ek6%;2-nf|$;#eb~K7Dr>)X8XWNBrx_3Xf=BZAgQ^REL872NjM0e@?U z83!qBJIV3VALrtPMc{d8-50AAfui8uoH9Fsb<;%3f4oq#sMM5U?NXK;E?UFs&M{%! ziT1Z@;@#30J^KKM_<&ccuhUugY3EpUY{d zrykp98BKqgJN<*hcn;qQ+6jYroo5RuIxdI?50?NrEYGAf+$!zzttV>(}mg~A{e`OV})8wNz?&_>&wqSGG4$H zPQBdc0{_}}Tz0IR^)Yv!^`88}X2+!ZNQGVcc(W?Dl~~q#H;6D`b)AG=R07=Ay0!y} zd;(|#@5v`iSMKK@sdJ;eFZd^a^gu?WZ%VIfw5#`@u zhm~kssFFnHki>ARtQB3-X@|mz%I-XUu+$B^s>0M`T8A1cezmEVop$P2+3lvPdZ0kO zTLI{=HM=bt8UWPPnPXb^*DeajZ$)@0F(@H-IE6r`3`q3+5NzJZ;)*g|`Xhe4@UHb- z8D75%&{|;2ms>SBdxhi207LQo5#!?Nc5rY*{3jnEOTh$8t@Bqj0gPgLgz)!JDpa0` z-N|puAJ81+=l?byAg7sqb@cUN!r!J9`K5jy7w7(Foo-T@1&~yUU$$FjfS(cl-SIaD zj)7)=K%c3dL1}89B7-x$(D~>3)pxPeANi_D9NUhH5%4(){T5bGu-cscQa3GHBsn-Z zc$D|PTRa@tE92I#Tf%+1S?!bQ)8Z@c0$oZ;bCL$?id?ucKxk%#1AT=0GUrZ~nYUNE zr|290`W0`lU2l@aK)BrfQk?%p_O>+s4J4a+58B1a_ULSXdpWu0YAHSFzE>9c-=)`R zPv)cGVG1cckPU!VU6Keg9By5|jxXb{Vr~#Ways#6`$| ztg*8cGkip?$V(MEOVm?dG z?OV*(cS1aN8w<_9D(j8Z+gO~1p4|j5&X$h6f@^Y)R%{lz9AQei5Yu9{p;Q$u0Y~$Z zW#z+9-9$B6KY0J_M^iL+fmDyl2;4(=Kx;dT3Pkr%L%v~K7=WWU6dy%lB3f{%m zjHF`6%T2cL!8W9xbfe3wqxoI%AbgV3K>Dvw06T$;;s01tOXF}~!t;;UFWSwG$f^;! z))ZG0O7D0W_@G0w4Gdy>aMKN-rMMcMJ;zSlifoh$sBdako7Hxr?{Y*DMS3qHJ}n2W zo|q=5iee$f7-Y%_TF^+{b4jB&3Evk9u?UEbXAf*AJdas>w z{bNDeTLyCdyb4?{FU+SS7o(@&%RQL<$c|+~2X;Ou;pU+Uk}-a{G<7y<^;#=dssXUc}LRZ5A%EI-Z|gh zsMXDdR=pO7CGdqgBl{07U6*ZpYKw#P!bJ@scqr`*@@juvPh?A6&?7VYTExkeU5Tv3 zxVgWL2>n=g<-w}Ni>YrlTyN;`?BN=TAs~vd$7BWy>Bb75WO^eZ*ZFexRXfqV%n!mb zFQ>mozme&bD|m>1P#c9Cp)2k4AIbB1V>Qd388}Xj z^(o`<4!UT4L@|CbAM!5v(t9$0JxUxf5(%yN-}NOB#Owoji(>Os(e}|tM7|r>$f`+~ z#9k?J2}Qfb1G6rY?f#x`9?#WI9~P3zM#jeS$}#sN$m@Ar!!sdn{UJXsq+i!dm#J*U?E&uDf??R6Z%wS92+cby#g`5y;h*2p zU)anK3_Y1LS*hxh=?pTMz4f#=XI^ZJ5+Aj7y9NJX=I5WO-eS>NvD)Ttrd}7w`~KXe z&i1z0qL5)||N3^%q6Xo)u?DiE z4K$Fy_0^}T>yI;TUwwEa;eD2@*RZd#Z>|XsF0{F}#Y^jrK1gUSSSV~kIsaLls@|Y9 zK+87@KK)jB*I6~pqL&ffu9(GJ4tYRa7$D_6hMKt;Lrn%E_nJnMa!^Bn{$=Yn`Wvx& zmM>1iwx5J|o;na%&48`i@yDX2|4@3#DI7f84uusvF0 zIj8o%iFyXKU`ul&8>GF8ZuIbQwg=kzgz%e4;)>VE4^U7i(*DFE_N!?xYx^GT=qvqo zuocq164-g2w%1pmxzN236Z($K@aLZy^ju)CorRz>{w|-;^-e%3=3XHmA%f}pjpg$T zVa#(&H-I($V_1mm!z?E2O#77aq)vP;YF+n<&2b6zxRPqu5UP1>K!`SW9!}gV)wZwZ zoZ!{2s~dFS67?f+>VzeQWYVd!|M9v2LMxU1(`{fwAs5`&FSm43;h`u)t5Yt*O?0(I zoN&<5qEKaoUx5kRx_W(3RPG`5`YPj>D zE3VfF5fwrM$943CmjCAZw>YeTKjj?lL$+)(PZr5uEgu#bStZ>**x>2p)(MbXoGf(o zzE@hYer-m{^aLbd%WB4PgG&fiF|BjT*Hdi|g)f@#7%idZ z>W4<~vWAAIx*5aP(K#|51?ZrdlXxlmV!5HO23C14ADhg2WBq;T2vo>Nu(|t?V%;^l zrWC6S`!}{qsVR{nOZtakb!FD1R3NFTVWQb^TarB?q0NKDtjA7~z!P`wQRG=0_$ zO(s$4y1&EQqhA*W?tZ^5)+Frs0}${14~THbg##^lIl?Zyo8Vf(c@ z{1%AuzzGIG)as^JFr4s;F@BBQFrT~or(q=1I9Anm)m(BZ`Gx3 zsj)ox+R7Ctb;nT#cZj=ng~`Fgw)Rp8_W@`aKwX(b!`5flPTtfznUu8vNpfz`_!kpB z_{pvHUi&W#N*oMdqtN;}mO$F4Rq&>;Na@{0mUxiPpJ(1@gq0jNniDDyUGZb8vVq90 zlAi|)%v#Md?s}5z^{F6VNj-bwE#G$!;n$j-7V0tVFKM^75BkcPC4c!LcHfR5i#E}X zbCwTJ1Rl*zq4#$`Y4ZVN=mki*#^?jMqa3ooTu&bnx2;i=-O0rIS0*T^VXiH^hEtz) zu6N~BIksfI$=q`aVx6z|lBv@^4RhJ}{t+G^4Y&V^wLDQ?9}tQ49#K-zqeN;>KP3LF zv=jiUxSjsl2`V0T;mhQdyk_jL*b7*?FCeVEa#>bxp_bl$#4$3hnk)wnBR>mF17QmzQ!Cew`iGf#(RrzWv*~ofecm5iMh` ziHL;5_;%nO#nAy`YlYRi6WK{UVV1Za-Ci+VcdF~0o~G_`5HpA2sh=y{<3D;%(Sj`+A_tI3z% z@Xp&zmdY6#TGKR{wBvIAV1P-B6-OHfCnQ1$R1-qqwLJY&x}eS#Wg6=ST@or!S`Aze z`)oKvJ*c#Lj4SlcyaQABtgtW(e&C&bSk8M-Lr!PP{^|}pM(RR{lBUdQ8%se0L|oxf zVPTxt@4hPrgp=P`kp4$x9uf2ra*Zs`qm+JTSL4!JbXfJcg0HBdY<}12B6HoCpW+Q! z`Mm1T>hY9D{kdencbYSr=S9%P{q!E#;A@puIBK7_2Q9_ojjEQFE($E){n6Ja^3I(# zj~!3GKC^x^y9kZADsE}0uv&2bMF}AjNtAy#_vog41Tb>yWI*iL&#;s;O!2?I2U^x2 z)DoX$%CHhaTW1##vX&Pz1{~x-00Y{ioiRlRvEcnnp&b7^pEQhexZ z{d%11Vz|%feMRX--f?heF(-hvx8vj_Y8#%kmeGYT>E%q+M1H;k7Z{$|(96MQ%TQ^d zWu2isp@)qta!FA9}-Wde~P0|-U8ZA>BE4<()!eDwohL{yZt~V z{=l`pFVUk9-MEt_^`htOrt@rHB76e9pA6ZU{IkfyjasKhb~ielOlEc7$qZC9!#~Ol zK~6!Z4;1F2bIks9YWq9Ad}8joVA3PWgw7*{X>A2-mwbN?2UwBxwVAb_&+RA}U~ zW2j#zc+ef!^k}{xy(861hIaN%&Eeboqgz>&;B8HayB$#A@W znfoA0!IUfL&tehC;bim@nK0PO_EAnXUGiJHX>rb(eP)G5O>Hf9TyarjC_Z|r@W9dA zAHm*{a$7mOvLbq%M?QZAtlRZ?ygWiPYj785j4x%Uj?x>|?41t$RP5&K@=g$hS_2bj;;$8>S^!JBNz9-}{(C)ECBmSWacVOs2p? z_fVX}uw^6Hn#kP+ajHYz7XD3O>_lR}(v^;7DxVtk=pHaTp5mg(sA9?VoOO@6-lSf1 zluNlWLp9!z3E>WGNlik0NeV?d4)dJCq?ypCo3Y;CDuJ;zd@OBn;&YmyY;hps9fJtp z_J+E1!Im!ie{*HT8=vSNw{m1kINv>H$#*HAX4`c(zJ!Mo#3E%;~s8F@QZ=;aMxOnu4&SR9$0ujZ7L zhS1Bue0qaaVy&sw0 zogZh>+L;uJD=3l})p#y1jc@*=am8`kST83ii#@sn#t~bcladp402E)O82PQ0WlIPB zyevtoGhjvaHH$(mZ{&2U*>q}gcEJ0i+3g^cAlFGqcwrAprf}ubI&;szvk~kA0veGe z>w|;ZH9hGyo~z&TaDegRV{Ic;((28~g@y*5j0m@(JkPx{slS5+q2yw5yuWx3*>ceu zvcg3WIPNh2!d_1!0Wve##V2I;0kk7Od=bIn;mm`cg07Fqq(}BhT=HD47UE4-Y8Y3j zeeCJb{?1k1vNEo^VgmdQpkxYQ>R0_IUmL&=0;^5WHK(uVwtiyAyV?XfzI>_lyuu;e zAHdtbFsXVeO7(gdC@5>ve^z}h4xtlNIN?JkK*GfTfQX~2Scu|HlVJQ)tDEIQ^X0ni zj+tXg0!vHNncV|RSyzRTZ{SYrkW)qMPBqF=p-W;}Pyz^&dcYBOR!|%_lqs15h*Txau0%U# z_6mJxHH63W0)=UQ2q|Csem6=u&HC3@_6Ywgdzn)7qwF%YlK{g{Gn0XME~pxS1Hsq0 zCC?wO_`N_Z>a=vCVHA6^hm1uHqPrpfsr~l4Y7NQoC$Ic6AWXVHr6fU{yjf4_iX}?m z<916OKXbN|hiY+U=&5Dd`Ee`nP!{MibBx27+_~RG8q1cLp#gZVNc;fwto}iU4>#Q?roHuZKbzU!2 zqck#f;iz@~_EP?tbgmB*efm)F`a{mn_ygVwV`$H{1B6*H-srrfBB~f^eU%-ppMH2#4Lhr&EsM)K-VzPreYiucH~d< z7BBnC2(!}cYE*npt6Ggpv}f0&VfpIYUX3Oelf^+y)~6EF*571H$w;%liSWoLgEzQ; zQW50zF63BzkRBA5^=%-DcWabh=rr$=fsmI+VbGdd zY;`3}q*cb_AZ|&ob^qqD4?Ed7cX#m8326cET1CeZwBnSnT`wM&8)oNq`go5#&o)K^+AHRog z0V^FgDPNj{ocXpODJ28_OUY_rhTfQOa@Y29;HR(8CUP=Qu4v|A-{L!%xmn9{Z> zth!T#vU1}3Mlp1!Z$9#oatvU9q@ld7I@tJX!NF)Uj;&<*x(aE}1a3+fs5zyBPW;># zdlLb4QcRabiFT3E%aME;aUustsjOqq0lF`?`Q=|g%#^Mq3PAYh>%Rj3&XV*@7{9|G z_OUlyn=1bUbpci&mEI^TBjf!cOO?+*8mCy{)Dfr}S#OfeJBXfI=NXdKGR`rUwATN* zkVwCG(~&3MaH-Gxe-zGX8;P;W+YRjnd}JmToqk!2R>dX#kG8B^8&+b`sElixV3z zsf}}_9Wa!9F{S71O~0@;mUHGsx@Eg$60zO;K#U?gld}_pzRSOVZlPJqmujzi%47w^=9lagsud05BJ-&l0%IV*Sp3O zT&NG*L}U_oINU>sH6BjUDj7;DS&lPidF76onOJqyEglvAl4CBld;Kd?!s>(;OE0Ws zvudl>X#`7fIeDUPkU4vuWt=rIUxxrQ+8Qv`0flHh&`M5=2Bk5)@AT8eDzN4R^?=H*?BQMmp!kln>N5xL8*tsh$8eT3CgAv=jkTYigTTR!&>(mytd+!nTAdRoC$dw#@H5zL znPq3-tyTk8z5h)_K(z-);y}e$SVsY!)I*V*e~tk${^KI8zs29zFP4=ts@~M>jUEgE zrCenyU5G`bfXLiF09@2NmP<^J3}NS=_C~yKn!rlvMqkx0ssv6Ii`L`>BGrqtgr^lD zyuY71%1@!zyq||)dL2CYqQ~BA1EQe!IuETT)iw8w17%(Z7)UtZq9;nD$X_oIBf^(~T~dUM&M&fujN`o(PbF9B=|~`m(T_(jovl$=-Te;6qqSOLNcm z!$mV&M{#cfR9D>)sT7t{ky0$@l9PGvVd`F_IQ*=RPC5Y{o{TZLDy<>-MkYxrYf&XQ z5lp~885WyK?yF5$fCne2pDJ5$1^08y&oePyqjQ{%E)!>pu*ql)cyGn)c*6(+>&raj z7Lwj>^KmL*l!=fUFNp2AM1`<=A?E*yb`xP9SakSC{ZqWY!U3)GO}d$6ErpVy7l3rT z?8(EKK6i#>rCFI<%qAsC#IV!xF#MgekF6;%U-mw$1MV#1>+OE4t;M9R@prjA$+gVm zZ>9RJ7K6+i{D459POWf)-Dd-$bo%l)2c?3PN{?rgAD{dX{^7rpWs-uuvA9@tJ5rO* zNt|7Jod;?-Z0`QLET+NH@uWkhlN1x|M1ESeYr7c8(W+Q1~ z;q%Bslo9k?ueiX5ii@*=P=K&xfjh`0;J#598n%$X--Y%f{vP4*`>j-|0PC1&BF; zj;%L<;9w_5=+%Hdvhev~+XV=)0JJf^$dmXX_<|f^F{$_p%U0ZsgDFQS;te&ryXwLE z@6@+P%Ne?Dga;;Us&3!jxp75aq0}0`!qa&x(5wDJ4^yOsOuyn!3<%}4)x)M>sfJVscCsnZ( z;s&3}nkVk6^>p!Jp?CaoiEqHB4QF|-Wt=Z|kJZteU3E771%>0P3I}Dpd4E1fV72_Ln)QgkAl)LSTyPJrJ-^$lnvsQv(<2S ziY>H%(ZP!q)8&4{jB1FiBjWC-od>YeQrIGRrt{3y=TH5Zy%WM^v&7P4dMtpJwgnRx{s&EA4izY&n>aV6~Z6 z->CcvO?+dybXWJIb}oC3T7h!`U2;WBE^IMHrmma|j!h`W8q|_Ampka?h#cDFT-@S? zEPa(YU>bkxl{l4#H2L9VzA3h@%tBCv_9*EI-BV`6y@7KqYOspX9q2WTC&^8r2nMbP zv`Y-Sa=5CTEkERu?o6+_GJ5(4?fV-!R6HgY?rIG=q6@ACFM=ERq75mcrNC2Tv zt96}g!J6*Aa*q!LJhc7xr_Dg#xU|JP1<*f+(c8G&S|U&_e`%(?v8frmeA z02g$jJmAeQbpF-UP)#bVrvPqTI=IKr{N_JZP1_AMJmL~YgFxrl=MRQV+}yJ&;A9|r;mHN&ehit102wE4I@|B z^P|I>St{bHR=m#@e6qpaNc|mvlY{G40xh)14OybRc|T5<6IU=REOZ`62u@|XPnZBD z`O-A(H(i|a$81GbN0{S{kfya9i$EFf@A0CgH|FxgJ_J^d*v$5-1S(rr-}#>CRY|Y5 zsRdg&iaBUs-HG)&imT{TAS=ml{6Pli$S@0g&M3#%Ctx|0gFmtB&W3MM%K^O z-?%B4AD@?!5jV2TFh5A00ft|AJnnz01htiP1*})oUw{=>f66BY|>SC}=m91dRv=o$cj-6;9XSTJ{H4=Lc2;{?NLo zfX01Jh$PL&S)DCe#Q=O-?oYcjV%9dY*vqZ;bjuYyNBmybFU>!>UJ-n{(KXp}Sc5CG zI(6DjsX!JU;nP|zPX5W#x`arFsexPckicbxV1FA%m~&1y?FS~vEdIg{O5x1Ge|>{Z zkocsWd$6-zG&uOUF4!DNax>&;ecb{>&UPYWN&MUrW})J2y&{Gl(C{r?C1>9P%H_Z= z=@pCtAS>Ix^Xv4FFW5dO@X%4$9~4J)m%ZX$_zQB>M%gd%jdNP<*a5m#I9r_)l&i1` zCPoImYh9JK%vMyu7F!XqY5iw~73aH<^U6(M)K|%t-FUp8n}w7*J3orG2ZiXZTuk?P zK~gebS0Ij}`w_#H_B6uRSwL}Uz$ah8&L4MUnIVq5n`t3N`ZD6)q{|ha?SRQI{k2SK zbMd5tM+r#C4J~vTyt_BN8(w+h`(CfaCEaxL<*-Qj!lhz!QjIKIXUDDQ z#|FcKfy#5=G)gdsYO?=w5NI%k z5V#{d|F?ZRVvfF**M)3FvTK`qp|0B%HOJYiWNf+faS)|fnzVz z&X%&(HE82xnXu(a_uHaPI>eJ~g=&}?BPQkRMmKNKF5UH^$@a4Q)x;Rj%Yg#O0qy53 zo z?#rkpa)_JShuC6ZT^G%zETf-i9BI_A~&M3O_RB+HWs zlecgo43z8{5DchElTjdD!}X)HF@;luHMhQ9oh+-ftWN6=|Bh%aj;GRJrGll*NJP|pkuC{4UT=e)EF8~l8!_kGYV#9aEbhs{zicDXUw z1^Acq{cVB3%(F0lja0;&W3UP8UXQrUXLe6iAkpE!g5q&F3#1 zUE8YYrh%vYipIk{La)4$Pr9}$Mu!`8MO_~_?0v8 zEOkQPTlZelyl&RiKEzD=^GVS9Sz!uqS#Sw9*lDSE9U_Pc|9M(VjHH3`{<4n+{h!LN zJRYj`|7XcoF|tGk6KRyPedL=9b zw$3?xHp`$RGPppM@-15fnPp`)!X^yYG9 zZ^V%h6`Hz|x!4riA3j$60_d!=e2xs9xUVzkA5vj^?PEnpmi3{>WV`j~lqc6~mL)E@ zdhVah?EZ2t=jH3bG5_`WOaX=UcouW)LmPXcE1JdiLRX`XDNIe| z+RMmOsb#PKJdLigYa!_CaZY^xRISMF3rt*m{;_er;yjdy;D6d=Kr(WP#*gks(qw!u zmxb*+t*zy$EFM}y<6ybx+k1kHOK^x6!9fa!Y=K$uqOqt%e(CU}PcOvkkV_iAg9djm z+Y|^&whedPm!6_GOIi?Bh&O^#y`*e=HLlK=Uk)x1xZdXv|2&X18%z!gK2y{95N$w{ z6ZiXQa_Ru7vy2tq9C)FQF3&hL`I>qrNmuqZ>g8xfw!s66Ht8ZM6rZ5q@KnBJhs(2r zldspB1EcychvJcP9^0^TNYtc=>eHfL?W?-Ud1n(EjTh9$+M$e?FwhlObS`XvACVJd zkt~q3i~nt7iTS1qW#Uy)249Dy40>*pd(@Q-_lGHQ+T8Z%h$@POom{gZ#U1T}9y9orz2yPt z##v%q)w?~^*rg6HQCdUxajmuD^q9oo$Y>2Qj#F~AN*s&-bv^Tdh|0Hwp{zNxoVovER5MtEfQ!67Z{m*vV<4_2*2Zk3w1a&wx?v`X&VSo4$mm8|X&^yB$fV6vU0LW-`ti_`7!|Yl*15 zE`~Ciw7)=dOAoy90?p7}3sXvv$D(D#^Hmjd{F(1c8I6wG9){FP>*= z!{K5aYNp0--_a0)OA=P@YOI}0W-hxhRUep;)3)UW`?@%@w5(S6*KF?`6xBSp<%WKY z=ojzpXlWq0Ft)UnvRi9AYt(z=n)##roEQAQmo25k|7d$5qVfo$8;xzL=;5Vurvw4d z;$^UE;#*X4>e=9rI_;$LiHjwvzlhgR&J?AjMo8Pz_U)pgc2NbTitKY?4YxW%G}>nj596h-vPH>-XU9`fLbyA{1^zU6v%ovLsw=M6 zax=w#X$!@neW>K&3e||zRe%@Qfp^8CdIXSJ;VQpJOX?dus%fEN#Sc1!wa33wO!;~Y zi5V2VC8Y^wqrUP8bQgZ@fOYo!GzZBiC2y9gElGYQALBYgLzz`G1f{~1mCx5)M>j>s zgDbK=*Tc{o7i{ z((K3&qb?^d@H-kJ=^4i-Ecm}}?30+*E9Uzbb+7p3hdSzsRf7?;#~NPPHM6QqYT6Q~ z6_LDA2@L~Vi@p)Uvg-lV{6lt_+}pYbH2u#)H{I7b1n(0cSq}k+&hxw#zgz~SGl ztug@85*Gh9?-G>AX5Afx5oXV^2&3jo168>J#U5Ls{rtpqsN@}kXp`iCXH!-#s({mE zi^Hu(ICynt3=a=OQXcLx@OnZWKVGxw>l1!7OZfRT%c#02)!_`5>};C{)ukv(%FZ2z z+{{2545LPeoNeZ3rB~t6yHpq^?WCz+E01*C;?dv&LxA$ZaH9WjT-*+h`IqHwFU~L* z*;$7Ha5W4Bnxy$>`UC(>kzz`k=e2d?Aj`&L8HhkgdfOHav>|n|ZJkDO7#~Bvk_M^C z8W~h3TJm1fK;35s<{N3RIs!3HS6o_rbyA4KoaMmsG;0(Ga>t_7VFdJxJ?#c&kXA%D zhM&h^J5Qm@XfGT!d>6mGaD3*ATVm|qjYfx*-#R%li1xphQ>J8qkwIXk4#kYZ88Blw z(udWILaKuruK0LIbFVjy!4A8jD#tT}Zgy8tjSv`?K0$fH4mIbwa$!YFnCFQ;`R z%+PT~UKPp!7q%@b4Nw_KF<9CTdT3USMb(2b@Vd)n-*`xF@!c@cId&|?D{(%>LOtQ+ z2lpVjHN_d-x{7tf6~d=4D#XBvyoI`N&wa|pBF2;x%DeOmnmKdpuk0VpG6m%^aGZXqVLFTzT@B~dHZK+WxE2oLJ|H65Wo{vbY>9Epn{|+Jq;6>S z!MG$KFaz^vmJ>jw9~HZp2~IlVwBEiroN&{RGHSh*VU`k;K=Ip!JyD2jXwOuB*JmTl z9;@W{@J0FV4jkvE@mufTLd+w@xOCX$gagXdk*ZZu&b^jIUo*ed8%X|mgvl4rX6s6e z8L34poZQ>X(z_F}S0qQ$A==qdM43gtV~K;wqTPW(j4-Jb`{3dfDw>A5^cYM^!V*gR zK{l$1r|keG%!IPZiiXtAU`S$S*c_riX;ci>LY-9Y-u+*^`y5koyQfav0robJ<7U;B z3PavL=;^&@gums5`}+bON%;q&Bv}bD`|9P=Ry#9AdhjpK7`s@I2hG04P417`WNHkv zA`VQ)!6d(=*fRxu_v*@&M}^*qtcAigF^mmvyiN%4z{y1vxiu-CrNG>VREMHX7^6$>7m_{;I()J19nfqUpVt zx8j>XGA~IDmcJQE5*=ry44IP4iumnQo!XDaePw=Ai(IX}4VrUfWy}(~8KgvV4w*j8 z*=+$BGn9+gIX;Q0cgw^#B{ub<6 zlfhjt_iz)#^S@OJM61_J!sM7O$qqsj$JU3=wA7|)i<+7Kn=-?1D@JY*OLNdyyzb*@ zT@iZ;t5cCmd((xPt#t#c!Y&}xEe`;biYJLwGged%irA@eSASwUeo7CCqo~Wu%9h{1 zL{uX2uMpq~umnAW7U#b7t6*-VVCyGJx7%01677wOgqbC5Q%-4ZO1l2acK3;BL4|g0 z=5}Qw@wf?2Z{nCq2p_w<8%b&G+bau5Ds5yZg#qNbTJB@fNki}2`^y~F`V|~%k&uJv zOd``GY<4O6<|p!vKZ#gO%9A)w<-kVFTIms~epj8=#5n>JSoxZOy&CmR?(~)&3tEdM z&*NT6F-{`Qk2HWK<4?bldiGTXe}Fv$lS(O=(wWZF&=T(pd1*M$j5JieI(TOGABJto zJPbXGst=^%qoasyNloNU`?e|X*0y)Mlf!$mKlMl@7#fUz=X>n_CGmvNVONT?xLQp_bVn8-PvHC$EUHo!6?T%3(vnKd>{M3Pk zDyLGPy56B{MAqaGP~c_FK_P8t7S0ql4D6ulyq~^GN3h9>IMHI5i3YzlbCh#N<`4c`sE%$t^t}xNZZ)<)2mbnOyOQnPXq!dg4+@VNQ>koH~DjKC)^A&BiyJW`GT-u-WO)A0d{;BR(_0?ofsJ8V=BSOIB-L?$F`|3IAnb zYy~sJyJ0?;27f3xg35TZ8*guX9Bvp|38`K$yl$+4EOx=kSkIqkui(mLEocq={)2TP zN0IOUgD?pan?qQDE70?T$Ma5T@a&@qZsa29wqIw?Vl*J02t+auen3c=+*(E?$>f)G>}kSlBB*?=d%ANcuDNJ2qc z_|OMc=s(M2X*-~>3#yQRg;SkbbC8$qkK%ViyD#4T!H2vd6mQgcVM)*QUV=8~9j_b* zzQ@OT;wf-jB50N!U^RfuU}8a7xN##rP$3&!mftEjOKK7~zB%ytN;}xCu#evnUka!~S3G0qXS{kTx~*qGte# zs=Wjj(R0Ax2H1HmT!j+M8`iMN^3p#Vw(Ri_R)x_2?GOkHp?(9IPV=}p0Ej$N??3AN z-9ht_M}M(hN0Jm0G%zpl{ju2q;{wovpeE(jZ?fW#$AJU7q0lr2!G1iQ@5VJJy8|NT zv)O?D0(44K+isrgssHUvz)G}V0%p1NanuD;(02f9-P>S%{VW;G5};XbP@oF> zU;oyho$$x^z@~!tJuqS+8PwfNoU)&b{RQBHhq|&%7&P&L~@#{KY{`J6) UhKx@Ro4}uq70!}s{#(p{06!L1(*OVf literal 0 HcmV?d00001 diff --git a/content/concepts/images/v4-nft-1.png b/content/concepts/images/v4-nft-1.png deleted file mode 100644 index a45eb96c9bea6a940111b8548dc50a100405211c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6827 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 diff --git a/content/concepts/v4-nft.md b/content/concepts/v4-nft.md index 86012c64..de49c40e 100644 --- a/content/concepts/v4-nft.md +++ b/content/concepts/v4-nft.md @@ -1,30 +1,37 @@ -### What is NFT? +### NFTS -A non-fungible token stored on the blockchain represents a unique asset. NFTs can represent images, videos, digital art, or any piece of information. NFTs can be traded and allow transfer of ownership and copyright. +A non-fungible token stored on the blockchain represents a unique asset. NFTs can represent images, videos, digital art, or any piece of information. NFTs can be traded and allow transfer of ownership and copyright. [EIP-721](https://eips.ethereum.org/EIPS/eip-721) defines an interface for handling NFTs on Ethereum blockchain. The creator of the NFT can deploy a new contract on Ethereum or any Blockchain supporting NFT related interface and also, transfer the ownership through the transaction(s). -### How are NFTs handled in the Blockchain world? +### Terminology -[EIP-721](https://eips.ethereum.org/EIPS/eip-721) defines an interface for handling NFTs on Ethereum blockchain. The creator of the NFT can deploy a new contract on Ethereum or any Blockchain supporting NFT related interface and also, transfer the ownership through the transaction(s). +- **Base IP** means the artifact being copyrighted. Represented by the {ERC721 address, tokenId} from the publish transactions. -### How will Ocean Protocol support the NFT market? +- **Base IP holder** means the holder of the Base IP. Represented as the the actor that did the initial "publish" action. -Ocean Protocol defines an [ERC721Factory](https://github.com/oceanprotocol/contracts/blob/v4Hardhat/contracts/ERC721Factory.sol) contract, allowing users to deploy ERC721 contract instances on any supported networks.The deployed contract can be associated with Metadata information that describes the unique asset. The Metadata is also stored on-chain. The [Metadata](https://github.com/oceanprotocol/contracts/blob/v4Hardhat/contracts/metadata/Metadata.sol) contract will contain information about the NFT, and associated access rights defined through roles. +- **Sub-licensee** is the holder of the sub-license. Represented as the entity that controls address ERC721.\_owners[tokenId=x]. -![Image 1](images/v4-nft-1.png) +- **To Publish**: Claim copyright or exclusive base license -### Combining ERC721 and ERC20 +- **To Sub-license**:Transfer one (of many) sub-licenses to new licensee: ERC20.transfer(to=licensee, value=1.0) -ERC20 interface represents fungible tokens. ERC721 and ERC20 combined together can be used for sub-licensing. These sub-licenses can be traded on any AMM as the underlying contract is ERC20 compliant. +### Supporting NFT using Ocean Protocol -Ocean Protocol's [ERC721Template](https://github.com/oceanprotocol/contracts/blob/v4Hardhat/contracts/templates/ERC721Template.sol) provides functionality to create comibinations of ERC721 and ERC20 contract pairs, each of this pair can represent a different sub-license. +Ocean Protocol defines an [ERC721Factory](https://github.com/oceanprotocol/contracts/blob/v4main/contracts/ERC721Factory.sol) contract, allowing **Base IP holders** to create their own ERC721 instances on any supported networks. The deployed contract stores Metadata, ownership, sub-license information, permissions. The creater of the contract can also create and mint ERC20 token instances for sub-licensing the **Base IP**. -![Combining ERC721 and ERC20](images/v4-nft-2.png) +### Sub licensing the Base IP +ERC721 tokens are non-fungiable, thus cannot be used for automatic price discovery like ERC20 tokens. ERC721 and ERC20 combined together can be used for sub-licensing. Ocean Protocol's [ERC721Template](https://github.com/oceanprotocol/contracts/blob/v4main/contracts/templates/ERC721Template.sol) solves this problem by using ERC721 for tokenizing the **Base IP** and tokenzing sub-licenses by using ERC20. Thus, sub-licenses can be traded on any AMM as the underlying contract is ERC20 compliant. + +### Use case + +Alice is author of a book. Alice wants to hold the copyright of her work but, allow others to read her book. So, She creates 2 versions of her book namely: digital copy, physcial copy. She assigns Bob as the manager for the digital edition of the book. Here, **Base IP** is the book. **Base IP holder** is Alice and Bob is **Sub-licensee** for digital edition of the book. Alice tokensises her work by performing **Publish** action i.e _ERC721.safeMint(to=aliceWalletAddress, tokenid=1)_. Alice also creates a sub-licenses of her book by creating two ERC20 tokens and transerfers the digital copy token to Bob's wallet. + +![Image 1](images/v4-nft-1.PNG) ### Other References - https://en.wikipedia.org/wiki/Non-fungible_token -- https://blog.oceanprotocol.com/nfts-ip-3-combining-erc721-erc20-b69ea659115e -- https://blog.oceanprotocol.com/nfts-ip-2-leveraging-erc20-fungibility-bcee162290e3 - https://blog.oceanprotocol.com/nfts-ip-1-practical-connections-of-erc721-with-intellectual-property-dc216aaf005d +- https://blog.oceanprotocol.com/nfts-ip-2-leveraging-erc20-fungibility-bcee162290e3 +- https://blog.oceanprotocol.com/nfts-ip-3-combining-erc721-erc20-b69ea659115e - https://blog.oceanprotocol.com/on-difficult-to-explain-fungibility-sightings-in-nfts-26bc18620f70 From e94e22275a162a992edadfe85901e43c86feb6f8 Mon Sep 17 00:00:00 2001 From: Akshay Date: Tue, 28 Sep 2021 11:58:15 +0200 Subject: [PATCH 006/145] Issue-#701: Improve v4-NFT doc --- content/concepts/v4-nft.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/concepts/v4-nft.md b/content/concepts/v4-nft.md index de49c40e..caca9b3a 100644 --- a/content/concepts/v4-nft.md +++ b/content/concepts/v4-nft.md @@ -16,15 +16,15 @@ A non-fungible token stored on the blockchain represents a unique asset. NFTs ca ### Supporting NFT using Ocean Protocol -Ocean Protocol defines an [ERC721Factory](https://github.com/oceanprotocol/contracts/blob/v4main/contracts/ERC721Factory.sol) contract, allowing **Base IP holders** to create their own ERC721 instances on any supported networks. The deployed contract stores Metadata, ownership, sub-license information, permissions. The creater of the contract can also create and mint ERC20 token instances for sub-licensing the **Base IP**. +Ocean Protocol defines [ERC721Factory](https://github.com/oceanprotocol/contracts/blob/v4main/contracts/ERC721Factory.sol) contract, allowing **Base IP holders** to create their ERC721 contract instances on any supported networks. The deployed contract stores Metadata, ownership, sub-license information, permissions. The creator of the contract can also create and mint ERC20 token instances for sub-licensing the **Base IP**. ### Sub licensing the Base IP -ERC721 tokens are non-fungiable, thus cannot be used for automatic price discovery like ERC20 tokens. ERC721 and ERC20 combined together can be used for sub-licensing. Ocean Protocol's [ERC721Template](https://github.com/oceanprotocol/contracts/blob/v4main/contracts/templates/ERC721Template.sol) solves this problem by using ERC721 for tokenizing the **Base IP** and tokenzing sub-licenses by using ERC20. Thus, sub-licenses can be traded on any AMM as the underlying contract is ERC20 compliant. +ERC721 tokens are non-fungible, thus cannot be used for automatic price discovery like ERC20 tokens. ERC721 and ERC20 combined together can be used for sub-licensing. Ocean Protocol's [ERC721Template](https://github.com/oceanprotocol/contracts/blob/v4main/contracts/templates/ERC721Template.sol) solves this problem by using ERC721 for tokenizing the **Base IP** and tokenizing sub-licenses by using ERC20. Thus, sub-licenses can be traded on any AMM as the underlying contract is ERC20 compliant. ### Use case -Alice is author of a book. Alice wants to hold the copyright of her work but, allow others to read her book. So, She creates 2 versions of her book namely: digital copy, physcial copy. She assigns Bob as the manager for the digital edition of the book. Here, **Base IP** is the book. **Base IP holder** is Alice and Bob is **Sub-licensee** for digital edition of the book. Alice tokensises her work by performing **Publish** action i.e _ERC721.safeMint(to=aliceWalletAddress, tokenid=1)_. Alice also creates a sub-licenses of her book by creating two ERC20 tokens and transerfers the digital copy token to Bob's wallet. +Alice is the author of a book. Alice wants to hold the copyright of her work but, allows others to read her book. So, She creates 2 versions of her book namely: digital copy, physical copy. She assigns Bob as one of the holder of digital edition of the book. Here, **Base IP** is the book. **Base IP holder** is Alice and Bob is **Sub-licensee** for a digital edition of the book. Alice tokenizes her work by performing **Publish** action i.e _ERC721.safeMint(to=aliceWalletAddress, tokenid=1)_. Alice also creates sub-licenses of her book by creating two ERC20 tokens and transefers the digital copy token to Bob's wallet. ![Image 1](images/v4-nft-1.PNG) From 932c02af9badd8d1eb9b2b5cb878989be00fa9f8 Mon Sep 17 00:00:00 2001 From: Akshay Date: Tue, 28 Sep 2021 12:13:55 +0200 Subject: [PATCH 007/145] Issue-#701: Improve v4-NFT doc --- content/concepts/v4-nft.md | 17 +++++++++++------ content/concepts/v4-roles.md | 11 ++++++++--- data/sidebars/concepts.yml | 2 +- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/content/concepts/v4-nft.md b/content/concepts/v4-nft.md index caca9b3a..99c283a8 100644 --- a/content/concepts/v4-nft.md +++ b/content/concepts/v4-nft.md @@ -1,8 +1,13 @@ -### NFTS +--- +title: v4 NFT introduction +description: The page describes NFT, IP and sub-licensing using Ocean Protocol's contracts, and use case. +--- + +## NFTS A non-fungible token stored on the blockchain represents a unique asset. NFTs can represent images, videos, digital art, or any piece of information. NFTs can be traded and allow transfer of ownership and copyright. [EIP-721](https://eips.ethereum.org/EIPS/eip-721) defines an interface for handling NFTs on Ethereum blockchain. The creator of the NFT can deploy a new contract on Ethereum or any Blockchain supporting NFT related interface and also, transfer the ownership through the transaction(s). -### Terminology +## Terminology - **Base IP** means the artifact being copyrighted. Represented by the {ERC721 address, tokenId} from the publish transactions. @@ -14,21 +19,21 @@ A non-fungible token stored on the blockchain represents a unique asset. NFTs ca - **To Sub-license**:Transfer one (of many) sub-licenses to new licensee: ERC20.transfer(to=licensee, value=1.0) -### Supporting NFT using Ocean Protocol +## Supporting NFT using Ocean Protocol Ocean Protocol defines [ERC721Factory](https://github.com/oceanprotocol/contracts/blob/v4main/contracts/ERC721Factory.sol) contract, allowing **Base IP holders** to create their ERC721 contract instances on any supported networks. The deployed contract stores Metadata, ownership, sub-license information, permissions. The creator of the contract can also create and mint ERC20 token instances for sub-licensing the **Base IP**. -### Sub licensing the Base IP +## Sub licensing the Base IP ERC721 tokens are non-fungible, thus cannot be used for automatic price discovery like ERC20 tokens. ERC721 and ERC20 combined together can be used for sub-licensing. Ocean Protocol's [ERC721Template](https://github.com/oceanprotocol/contracts/blob/v4main/contracts/templates/ERC721Template.sol) solves this problem by using ERC721 for tokenizing the **Base IP** and tokenizing sub-licenses by using ERC20. Thus, sub-licenses can be traded on any AMM as the underlying contract is ERC20 compliant. -### Use case +## Use case Alice is the author of a book. Alice wants to hold the copyright of her work but, allows others to read her book. So, She creates 2 versions of her book namely: digital copy, physical copy. She assigns Bob as one of the holder of digital edition of the book. Here, **Base IP** is the book. **Base IP holder** is Alice and Bob is **Sub-licensee** for a digital edition of the book. Alice tokenizes her work by performing **Publish** action i.e _ERC721.safeMint(to=aliceWalletAddress, tokenid=1)_. Alice also creates sub-licenses of her book by creating two ERC20 tokens and transefers the digital copy token to Bob's wallet. ![Image 1](images/v4-nft-1.PNG) -### Other References +## Other References - https://en.wikipedia.org/wiki/Non-fungible_token - https://blog.oceanprotocol.com/nfts-ip-1-practical-connections-of-erc721-with-intellectual-property-dc216aaf005d diff --git a/content/concepts/v4-roles.md b/content/concepts/v4-roles.md index ee73a683..dfe547cb 100644 --- a/content/concepts/v4-roles.md +++ b/content/concepts/v4-roles.md @@ -1,11 +1,16 @@ -### Roles +--- +title: v4 roles and permissions +description: The page describes the roles and permissions present in ERC721Template contract. +--- + +## Roles [ERC721Template](https://github.com/oceanprotocol/contracts/blob/v4Hardhat/contracts/templates/ERC721Template.sol) contract defines following roles: - NFT Owner - Manager -#### NFT Owner +## NFT Owner - NFT Owner is the publisher. I.e. Owner is a public address which transacted with `ERC721Factory` contract and deployed a new `ERC721` contract. @@ -14,7 +19,7 @@ - NFT Owner can add/remove Managers. - Clean all permissions -#### Manager +## Manager - A public address with a `Magner` role can update the metadata - Can deploy new ERC20 contract which is associtated with the `ERC721` contract. diff --git a/data/sidebars/concepts.yml b/data/sidebars/concepts.yml index 1719eec0..3c629645 100644 --- a/data/sidebars/concepts.yml +++ b/data/sidebars/concepts.yml @@ -25,7 +25,7 @@ - title: DDO Metadata link: /concepts/ddo-metadata/ -- group: NFTs +- group: NFTs (upcoming v4 release) items: - title: Introduction link: /concepts/v4-nft/ From 3d873de972d676c542a8e6e0a91cabaa99abc011 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Tue, 28 Sep 2021 09:07:27 -0700 Subject: [PATCH 008/145] draft v4 ddo --- content/concepts/ddo-metadata.md | 349 ------------------------------- content/concepts/did-ddo.md | 258 ++++++++++++++++------- 2 files changed, 185 insertions(+), 422 deletions(-) delete mode 100644 content/concepts/ddo-metadata.md diff --git a/content/concepts/ddo-metadata.md b/content/concepts/ddo-metadata.md deleted file mode 100644 index 94dfb94f..00000000 --- a/content/concepts/ddo-metadata.md +++ /dev/null @@ -1,349 +0,0 @@ ---- -title: DDO Metadata -description: Specification of the DDO subset dedicated to asset metadata -slug: /concepts/ddo-metadata/ -section: concepts ---- - -## Overview - -This page defines the schema for asset _metadata_. Metadata is the subset of an Ocean DDO that holds information about the asset. - -The schema is based on public schema.org [DataSet schema](https://schema.org/Dataset). - -Standardizing labels is key to effective searching, sorting and filtering (discovery). - -This page specifies metadata attributes that _must_ be included, and that _may_ be included. These attributes are organized hierarchically, from top-layer attributes like `"main"` to sub-level attributes like `"main.type"`. This page also provides DDO metadata examples. - -## Rules for Metadata Storage and Control in Ocean - -The publisher publishes an asset DDO (including metadata) onto the chain. - -The publisher may be the asset owner, or a marketplace acting on behalf of the owner. - -Most metadata fields may be modified after creation. The blockchain records the provenance of changes. - -DDOs (including metadata) are found in two places: - -- _Remote_ - main storage, on-chain. File URLs are always encrypted. One may actually encrypt all metadata, at a severe cost to discoverability. -- _Local_ - local cache. All fields are in plaintext. - -Ocean Aquarius helps manage metadata. It can be used to write DDOs to the chain, read from the chain, and has a local cache of the DDO in plaintext with fast search. - -## Fields for Metadata - -An asset represents a resource in Ocean, e.g. a dataset or an algorithm. - -A `metadata` object has the following attributes, all of which are objects. Some are only required for local or remote, and are specified as such. - -| Attribute | Required | Description | -| --------------------------- | -------- | ---------------------------------------------------------- | -| **`main`** | **Yes** | Main attributes | -| **`encryptedFiles`** | Remote | Encrypted string of the `attributes.main.files` object. | -| **`encryptedServices`** | Remote | Encrypted string of the `attributes.main.services` object. | -| **`status`** | No | Status attributes | -| **`additionalInformation`** | No | Optional attributes | - -The `main` and `additionalInformation` attributes are independent of the asset type. - -## Fields for `attributes.main` - -The `main` object has the following attributes. - -| Attribute | Type | Required | Description | -| ------------------- | --------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`name`** | Text |**Yes** | Descriptive name or title of the asset. | -| **`type`** | Text |**Yes** | Asset type. Includes `"dataset"` (e.g. csv file), `"algorithm"` (e.g. Python script). Each type needs a different subset of metadata attributes. | -| **`author`** | Text |**Yes** | Name of the entity generating this data (e.g. Tfl, Disney Corp, etc.). | -| **`license`** | Text |**Yes** | Short name referencing the license of the asset (e.g. Public Domain, CC-0, CC-BY, No License Specified, etc. ). If it's not specified, the following value will be added: "No License Specified". | -| **`files`** | Array of files object |**Yes** | Array of `File` objects including the encrypted file urls. | -| **`dateCreated`** | DateTime |**Yes** | The date on which the asset was created by the originator. ISO 8601 format, Coordinated Universal Time, e.g. `2019-01-31T08:38:32Z`. | -| **`datePublished`** | DateTime | Remote | The date on which the asset DDO is registered into the metadata store (Aquarius) | - -## Fields for `attributes.main.files` - -The `files` object has a list of `file` objects. - -Each `file` object has the following attributes, with the details necessary to consume and validate the data. - -| Attribute | Required | Description | -| -------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`index`** |**Yes** | Index number starting from 0 of the file. | -| **`contentType`** |**Yes** | File format. | -| **`url`** | Local | Content URL. Omitted from the remote metadata. Supports `http(s)://` and `ipfs://` URLs. | -| **`name`** | No | File name. | -| **`checksum`** | No | Checksum of the file using your preferred format (i.e. MD5). Format specified in `checksumType`. If it's not provided can't be validated if the file was not modified after registering. | -| **`checksumType`** | No | Format of the provided checksum. Can vary according to server (i.e Amazon vs. Azure) | -| **`contentLength`** | No | Size of the file in bytes. | -| **`encoding`** | No | File encoding (e.g. UTF-8). | -| **`compression`** | No | File compression (e.g. no, gzip, bzip2, etc). | -| **`encrypted`** | No | Boolean. Is the file encrypted? If is not set is assumed the file is not encrypted | -| **`encryptionMode`** | No | Encryption mode used. Just valid if `encrypted=true` | -| **`resourceId`** | No | Remote identifier of the file in the external provider. It is typically the remote id in the cloud provider. | -| **`attributes`** | No | Key-Value hash map with additional attributes describing the asset file. It could include details like the Amazon S3 bucket, region, etc. | - -## Fields for `attributes.status` - -A `status` object has the following attributes. - -| Attribute | Type | Required | Description | -| --------------------- | ------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`isListed`** | Boolean | No | Use to flag unsuitable content. True by default. If it's false, the content must not be returned. | -| **`isRetired`** | Boolean | No | Flag retired content. False by default. If it's true, the content may either not be returned, or returned with a note about retirement. | -| **`isOrderDisabled`** | Boolean | No | For temporarily disabling ordering assets, e.g. when file host is in maintenance. False by default. If it's true, no ordering of assets for download or compute should be allowed. | - -## Fields for `attributes.additionalInformation` - -All the additional information will be stored as part of the `additionalInformation` section. - -| Attribute | Type | Required | -| --------------------- | ------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`tags`** | Array of Text | No | Array of keywords or tags used to describe this content. Empty by default. | -| **`description`** | Text | No | Details of what the resource is. For a dataset, this attribute explains what the data represents and what it can be used for. | -| **`copyrightHolder`** | Text | No | The party holding the legal copyright. Empty by default. | -| **`workExample`** | Text | No | Example of the concept of this asset. This example is part of the metadata, not an external link. | -| **`links`** | Array of Link | No | Mapping of links for data samples, or links to find out more information. Links may be to either a URL or another Asset. We expect marketplaces to converge on agreements of typical formats for linked data: The Ocean Protocol itself does not mandate any specific formats as these requirements are likely to be domain-specific. The links array can be an empty array, but if there is a link object in it, then an "url" is required in that link object. | -| **`inLanguage`** | Text | No | The language of the content. Please use one of the language codes from the [IETF BCP 47 standard](https://tools.ietf.org/html/bcp47). | -| **`categories`** | Array of Text | No | Optional array of categories associated to the asset. Note: recommended to use `"tags"` instead of this. | - -## Fields - Other Suggestions - -Here are example attributes to help an asset's discoverability. - -| Attribute | Description | -| ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`updateFrequency`** | An indication of update latency - i.e. How often are updates expected (seldom, annually, quarterly, etc.), or is the resource static that is never expected to get updated. | -| **`structuredMarkup`** | A link to machine-readable structured markup (such as ttl/json-ld/rdf) describing the dataset. | - -## DDO Metadata Example - Local - -This is what the DDO metadata looks like. All fields are in plaintext. This is before it's stored on-chain or when it's retrieved and decrypted into a local cache. - -```json -{ - "main": { - "name": "Madrid Weather forecast", - "dateCreated": "2019-05-16T12:36:14.535Z", - "author": "Norwegian Meteorological Institute", - "type": "dataset", - "license": "Public Domain", - "price": "123000000000000000000", - "files": [ - { - "index": 0, - "url": "https://example-url.net/weather/forecast/madrid/350750305731.xml", - "contentLength": "0", - "contentType": "text/xml", - "compression": "none" - } - ] - }, - "additionalInformation": { - "description": "Weather forecast of Europe/Madrid in XML format", - "copyrightHolder": "Norwegian Meteorological Institute", - "categories": ["Other"], - "links": [], - "tags": [], - "updateFrequency": null, - "structuredMarkup": [] - }, - "status": { - "isListed": true, - "isRetired": false, - "isOrderDisabled": false - } -} -``` - -## DDO Metadata Example - Remote - -The previous example was for a local cache, with all fields in plaintext. - -Here's the same example, for remote on-chain storage. That is, it's how metadata looks as a response to querying Aquarius (remote metadata). - -How remote is changed, compared to local: - -- `url` is removed from all objects in the `files` array -- `encryptedFiles` is added. - -```json -{ - "service": [ - { - "index": 0, - "serviceEndpoint": "http://aquarius:5000/api/v1/aquarius/assets/ddo/{did}", - "type": "metadata", - "attributes": { - "main": { - "type": "dataset", - "name": "Madrid Weather forecast", - "dateCreated": "2019-05-16T12:36:14.535Z", - "author": "Norwegian Meteorological Institute", - "license": "Public Domain", - "files": [ - { - "contentLength": "0", - "contentType": "text/xml", - "compression": "none", - "index": 0 - } - ], - "datePublished": "2019-05-16T12:41:01Z" - }, - "encryptedFiles": "0x7a0d1c66ae861…df43aa9", - "additionalInformation": { - "description": "Weather forecast of Europe/Madrid in XML format", - "copyrightHolder": "Norwegian Meteorological Institute", - "categories": ["Other"], - "links": [], - "tags": [], - "updateFrequency": null, - "structuredMarkup": [] - }, - "status": { - "isListed": true, - "isRetired": false, - "isOrderDisabled": false - } - } - } - ] -} -``` - -## Fields when `attributes.main.type = algorithm` - -An asset of type `algorithm` has the following additional attributes under `main.algorithm`: - -| Attribute | Type | Required | Description | -| --------------- | -------- | -------- | --------------------------------------------- | -| **`container`** | `Object` |**Yes** | Object describing the Docker container image. | -| **`language`** | `string` | No | Language used to implement the software | -| **`format`** | `string` | No | Packaging format of the software. | -| **`version`** | `string` | No | Version of the software. | - -The `container` object has the following attributes: - -| Attribute | Type | Required | Description | -| ---------------- | -------- | -------- | ----------------------------------------------------------------- | -| **`entrypoint`** | `string` |**Yes** | The command to execute, or script to run inside the Docker image. | -| **`image`** | `string` |**Yes** | Name of the Docker image. | -| **`tag`** | `string` |**Yes** | Tag of the Docker image. | -| **`checksum`** | `string` |**Yes** | Checksum of the Docker image. | - -```json -{ - "index": 0, - "serviceEndpoint": "http://localhost:5000/api/v1/aquarius/assets/ddo/{did}", - "type": "metadata", - "attributes": { - "main": { - "author": "John Doe", - "dateCreated": "2019-02-08T08:13:49Z", - "license": "CC-BY", - "name": "My super algorithm", - "type": "algorithm", - "algorithm": { - "language": "scala", - "format": "docker-image", - "version": "0.1", - "container": { - "entrypoint": "node $ALGO", - "image": "node", - "tag": "10", - "checksum": "efb2c764274b745f5fc37f97c6b0e761" - } - }, - "files": [ - { - "name": "build_model", - "url": "https://raw.gith ubusercontent.com/oceanprotocol/test-algorithm/master/javascript/algo.js", - "index": 0, - "checksum": "efb2c764274b745f5fc37f97c6b0e761", - "contentLength": "4535431", - "contentType": "text/plain", - "encoding": "UTF-8", - "compression": "zip" - } - ] - }, - "additionalInformation": { - "description": "Workflow to aggregate weather information", - "tags": ["weather", "uk", "2011", "workflow", "aggregation"], - "copyrightHolder": "John Doe" - } - } -} -``` - -## Fields when `attributes.main.type = compute` - -An asset with a service of type `compute` has the following additional attributes under `main.privacy`: - -| Attribute | Type | Required | Description | -| --------------------------------- | ------------------ | -------- | ---------------------------------------------------------- | -| **`allowRawAlgorithm`** | `boolean` |**Yes** | If True, a drag & drop algo can be runned | -| **`allowNetworkAccess`** | `boolean` |**Yes** | If True, the algo job will have network access (stil WIP) | -| **`publisherTrustedAlgorithms `** | Array of `Objects` |**Yes** | If Empty , then any published algo is allowed. (see below) | - -The `publisherTrustedAlgorithms ` is an array of objects with the following structure: - -| Attribute | Type | Required | Description | -| ------------------------------ | -------- | -------- | ------------------------------------------------------------------ | -| **`did`** | `string` |**Yes** | The did of the algo which is trusted by the publisher. | -| **`filesChecksum`** | `string` |**Yes** | Hash of ( algorithm's encryptedFiles + files section (as string) ) | -| **`containerSectionChecksum`** | `string` |**Yes** | Hash of the algorithm container section (as string) | - -To produce `filesChecksum`: - -```javascript -sha256( - algorithm_ddo.service['metadata'].attributes.encryptedFiles + - JSON.Stringify(algorithm_ddo.service['metadata'].attributes.main.files) -) -``` - -To produce `containerSectionChecksum`: - -```javascript -sha256( - JSON.Stringify( - algorithm_ddo.service['metadata'].attributes.main.algorithm.container - ) -) -``` - -### Example of a compute service - -```json -{ - "type": "compute", - "index": 1, - "serviceEndpoint": "https://provider.oceanprotocol.com", - "attributes": { - "main": { - "name": "dataAssetComputingService", - "creator": "0xA32C84D2B44C041F3a56afC07a33f8AC5BF1A071", - "datePublished": "2021-02-17T06:31:33Z", - "cost": "1", - "timeout": 3600, - "privacy": { - "allowRawAlgorithm": true, - "allowNetworkAccess": false, - "publisherTrustedAlgorithms": [ - { - "did": "0xxxxx", - "filesChecksum": "1234", - "containerSectionChecksum": "7676" - }, - { - "did": "0xxxxx", - "filesChecksum": "1232334", - "containerSectionChecksum": "98787" - } - ] - } - } - } -} -``` diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 5ceccff8..3620f097 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -24,8 +24,17 @@ DIDs and DDOs follow [this specification](https://w3c-ccg.github.io/did-spec/) d - An asset should have a DID and DDO. The DDO should include metadata about the asset. - The DDO can only can be modified by _owners_ or _delegated users_. - There _must_ be at least one client library acting as _resolver_, to get a DDO from a DID. -- The DDO is stored on-chain. It's stored in in plaintext, with two exceptions: (1) the field for resource-access url is encrypted (2) the whole DDO may be encrypted, if the publisher is willing to lose 100% of discoverability. -- A metadata cache like Aquarius can help in reading and writing DDO data from the chain. +- A metadata cache like Aquarius can help in reading and searching through DDO data from the chain. + +## Flow for publishing / retrieving DDOs + +- The DDO is stored on-chain. +- It's stored encrypted (using the private key of the provider). To resolve it, you must query the provider and you will might get the clear text ddo (depends on access rights, state, etc) +- Each DID has a state, which is held by the NFT Contract (also stored in the DDO.status.status). The possible states are: + * 0 = active + * 1 = end-of-life + * 2 = deprecated (by another asset) + * 3 = revoked by publisher ## DID Structure @@ -34,98 +43,120 @@ In Ocean, a DID is a string that looks like: ```text did:op:0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea ``` +where "0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea" is the address of the ERC721 contract that represents that asset. It follows [the generic DID scheme](https://w3c-ccg.github.io/did-spec/#the-generic-did-scheme). -The part after `did:op:` is the asset's on-chain Ethereum address (minus the "0x"). One can be computed from the other; therefore there is a 1:1 mapping between did and Ethereum address. ## DDO Attributes -![DDO Content](images/ddo-content.png) A DDO has these standard attributes: -- `@context` -- `id` -- `created` -- `updated` -- `publicKey` -- `authentication` -- `proof` -- `verifiableCredential` +- `@context` = array, contexts used for validation +- `id` = string, address of ERC721 contract +- `created` = updated by aquarius, contains the date of publishing (block.timestamp) +- `updated` = updated by aquarius, contains the date of the update (block.timestamp) +- `proof` = proof of ownership + In Ocean, the DDO also has: -- `dataToken` -- `service` -- `credentials` - optional flag, which describes the credentials needed to access a dataset (see below) +- `version` - stores version information (`v4` for us) +- `metadata` - stores metadata information [Metadata](#metadata) +- `service` - stores an array of services [Service](#service) +- `credentials` - optional flag, which describes the credentials needed to access a dataset [Credentials](#credentials) +- `status` - stores status related fields [Status](#status) +- `files` and `encryptedFiles` - stores file(s) informations [Files](#files) +- `event` - stores the last event information [Event](#event) -Asset metadata must be included as one of the objects inside the `"service"` array, with type `"metadata"`. -## DDO Service Types +## Metadata +The object has the following attributes. -There are many possible service types for a DDO. +| Attribute | Type | Required | Description | +| ------------------- | --------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **`description`** | Text | **Yes** | Details of what the resource is. For a dataset, this attribute explains what the data represents and what it can be used for.| +| **`copyrightHolder`** | Text | No | The party holding the legal copyright. Empty by default. +| **`name`** | Text |**Yes** | Descriptive name or title of the asset. | +| **`type`** | Text |**Yes** | Asset type. Includes `"dataset"` (e.g. csv file), `"algorithm"` (e.g. Python script). Each type needs a different subset of metadata attributes. | +| **`author`** | Text |**Yes** | Name of the entity generating this data (e.g. Tfl, Disney Corp, etc.). | +| **`license`** | Text |**Yes** | Short name referencing the license of the asset (e.g. Public Domain, CC-0, CC-BY, No License Specified, etc. ). If it's not specified, the following value will be added: "No License Specified". | +| **`links`** | Array of Link | No | Mapping of links for data samples, or links to find out more information. Links may be to either a URL or another Asset. We expect marketplaces to converge on agreements of typical formats for linked data: The Ocean Protocol itself does not mandate any specific formats as these requirements are likely to be domain-specific. The links array can be an empty array, but if there is a link object in it, then an "url" is required in that link object. | +| **`inLanguage`** | Text | No | The language of the content. Please use one of the language codes from the [IETF BCP 47 standard](https://tools.ietf.org/html/bcp47)| +| **`categories`** | Array of Text | No | Optional array of categories associated to the asset. Note: recommended to use `"tags"` instead of this. | +| **`tags`** | Array of Text | No | Array of keywords or tags used to describe this content. Empty by default. | +| **`additionalInformation`** | Object | No | Stores additional information, this is customizable by publisher | -- `metadata` - describing the asset -- `access` - describing how the asset can be downloaded -- `compute` - describing how the asset can be computed upon +Depending on the asset type (dataset, algorithm), there are different metadata attributes supported: -Each asset has a `metadata` service and at least one other service. +### Algorithm attributes -Each service is distinguished by the `DDO.service.type` attribute. +An asset of type `algorithm` has the following additional attributes under `algorithm` in metadata object: -Each service has an `attributes` section holding the information related to the service. That section _must_ have a `main` sub-section, holding all the mandatory information that a service has to provide. +| Attribute | Type | Required | Description | +| ------------------- | ----------------------| ----------- |--------------------------------------------------- | +| **`language`** | `string` | no | Language used to implement the software | +| **`format`** | `string` | no | Packaging format of the software. | +| **`version`** | `string` | no | Version of the software. | +| **`container`** | `Object` | yes | Object describing the Docker container image. | -A part of the `attributes.main` sub-section, other optional sub-sections like `attributes.extra` can be added. These depend on the service type. +The `container` object has the following attributes: -Each service has a `timeout` (in seconds) section describing how long the sevice can be used after consumption is initiated. A timeout of 0 represents no time limit. +| Attribute | Type | Required | Description | +| ------------------- | -------- | --------- | --------------------------------------------------- | +| **`entrypoint`** | `string` | yes | The command to execute, or script to run inside the Docker image. | +| **`image`** | `string` | yes | Name of the Docker image. | +| **`tag`** | `string` | yes | Tag of the Docker image. | +| **`checksum`** | `string` | yes | Checksum of the Docker image. | -The `cost` attribute is obsolete, as of Ocean V3. As of V3, to consume an asset, one sends exactly 1.0 datatokens of the asset, so a `cost` is not needed. -## DDO Service Example -Here is an example DDO service: -```json -"service": [ - { - "index": 0, - "type": "metadata", - "serviceEndpoint": "https://service/api/v1/metadata/assets/ddo/did:op:0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea", - "attributes": { - "main": {}, - "additionalInformation": {}, - "curation": {} - } - }, - { - "index": 1, - "type": "access", - "serviceEndpoint": "http://localhost:8030/api/v1/provider/services/consume", - "attributes": { - "main": { - "cost":"10", - "timeout":0 - }, - "additionalInformation": {} - } - }, - { - "index": 2, - "type": "compute", - "serviceEndpoint": "http://localhost:8030/api/v1/provider/services/compute", - "attributes": { - "main": { - "cost":"10", - "timeout":3600 - }, - "additionalInformation": {} - } - } -] + +## Service + +| Attribute | Type | Required | Description | +| ------------------- | --------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **`type`** | Text | **Yes** | Type of service (access, compute, wss, etc | +| **`name`** | Text | No | Service friendly name | +| **`serviceEndpoint`** | Text | **Yes** | Provider URI | +| **`timeout`** | Number | **Yes** | describing how long the sevice can be used after consumption is initiated. A timeout of 0 represents no time limit. | +| **`files`** | Array of files object |**No ** | Array of `File` objects including the encrypted file urls that overwrites the root files object for this service [Files](#files) | + + +Depending on the service type, the following attributes are applied: + +### Compute datasets attributes + +An asset with a service of type `compute` has the following additional attributes under `privacy` object : + +| Attribute | Type | Required | Description | +| ---------------------------- | ----------------------| ----------- |---------------------------------------------------------- | +| **`allowRawAlgorithm`** | `boolean` | yes | If True, a drag & drop algo can be runned | +| **`allowNetworkAccess`** | `boolean` | yes | If True, the algo job will have network access (stil WIP) | +| **`publisherTrustedAlgorithmPublishers `** | Array of `String` | yes | If Empty , then any published algo is allowed. Otherwise, only published algorithms by some publishers are allowed | +| **`publisherTrustedAlgorithms `** | Array of `Objects` | yes | If Empty , then any published algo is allowed. (see below) | + +The `publisherTrustedAlgorithms ` is an array of objects with the following structure: + +| Attribute | Type | Required | Description | +| ---------------------------------------- | -------- | --------- | --------------------------------------------------- | +| **`did`** | `string` | yes | The did of the algo which is trusted by the publisher. | +| **`filesChecksum`** | `string` | yes | Hash of ( algorithm's encryptedFiles + files section (as string) ) +| **`containerSectionChecksum`** | `string` | yes | Hash of the algorithm container section (as string) | + +To produce filesChecksum: +``` +sha256(algorithm_ddo.service['metadata'].attributes.encryptedFiles + JSON.Stringify(algorithm_ddo.service['metadata'].attributes.main.files) ) ``` -## DDO Credentials for Fine-Grained Permissions +To produce containerSectionChecksum: +``` +sha256(JSON.Stringify(algorithm_ddo.service['metadata'].attributes.main.algorithm.container)) +``` + +## Credentials By default, a consumer can access a resource if they have 1.0 datatokens. _Credentials_ allow the publisher to optionally specify finer-grained permissions. @@ -140,7 +171,9 @@ Ocean also supports `"deny"` credentials: if a consumer has any of these credent Here's an example object with both `"allow"` and `"deny"` entries. ```json -"credentials":{ +{ + {...}, + "credentials":{ "allow":[ { "type":"address", @@ -150,19 +183,22 @@ Here's an example object with both `"allow"` and `"deny"` entries. ] } ] - }, - "deny":[ - { + }, + "deny":[ + { "type":"address", "values":[ "0x2222", "0x333" ] - } - ] + } + ] + } } ``` +``` + For future usage, we can extend that with different credentials types. Example: ```json @@ -171,3 +207,79 @@ For future usage, we can extend that with different credentials types. Example: "values": ["profile1", "profile2"] } ``` + + + + +## Status +The `status` object contains the following attributes: + +| Attribute | Type | Required | Description | +| ---------------------------------------- | -------- | --------- | --------------------------------------------------- | +| **`status`** | `number` | yes | Status of the asset (see above) | +| **`isListed`** | `boolean` | no | If this asset should be displayed | +| **`isOrderDisabled`** | `boolean` | no | If this asset has ordering disabled | + +```json +{ + {...}, + "status": { + "status": 0, + "isListed": true, + "isOrderDisabled": false + } +``` +## Files + +The `files` section contains a `file` object (that contains a list of `file` objects) and a `encryptedFiles` string which contains the encrypted urls + +Each `file` object has the following attributes, with the details necessary to consume and validate the data. + +| Attribute | Required | Description | +| -------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **`contentType`** |**Yes** | File format. | +| **`url`** | Local | Content URL. Omitted from the remote metadata. Supports `http(s)://` and `ipfs://` URLs. | +| **`name`** | No | File name. | +| **`checksum`** | No | Checksum of the file using your preferred format (i.e. MD5). Format specified in `checksumType`. If it's not provided can't be validated if the file was not modified after registering. | +| **`checksumType`** | No | Format of the provided checksum. Can vary according to server (i.e Amazon vs. Azure) | +| **`contentLength`** | No | Size of the file in bytes. | +| **`encoding`** | No | File encoding (e.g. UTF-8). | +| **`compression`** | No | File compression (e.g. no, gzip, bzip2, etc). | +| **`encrypted`** | No | Boolean. Is the file encrypted? If is not set is assumed the file is not encrypted | +| **`encryptionMode`** | No | Encryption mode used. Just valid if `encrypted=true` | +| **`resourceId`** | No | Remote identifier of the file in the external provider. It is typically the remote id in the cloud provider. | +| **`attributes`** | No | Key-Value hash map with additional attributes describing the asset file. It could include details like the Amazon S3 bucket, region, etc. + +Exanple: + +```json +{ + {..}, + files:{ + "files": [ + { + "contentLength": "3975", + "contentType": "text/csv" + } + ], + "encryptedFiles": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", + } +} +``` + +## Event +The `event` section contains informations about the latest transaction that created or update the ddo +This section is auto-completed by aquarius. + +```json +{ + {...}, + "event": { + "txid": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", + "blockNo": 12831214, + "from": "0xAcca11dbeD4F863Bb3bC2336D3CE5BAC52aa1f83", + "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf", + "update": false, + "chainId": 1, + } +``` From 1ac817e813be8fb48f8cd2ff92cd0e9984c27f78 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Mon, 4 Oct 2021 03:54:02 -0700 Subject: [PATCH 009/145] fixes --- content/concepts/did-ddo.md | 79 ++++++++++++++++++++++++++++++------- 1 file changed, 64 insertions(+), 15 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 3620f097..39146d3b 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -30,7 +30,7 @@ DIDs and DDOs follow [this specification](https://w3c-ccg.github.io/did-spec/) d - The DDO is stored on-chain. - It's stored encrypted (using the private key of the provider). To resolve it, you must query the provider and you will might get the clear text ddo (depends on access rights, state, etc) -- Each DID has a state, which is held by the NFT Contract (also stored in the DDO.status.status). The possible states are: +- Each asset has a state, which is held by the NFT Contract (and is also stored in the DDO.status.status). The possible states are: * 0 = active * 1 = end-of-life * 2 = deprecated (by another asset) @@ -43,7 +43,7 @@ In Ocean, a DID is a string that looks like: ```text did:op:0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea ``` -where "0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea" is the address of the ERC721 contract that represents that asset. +where "0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea" = sha256(ERC721 contract addres + chainId) It follows [the generic DID scheme](https://w3c-ccg.github.io/did-spec/#the-generic-did-scheme). @@ -54,17 +54,17 @@ It follows [the generic DID scheme](https://w3c-ccg.github.io/did-spec/#the-gene A DDO has these standard attributes: - `@context` = array, contexts used for validation -- `id` = string, address of ERC721 contract +- `id` = string, computed as sha256(address of ERC721 contract + chainId) - `created` = updated by aquarius, contains the date of publishing (block.timestamp) - `updated` = updated by aquarius, contains the date of the update (block.timestamp) -- `proof` = proof of ownership +- `proof` = proof of ownership, optional In Ocean, the DDO also has: - `version` - stores version information (`v4` for us) - `metadata` - stores metadata information [Metadata](#metadata) -- `service` - stores an array of services [Service](#service) +- `services` - stores an array of services [Services](#services) - `credentials` - optional flag, which describes the credentials needed to access a dataset [Credentials](#credentials) - `status` - stores status related fields [Status](#status) - `files` and `encryptedFiles` - stores file(s) informations [Files](#files) @@ -83,7 +83,7 @@ The object has the following attributes. | **`author`** | Text |**Yes** | Name of the entity generating this data (e.g. Tfl, Disney Corp, etc.). | | **`license`** | Text |**Yes** | Short name referencing the license of the asset (e.g. Public Domain, CC-0, CC-BY, No License Specified, etc. ). If it's not specified, the following value will be added: "No License Specified". | | **`links`** | Array of Link | No | Mapping of links for data samples, or links to find out more information. Links may be to either a URL or another Asset. We expect marketplaces to converge on agreements of typical formats for linked data: The Ocean Protocol itself does not mandate any specific formats as these requirements are likely to be domain-specific. The links array can be an empty array, but if there is a link object in it, then an "url" is required in that link object. | -| **`inLanguage`** | Text | No | The language of the content. Please use one of the language codes from the [IETF BCP 47 standard](https://tools.ietf.org/html/bcp47)| +| **`contentLanguage`** | Text | No | The language of the content. Please use one of the language codes from the [IETF BCP 47 standard](https://tools.ietf.org/html/bcp47)| | **`categories`** | Array of Text | No | Optional array of categories associated to the asset. Note: recommended to use `"tags"` instead of this. | | **`tags`** | Array of Text | No | Array of keywords or tags used to describe this content. Empty by default. | | **`additionalInformation`** | Object | No | Stores additional information, this is customizable by publisher | @@ -97,9 +97,8 @@ An asset of type `algorithm` has the following additional attributes under `algo | Attribute | Type | Required | Description | | ------------------- | ----------------------| ----------- |--------------------------------------------------- | | **`language`** | `string` | no | Language used to implement the software | -| **`format`** | `string` | no | Packaging format of the software. | | **`version`** | `string` | no | Version of the software. | -| **`container`** | `Object` | yes | Object describing the Docker container image. | +| **`container`** | `Container Object` | yes | Object describing the Docker container image.(see below) | The `container` object has the following attributes: @@ -114,15 +113,17 @@ The `container` object has the following attributes: -## Service +## Services | Attribute | Type | Required | Description | | ------------------- | --------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`type`** | Text | **Yes** | Type of service (access, compute, wss, etc | -| **`name`** | Text | No | Service friendly name | -| **`serviceEndpoint`** | Text | **Yes** | Provider URI | -| **`timeout`** | Number | **Yes** | describing how long the sevice can be used after consumption is initiated. A timeout of 0 represents no time limit. | -| **`files`** | Array of files object |**No ** | Array of `File` objects including the encrypted file urls that overwrites the root files object for this service [Files](#files) | +| **`type`** | Text | **Yes** | Type of service (access, compute, wss, etc | +| **`name`** | Text | No | Service friendly name | +| **`description`** | Text | No | Service description | +| **`datatokenAddress`** | Text | Yes | Datatoken address | +| **`providerEndpoint`** | Text | **Yes** | Provider URI | +| **`timeout`** | Number | **Yes** | describing how long the sevice can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds.| +| **`files`** | Array of files object |**No ** | Array of `File` objects including the encrypted file urls that overwrites the root files object for this service [Files](#files) | Depending on the service type, the following attributes are applied: @@ -136,7 +137,7 @@ An asset with a service of type `compute` has the following additional attribute | **`allowRawAlgorithm`** | `boolean` | yes | If True, a drag & drop algo can be runned | | **`allowNetworkAccess`** | `boolean` | yes | If True, the algo job will have network access (stil WIP) | | **`publisherTrustedAlgorithmPublishers `** | Array of `String` | yes | If Empty , then any published algo is allowed. Otherwise, only published algorithms by some publishers are allowed | -| **`publisherTrustedAlgorithms `** | Array of `Objects` | yes | If Empty , then any published algo is allowed. (see below) | +| **`publisherTrustedAlgorithms `** | Array of `publisherTrustedAlgorithms` | yes | If Empty , then any published algo is allowed. (see below) | The `publisherTrustedAlgorithms ` is an array of objects with the following structure: @@ -156,6 +157,54 @@ To produce containerSectionChecksum: sha256(JSON.Stringify(algorithm_ddo.service['metadata'].attributes.main.algorithm.container)) ``` +Example: +```json + + +{ + {...}, + "services":[ + { + "type":"access", + "name":"Download service", + "description":"Download service", + "datatokenAddress":"0x123", + "providerEndpoint":"https://myprovider", + "timeout":0 + }, + { + "type":"compute", + "name":"Compute service", + "description":"Compute service", + "datatokenAddress":"0x124", + "providerEndpoint":"https://myprovider", + "timeout":0, + "privacy":{ + "allowRawAlgorithm":false, + "allowNetworkAccess":true, + "publisherTrustedAlgorithmPublishers":[ + "0x234", + "0x235" + ], + "publisherTrustedAlgorithms":[ + { + "did":"did:op:123", + "filesChecksum":"100", + "containerSectionChecksum":"200" + }, + { + "did":"did:op:124", + "filesChecksum":"110", + "containerSectionChecksum":"210" + } + ] + } + } + ] +} + +``` + ## Credentials By default, a consumer can access a resource if they have 1.0 datatokens. _Credentials_ allow the publisher to optionally specify finer-grained permissions. From b28951f3672a7e9b48a6fc96cd162eebbf7687c8 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Mon, 4 Oct 2021 04:28:05 -0700 Subject: [PATCH 010/145] fix lint --- content/concepts/did-ddo.md | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 39146d3b..fdeb70f9 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -31,10 +31,10 @@ DIDs and DDOs follow [this specification](https://w3c-ccg.github.io/did-spec/) d - The DDO is stored on-chain. - It's stored encrypted (using the private key of the provider). To resolve it, you must query the provider and you will might get the clear text ddo (depends on access rights, state, etc) - Each asset has a state, which is held by the NFT Contract (and is also stored in the DDO.status.status). The possible states are: - * 0 = active - * 1 = end-of-life - * 2 = deprecated (by another asset) - * 3 = revoked by publisher + - 0 = active + - 1 = end-of-life + - 2 = deprecated (by another asset) + - 3 = revoked by publisher ## DID Structure @@ -43,6 +43,7 @@ In Ocean, a DID is a string that looks like: ```text did:op:0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea ``` + where "0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea" = sha256(ERC721 contract addres + chainId) It follows [the generic DID scheme](https://w3c-ccg.github.io/did-spec/#the-generic-did-scheme). @@ -72,6 +73,7 @@ In Ocean, the DDO also has: ## Metadata + The object has the following attributes. | Attribute | Type | Required | Description | @@ -148,18 +150,20 @@ The `publisherTrustedAlgorithms ` is an array of objects with the following stru | **`containerSectionChecksum`** | `string` | yes | Hash of the algorithm container section (as string) | To produce filesChecksum: -``` + +```js sha256(algorithm_ddo.service['metadata'].attributes.encryptedFiles + JSON.Stringify(algorithm_ddo.service['metadata'].attributes.main.files) ) ``` To produce containerSectionChecksum: -``` + +```js sha256(JSON.Stringify(algorithm_ddo.service['metadata'].attributes.main.algorithm.container)) ``` Example: -```json +```json { {...}, @@ -246,7 +250,6 @@ Here's an example object with both `"allow"` and `"deny"` entries. } ``` -``` For future usage, we can extend that with different credentials types. Example: @@ -261,6 +264,7 @@ For future usage, we can extend that with different credentials types. Example: ## Status + The `status` object contains the following attributes: | Attribute | Type | Required | Description | @@ -278,6 +282,7 @@ The `status` object contains the following attributes: "isOrderDisabled": false } ``` + ## Files The `files` section contains a `file` object (that contains a list of `file` objects) and a `encryptedFiles` string which contains the encrypted urls @@ -317,6 +322,7 @@ Exanple: ``` ## Event + The `event` section contains informations about the latest transaction that created or update the ddo This section is auto-completed by aquarius. From 1c0f7ed8ac4d11cd23a122bf1c4ab34ff0e68bf1 Mon Sep 17 00:00:00 2001 From: Akshay Date: Tue, 5 Oct 2021 11:19:40 +0200 Subject: [PATCH 011/145] Trigger rebuild From 3f6069fb0ff433be10e162fee3f083a2fd1409c5 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Tue, 5 Oct 2021 03:42:12 -0700 Subject: [PATCH 012/145] add ddo flow --- content/concepts/did-ddo.md | 22 ++++++++++++++++++++++ content/concepts/images/DDO_flow.png | Bin 0 -> 69347 bytes 2 files changed, 22 insertions(+) create mode 100644 content/concepts/images/DDO_flow.png diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index fdeb70f9..57133d29 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -36,6 +36,28 @@ DIDs and DDOs follow [this specification](https://w3c-ccg.github.io/did-spec/) d - 2 = deprecated (by another asset) - 3 = revoked by publisher +Here is the complete flow: + +```text +title DDO flow + +User(Ocean library) -> User(Ocean library): Prepare DDO +User(Ocean library) -> Provider: encrypt DDO +Provider -> User(Ocean library): encryptedDDO +User(Ocean library) -> ERC721 contract: publish encryptedDDO +Aquarius <-> ERC721 contract: monitors ERC721 contract and gets MetdadataCreated Event (contains encryptedDDO) +Aquarius -> ERC721 contract: calls getMetaData() +Aquarius -> Provider: decrypt encryptedDDO, signed request using Aquarius's private key +Provider -> ERC721 contract: checks state using getMetaData() +Provider -> Provider: depending on metadataState (expired,retired) and aquarius address, validates the request +Provider -> Aquarius: DDO +Aquarius -> Aquarius : validate DDO +Aquarius -> Aquarius : cache DDO +``` + +![DDO_flow](images/DDO_flow.png) + + ## DID Structure In Ocean, a DID is a string that looks like: diff --git a/content/concepts/images/DDO_flow.png b/content/concepts/images/DDO_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..f2fe3790f8919567b954fa50c8f0b91b1f3fab42 GIT binary patch literal 69347 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 Date: Tue, 5 Oct 2021 03:46:19 -0700 Subject: [PATCH 013/145] more details on state --- content/concepts/did-ddo.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 57133d29..ef18e425 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -26,16 +26,20 @@ DIDs and DDOs follow [this specification](https://w3c-ccg.github.io/did-spec/) d - There _must_ be at least one client library acting as _resolver_, to get a DDO from a DID. - A metadata cache like Aquarius can help in reading and searching through DDO data from the chain. -## Flow for publishing / retrieving DDOs +## State -- The DDO is stored on-chain. -- It's stored encrypted (using the private key of the provider). To resolve it, you must query the provider and you will might get the clear text ddo (depends on access rights, state, etc) - Each asset has a state, which is held by the NFT Contract (and is also stored in the DDO.status.status). The possible states are: - 0 = active - 1 = end-of-life - 2 = deprecated (by another asset) - 3 = revoked by publisher + +## Flow for publishing / retrieving DDOs + +- The DDO is stored on-chain. +- It's stored encrypted (using the private key of the provider). To resolve it, you must query the provider. + Here is the complete flow: ```text @@ -291,7 +295,7 @@ The `status` object contains the following attributes: | Attribute | Type | Required | Description | | ---------------------------------------- | -------- | --------- | --------------------------------------------------- | -| **`status`** | `number` | yes | Status of the asset (see above) | +| **`state`** | `number` | yes | State of the asset (see [State](#state) ) | | **`isListed`** | `boolean` | no | If this asset should be displayed | | **`isOrderDisabled`** | `boolean` | no | If this asset has ordering disabled | From a5351ef7fdf0efd4bd9bf5fb9c9add6cbb5cf758 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Sat, 9 Oct 2021 04:37:25 -0700 Subject: [PATCH 014/145] update --- content/concepts/did-ddo.md | 132 ++++++++++++++++++++++++++++++++++-- 1 file changed, 125 insertions(+), 7 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index ef18e425..c87e8fd8 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -78,24 +78,30 @@ It follows [the generic DID scheme](https://w3c-ccg.github.io/did-spec/#the-gene ## DDO Attributes -A DDO has these standard attributes: +A DDO has these standard attributes (required): - `@context` = array, contexts used for validation - `id` = string, computed as sha256(address of ERC721 contract + chainId) -- `created` = updated by aquarius, contains the date of publishing (block.timestamp) -- `updated` = updated by aquarius, contains the date of the update (block.timestamp) +- `created` = contains the date of publishing, ISO Date Time Format yyyy-MM-dd'T'HH:mm:ss. SSSXXX — for example, "2000-10-31T01:30:00.000-05:00 +- `updated` = contains the date of last update, ISO Date Time Format - `proof` = proof of ownership, optional In Ocean, the DDO also has: -- `version` - stores version information (`v4` for us) +- `version` - string, stores version information (example: `v4.0.0`) +- `chainId` - integer, stores chainId of the network used - `metadata` - stores metadata information [Metadata](#metadata) - `services` - stores an array of services [Services](#services) - `credentials` - optional flag, which describes the credentials needed to access a dataset [Credentials](#credentials) - `status` - stores status related fields [Status](#status) - `files` and `encryptedFiles` - stores file(s) informations [Files](#files) + + +In addition, Aquarius will add the following objects, which are not taken into account when [DDO hash](#ddo-hash) is calculated: + - `event` - stores the last event information [Event](#event) +- `stats` - stores several fields for statistics [Stats](#stats) ## Metadata @@ -106,7 +112,7 @@ The object has the following attributes. | ------------------- | --------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **`description`** | Text | **Yes** | Details of what the resource is. For a dataset, this attribute explains what the data represents and what it can be used for.| | **`copyrightHolder`** | Text | No | The party holding the legal copyright. Empty by default. -| **`name`** | Text |**Yes** | Descriptive name or title of the asset. | +| **`name`** | Text |**Yes** | Descriptive name or title of the asset. | | **`type`** | Text |**Yes** | Asset type. Includes `"dataset"` (e.g. csv file), `"algorithm"` (e.g. Python script). Each type needs a different subset of metadata attributes. | | **`author`** | Text |**Yes** | Name of the entity generating this data (e.g. Tfl, Disney Corp, etc.). | | **`license`** | Text |**Yes** | Short name referencing the license of the asset (e.g. Public Domain, CC-0, CC-BY, No License Specified, etc. ). If it's not specified, the following value will be added: "No License Specified". | @@ -261,8 +267,7 @@ Here's an example object with both `"allow"` and `"deny"` entries. "0x456" ] } - ] - }, + ], "deny":[ { "type":"address", @@ -364,3 +369,116 @@ This section is auto-completed by aquarius. "chainId": 1, } ``` + +## Stats + +The `stats` section contains different statics fields +This section is auto-completed by aquarius. + +```json +{ + {...}, + "stats": { + "consumes":4 + } +``` + + +## DDO Hash +In order to ensure the integrity, a hash is computed for each DDO, following the next steps: + + - remove `event` object from root (if exists) + - remove `stats` object from root (if exists) + - hash = sha256(JSON.stringify(DDO)) + + The hash is used when publishing/update metadata using setMetaData function in ERC721 contract and it is stored in the event generated by the ERC721 contract: + ``` + event MetadataCreated( + address indexed createdBy, + uint8 state, + string decryptorUrl, + bytes flags, + bytes data, + bytes hash, + string metaDataDecryptorAddress, + uint256 timestamp, + uint256 blockNumber + ); + event MetadataUpdated( + address indexed updatedBy, + uint8 state, + string decryptorUrl, + bytes flags, + bytes data, + bytes hash, + string metaDataDecryptorAddress, + uint256 timestamp, + uint256 blockNumber + ); +``` + +Aquarius should always chech the hash after data is decrypted(provider api called), in order to ensure ddo integrity. + + +## Full DDO Example: +``` +{ + "@context": ["https://w3id.org/did/v1"], + "id": "did:op:ACce67694eD2848dd683c651Dab7Af823b7dd123", + "created": "2020-11-15T12:27:48Z", + "updated": "2021-05-17T21:58:02Z", + "version": "v4.0.0", + "chainId": 1, + "metadata":{ + "description": "Sample description", + "name": "Sample asset", + "type": "dataset", + "author": "OPF", + "license": "https://market.oceanprotocol.com/terms", + }, + files:{ + "files": [ + { + "contentLength": "3975", + "contentType": "text/csv" + } + ], + "encryptedFiles": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", + }, + "services":[ + { + "type":"access", + "name":"Download service", + "description":"Download service", + "datatokenAddress":"0x123", + "providerEndpoint":"https://myprovider", + "timeout":0 + } + ], + "credentials":{ + "allow":[ + { + "type":"address", + "values":[ + "0x123", + "0x456" + ] + } + ], + "deny":[ + { + "type":"address", + "values":[ + "0x2222", + "0x333" + ] + } + ] + }, + "status": { + "status": 0, + "isListed": true, + "isOrderDisabled": false + } +} +``` From 5ca7156e475bf62662fb51f442cfbe0ea954fc56 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Sat, 9 Oct 2021 05:59:17 -0700 Subject: [PATCH 015/145] update events --- content/concepts/did-ddo.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index c87e8fd8..4e7e6725 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -399,19 +399,18 @@ In order to ensure the integrity, a hash is computed for each DDO, following the string decryptorUrl, bytes flags, bytes data, - bytes hash, - string metaDataDecryptorAddress, + bytes metaDataHash, uint256 timestamp, uint256 blockNumber ); - event MetadataUpdated( + +event MetadataUpdated( address indexed updatedBy, uint8 state, string decryptorUrl, bytes flags, bytes data, - bytes hash, - string metaDataDecryptorAddress, + bytes metaDataHash, uint256 timestamp, uint256 blockNumber ); From 08925a8e53e0a23f269fed47dd52ede8fdf9ba62 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Sat, 9 Oct 2021 06:03:02 -0700 Subject: [PATCH 016/145] fix lint --- content/concepts/did-ddo.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 4e7e6725..1ec28db6 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -385,6 +385,7 @@ This section is auto-completed by aquarius. ## DDO Hash + In order to ensure the integrity, a hash is computed for each DDO, following the next steps: - remove `event` object from root (if exists) @@ -392,7 +393,8 @@ In order to ensure the integrity, a hash is computed for each DDO, following the - hash = sha256(JSON.stringify(DDO)) The hash is used when publishing/update metadata using setMetaData function in ERC721 contract and it is stored in the event generated by the ERC721 contract: - ``` + + ```solidity event MetadataCreated( address indexed createdBy, uint8 state, @@ -420,7 +422,8 @@ Aquarius should always chech the hash after data is decrypted(provider api calle ## Full DDO Example: -``` + +```json { "@context": ["https://w3id.org/did/v1"], "id": "did:op:ACce67694eD2848dd683c651Dab7Af823b7dd123", From 12cefa23ff1f0f5f7c166d818aaed36c29cd3390 Mon Sep 17 00:00:00 2001 From: Akshay Date: Mon, 11 Oct 2021 17:48:40 +0200 Subject: [PATCH 017/145] Issue-#701: Update v4 related doc --- content/concepts/images/use-case-1.PNG | Bin 0 -> 34049 bytes content/concepts/images/use-case-2.PNG | Bin 0 -> 49288 bytes content/concepts/images/v4-nft-1.PNG | Bin 40446 -> 0 bytes content/concepts/{v4-nft.md => nft.md} | 14 +++++++++++--- content/concepts/{v4-roles.md => roles.md} | 0 data/sidebars/concepts.yml | 11 ++++------- 6 files changed, 15 insertions(+), 10 deletions(-) create mode 100644 content/concepts/images/use-case-1.PNG create mode 100644 content/concepts/images/use-case-2.PNG delete mode 100644 content/concepts/images/v4-nft-1.PNG rename content/concepts/{v4-nft.md => nft.md} (83%) rename content/concepts/{v4-roles.md => roles.md} (100%) diff --git a/content/concepts/images/use-case-1.PNG b/content/concepts/images/use-case-1.PNG new file mode 100644 index 0000000000000000000000000000000000000000..2703a81d5594eb76f93bab34a2868ace2b36bab5 GIT binary patch literal 34049 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%0DUnx(jaRdx&GtYM@(c^pH~sT-cYXdW5RKiR9^G+ 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 literal 0 HcmV?d00001 diff --git a/content/concepts/images/use-case-2.PNG b/content/concepts/images/use-case-2.PNG new file mode 100644 index 0000000000000000000000000000000000000000..3fa8390516c6e996b8aa9560e5642a26310b0558 GIT binary patch literal 49288 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 DVT%Da literal 0 HcmV?d00001 diff --git a/content/concepts/images/v4-nft-1.PNG b/content/concepts/images/v4-nft-1.PNG deleted file mode 100644 index bf850be6c055fe8a54f7278114bb3f23dbe5fe6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40446 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 UhKx@Ro4}uq70!}s{#(p{06!L1(*OVf diff --git a/content/concepts/v4-nft.md b/content/concepts/nft.md similarity index 83% rename from content/concepts/v4-nft.md rename to content/concepts/nft.md index 99c283a8..56afa38a 100644 --- a/content/concepts/v4-nft.md +++ b/content/concepts/nft.md @@ -27,11 +27,19 @@ Ocean Protocol defines [ERC721Factory](https://github.com/oceanprotocol/contract ERC721 tokens are non-fungible, thus cannot be used for automatic price discovery like ERC20 tokens. ERC721 and ERC20 combined together can be used for sub-licensing. Ocean Protocol's [ERC721Template](https://github.com/oceanprotocol/contracts/blob/v4main/contracts/templates/ERC721Template.sol) solves this problem by using ERC721 for tokenizing the **Base IP** and tokenizing sub-licenses by using ERC20. Thus, sub-licenses can be traded on any AMM as the underlying contract is ERC20 compliant. -## Use case -Alice is the author of a book. Alice wants to hold the copyright of her work but, allows others to read her book. So, She creates 2 versions of her book namely: digital copy, physical copy. She assigns Bob as one of the holder of digital edition of the book. Here, **Base IP** is the book. **Base IP holder** is Alice and Bob is **Sub-licensee** for a digital edition of the book. Alice tokenizes her work by performing **Publish** action i.e _ERC721.safeMint(to=aliceWalletAddress, tokenid=1)_. Alice also creates sub-licenses of her book by creating two ERC20 tokens and transefers the digital copy token to Bob's wallet. +## Use case 1 + +Alice is the creator of a painting and wants to make sure that the ownership of her artwork is uniquely determined. She performs the **Publish** action. She creates an ERC721 token which represents the ownership of the physical asset. Here, **Base IP** is Alice's artwork. **Base IP holder** is Alice. Now, Alice wants to transfer the ownership of her Artwork to Bob. So, Alice makes Bob's address as owner of the token in the discussion by sending a Blockchain transaction. -![Image 1](images/v4-nft-1.PNG) +![Image 1](images/use-case-1.PNG) + + +## Use case 2 + +Alice is the author of a book. Alice wants to hold the copyright of her work but, allows others to read her book. So, She creates 2 versions of her book namely: digital copy, physical copy. She assigns Bob as one of the holder of digital edition of the book. Here, **Base IP** is the book. **Base IP holder** is Alice and Bob is **Sub-licensee** for a digital edition of the book. Alice tokenizes her work by performing **Publish** action i.e _ERC721.safeMint(to=aliceWalletAddress, tokenid=1)_. Alice also creates sub-licenses of her book by creating two ERC20 tokens and transfers the digital copy token to Bob's wallet. + +![Image 2](images/use-case-2.PNG) ## Other References diff --git a/content/concepts/v4-roles.md b/content/concepts/roles.md similarity index 100% rename from content/concepts/v4-roles.md rename to content/concepts/roles.md diff --git a/data/sidebars/concepts.yml b/data/sidebars/concepts.yml index 3c629645..0edff29b 100644 --- a/data/sidebars/concepts.yml +++ b/data/sidebars/concepts.yml @@ -6,6 +6,10 @@ link: /concepts/quickstart/ - title: Architecture Overview link: /concepts/architecture/ + - title: NFTs + link: /concepts/nft/ + - title: Roles + link: /concepts/roles/ - title: Supported Networks link: /concepts/networks/ - title: Deployments @@ -25,13 +29,6 @@ - title: DDO Metadata link: /concepts/ddo-metadata/ -- group: NFTs (upcoming v4 release) - items: - - title: Introduction - link: /concepts/v4-nft/ - - title: Roles - link: /concepts/v4-roles/ - - group: Contribute items: - title: Ways to Contribute From fc20ff3d72743c0911647511ae2b05c4150432ea Mon Sep 17 00:00:00 2001 From: Akshay Date: Mon, 11 Oct 2021 20:58:27 +0200 Subject: [PATCH 018/145] Issue-#701: WIP Architecture diagram --- content/concepts/architecture.md | 2 +- content/concepts/images/architecture.PNG | Bin 0 -> 23963 bytes content/concepts/images/architecture.png | Bin 132456 -> 0 bytes 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 content/concepts/images/architecture.PNG delete mode 100644 content/concepts/images/architecture.png diff --git a/content/concepts/architecture.md b/content/concepts/architecture.md index 8d2e6976..56f250f7 100644 --- a/content/concepts/architecture.md +++ b/content/concepts/architecture.md @@ -7,7 +7,7 @@ description: Simplicity and Interoperability via a Datatokens Core Here is the Ocean architecture. -![Ocean Protocol tools architecture](images/architecture.png) +![Ocean Protocol tools architecture](images/architecture.PNG) Here’s an overview of the figure. diff --git a/content/concepts/images/architecture.PNG b/content/concepts/images/architecture.PNG new file mode 100644 index 0000000000000000000000000000000000000000..757eebd82f9ddc150a85112aba4fbf59403a4dcc GIT binary patch literal 23963 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 IozAEK6KbVm;s5{u literal 0 HcmV?d00001 diff --git a/content/concepts/images/architecture.png b/content/concepts/images/architecture.png deleted file mode 100644 index f479632ee22048899aa64d2f758baef49eef0f9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132456 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


o_FW?X?eaW6+6;$LW>xsCKI$W0O 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�Q(^nlRXg~SZfTaaadItUv8TtP} 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 From e3d3bcb2836aae2386728ef56c839579a92830a0 Mon Sep 17 00:00:00 2001 From: Akshay Date: Mon, 11 Oct 2021 21:06:03 +0200 Subject: [PATCH 019/145] Issue-#701: WIP Architecture diagram --- content/concepts/images/architecture.PNG | Bin 23963 -> 24047 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/content/concepts/images/architecture.PNG b/content/concepts/images/architecture.PNG index 757eebd82f9ddc150a85112aba4fbf59403a4dcc..d5a5d0850935778eb6de7adef13d335e3bb847d4 100644 GIT binary patch literal 24047 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 IozAEK6KbVm;s5{u From f58e919bc723c6c4a504ef52107529933dd3418f Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Fri, 22 Oct 2021 11:37:44 +0300 Subject: [PATCH 020/145] Update content/concepts/did-ddo.md Co-authored-by: Matthias Kretschmann --- content/concepts/did-ddo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 1ec28db6..94d24e69 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -418,7 +418,7 @@ event MetadataUpdated( ); ``` -Aquarius should always chech the hash after data is decrypted(provider api called), in order to ensure ddo integrity. +_Aquarius_ should always check the hash after data is decrypted via a _Provider_ API call, in order to ensure DDO integrity. ## Full DDO Example: From 66c20850a993152e9ebff1663202dfa07ed89b62 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 12:11:24 +0100 Subject: [PATCH 021/145] rewrite & reorder --- content/concepts/did-ddo.md | 419 ++++++++++++++++++------------------ 1 file changed, 211 insertions(+), 208 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 94d24e69..93d81eca 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -1,13 +1,13 @@ --- title: DIDs & DDOs - Asset Identifiers & Objects -description: Specification of Ocean asset identifiers and objects using DIDs & DDOs +description: Specification of Ocean asset identifiers and objects using DIDs & DDOs slug: /concepts/did-ddo/ section: concepts --- ## Overview -This document describes how Ocean assets follow the DID/DDO spec, such that Ocean assets can inherit DID/DDO benefits and enhance interoperability. +This document describes how Ocean assets follow the DID/DDO spec, such that Ocean assets can inherit DID/DDO benefits and enhance interoperability. Decentralized identifiers (DIDs) are a new type of identifier that enables verifiable, decentralized digital identity. Each DID is associated with a unique entity. DIDs may represent humans, objects, and more. @@ -16,29 +16,28 @@ A DID Document (DDO) is JSON blob that holds information about the DID. Given a If a DID is the index key in a key-value pair, then the DID Document is the value to which the index key points. The combination of a DID and its associated DID Document forms the root record for a decentralized identifier. -DIDs and DDOs follow [this specification](https://w3c-ccg.github.io/did-spec/) defined by the World Wide Web Consurtium (W3C). +DIDs and DDOs follow the [specification defined by the World Wide Web Consortium (W3C)](https://w3c-ccg.github.io/did-spec/). ## Rules for DIDs & DDOs in Ocean -- An _asset_ in Ocean represents a downloadable file, compute service, or similar. Each asset is a _resource_ under control of a _publisher_. The Ocean network itself does _not_ store the actual resource (e.g. files). -- An asset should have a DID and DDO. The DDO should include metadata about the asset. -- The DDO can only can be modified by _owners_ or _delegated users_. -- There _must_ be at least one client library acting as _resolver_, to get a DDO from a DID. -- A metadata cache like Aquarius can help in reading and searching through DDO data from the chain. +An _asset_ in Ocean represents a downloadable file, compute service, or similar. Each asset is a _resource_ under control of a _publisher_. The Ocean network itself does _not_ store the actual resource (e.g. files). + +An _asset_ should have a DID and DDO. and the DDO should include metadata about the asset. The DDO can only can be modified by _owners_ or _delegated users_. + +There _must_ be at least one client library acting as _resolver_, to get a DDO from a DID. A metadata cache like Aquarius can help in reading and searching through DDO data from the chain. ## State -- Each asset has a state, which is held by the NFT Contract (and is also stored in the DDO.status.status). The possible states are: - - 0 = active - - 1 = end-of-life - - 2 = deprecated (by another asset) - - 3 = revoked by publisher +Each asset has a state, which is held by the NFT contract. The possible states are: +- `0` = active +- `1` = end-of-life +- `2` = deprecated (by another asset) +- `3` = revoked by publisher -## Flow for publishing / retrieving DDOs +## Publishing an Retrieving DDOs -- The DDO is stored on-chain. -- It's stored encrypted (using the private key of the provider). To resolve it, you must query the provider. +The DDO is stored on-chain as part of the NFT contract and it is stored encrypted using the private key of the _Provider_. To resolve it, a metadata cache like _Aquarius_ must query the provider to decrypt the DDO. Here is the complete flow: @@ -57,11 +56,11 @@ Provider -> Provider: depending on metadataState (expired,retired) and aquarius Provider -> Aquarius: DDO Aquarius -> Aquarius : validate DDO Aquarius -> Aquarius : cache DDO +Aquarius -> Aquarius : enhance cached DDO in response with additional infos like `events` & `stats` ``` ![DDO_flow](images/DDO_flow.png) - ## DID Structure In Ocean, a DID is a string that looks like: @@ -70,22 +69,22 @@ In Ocean, a DID is a string that looks like: did:op:0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea ``` -where "0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea" = sha256(ERC721 contract addres + chainId) +where + +```text +0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea` = sha256(ERC721 contract address + chainId) +``` It follows [the generic DID scheme](https://w3c-ccg.github.io/did-spec/#the-generic-did-scheme). - ## DDO Attributes +A DDO has these required attributes: -A DDO has these standard attributes (required): - -- `@context` = array, contexts used for validation -- `id` = string, computed as sha256(address of ERC721 contract + chainId) +- `@context` = array, contexts used for validation +- `id` = string, computed as sha256(address of ERC721 contract + chainId) - `created` = contains the date of publishing, ISO Date Time Format yyyy-MM-dd'T'HH:mm:ss. SSSXXX — for example, "2000-10-31T01:30:00.000-05:00 -- `updated` = contains the date of last update, ISO Date Time Format -- `proof` = proof of ownership, optional - +- `updated` = contains the date of last update, ISO Date Time Format In Ocean, the DDO also has: @@ -94,33 +93,31 @@ In Ocean, the DDO also has: - `metadata` - stores metadata information [Metadata](#metadata) - `services` - stores an array of services [Services](#services) - `credentials` - optional flag, which describes the credentials needed to access a dataset [Credentials](#credentials) -- `status` - stores status related fields [Status](#status) - `files` and `encryptedFiles` - stores file(s) informations [Files](#files) - In addition, Aquarius will add the following objects, which are not taken into account when [DDO hash](#ddo-hash) is calculated: +- `status` - stores status related fields [Status](#status) - `event` - stores the last event information [Event](#event) - `stats` - stores several fields for statistics [Stats](#stats) - ## Metadata -The object has the following attributes. +The object has the following attributes. -| Attribute | Type | Required | Description | -| ------------------- | --------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`description`** | Text | **Yes** | Details of what the resource is. For a dataset, this attribute explains what the data represents and what it can be used for.| -| **`copyrightHolder`** | Text | No | The party holding the legal copyright. Empty by default. -| **`name`** | Text |**Yes** | Descriptive name or title of the asset. | -| **`type`** | Text |**Yes** | Asset type. Includes `"dataset"` (e.g. csv file), `"algorithm"` (e.g. Python script). Each type needs a different subset of metadata attributes. | -| **`author`** | Text |**Yes** | Name of the entity generating this data (e.g. Tfl, Disney Corp, etc.). | -| **`license`** | Text |**Yes** | Short name referencing the license of the asset (e.g. Public Domain, CC-0, CC-BY, No License Specified, etc. ). If it's not specified, the following value will be added: "No License Specified". | -| **`links`** | Array of Link | No | Mapping of links for data samples, or links to find out more information. Links may be to either a URL or another Asset. We expect marketplaces to converge on agreements of typical formats for linked data: The Ocean Protocol itself does not mandate any specific formats as these requirements are likely to be domain-specific. The links array can be an empty array, but if there is a link object in it, then an "url" is required in that link object. | -| **`contentLanguage`** | Text | No | The language of the content. Please use one of the language codes from the [IETF BCP 47 standard](https://tools.ietf.org/html/bcp47)| -| **`categories`** | Array of Text | No | Optional array of categories associated to the asset. Note: recommended to use `"tags"` instead of this. | -| **`tags`** | Array of Text | No | Array of keywords or tags used to describe this content. Empty by default. | -| **`additionalInformation`** | Object | No | Stores additional information, this is customizable by publisher | +| Attribute | Type | Required | Description | +| --------------------------- | ------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **`description`** | Text | **Yes** | Details of what the resource is. For a dataset, this attribute explains what the data represents and what it can be used for. | +| **`copyrightHolder`** | Text | No | The party holding the legal copyright. Empty by default. | +| **`name`** | Text | **Yes** | Descriptive name or title of the asset. | +| **`type`** | Text | **Yes** | Asset type. Includes `"dataset"` (e.g. csv file), `"algorithm"` (e.g. Python script). Each type needs a different subset of metadata attributes. | +| **`author`** | Text | **Yes** | Name of the entity generating this data (e.g. Tfl, Disney Corp, etc.). | +| **`license`** | Text | **Yes** | Short name referencing the license of the asset (e.g. Public Domain, CC-0, CC-BY, No License Specified, etc. ). If it's not specified, the following value will be added: "No License Specified". | +| **`links`** | Array of Link | No | Mapping of links for data samples, or links to find out more information. Links may be to either a URL or another Asset. We expect marketplaces to converge on agreements of typical formats for linked data: The Ocean Protocol itself does not mandate any specific formats as these requirements are likely to be domain-specific. The links array can be an empty array, but if there is a link object in it, then an "url" is required in that link object. | +| **`contentLanguage`** | Text | No | The language of the content. Please use one of the language codes from the [IETF BCP 47 standard](https://tools.ietf.org/html/bcp47) | +| **`categories`** | Array of Text | No | Optional array of categories associated to the asset. Note: recommended to use `"tags"` instead of this. | +| **`tags`** | Array of Text | No | Array of keywords or tags used to describe this content. Empty by default. | +| **`additionalInformation`** | Object | No | Stores additional information, this is customizable by publisher | Depending on the asset type (dataset, algorithm), there are different metadata attributes supported: @@ -128,37 +125,32 @@ Depending on the asset type (dataset, algorithm), there are different metadata a An asset of type `algorithm` has the following additional attributes under `algorithm` in metadata object: -| Attribute | Type | Required | Description | -| ------------------- | ----------------------| ----------- |--------------------------------------------------- | -| **`language`** | `string` | no | Language used to implement the software | -| **`version`** | `string` | no | Version of the software. | -| **`container`** | `Container Object` | yes | Object describing the Docker container image.(see below) | +| Attribute | Type | Required | Description | +| --------------- | ------------------ | -------- | -------------------------------------------------------- | +| **`language`** | `string` | no | Language used to implement the software | +| **`version`** | `string` | no | Version of the software. | +| **`container`** | `Container Object` | yes | Object describing the Docker container image.(see below) | The `container` object has the following attributes: -| Attribute | Type | Required | Description | -| ------------------- | -------- | --------- | --------------------------------------------------- | -| **`entrypoint`** | `string` | yes | The command to execute, or script to run inside the Docker image. | -| **`image`** | `string` | yes | Name of the Docker image. | -| **`tag`** | `string` | yes | Tag of the Docker image. | -| **`checksum`** | `string` | yes | Checksum of the Docker image. | - - - - +| Attribute | Type | Required | Description | +| ---------------- | -------- | -------- | ----------------------------------------------------------------- | +| **`entrypoint`** | `string` | yes | The command to execute, or script to run inside the Docker image. | +| **`image`** | `string` | yes | Name of the Docker image. | +| **`tag`** | `string` | yes | Tag of the Docker image. | +| **`checksum`** | `string` | yes | Checksum of the Docker image. | ## Services -| Attribute | Type | Required | Description | -| ------------------- | --------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`type`** | Text | **Yes** | Type of service (access, compute, wss, etc | -| **`name`** | Text | No | Service friendly name | -| **`description`** | Text | No | Service description | -| **`datatokenAddress`** | Text | Yes | Datatoken address | -| **`providerEndpoint`** | Text | **Yes** | Provider URI | -| **`timeout`** | Number | **Yes** | describing how long the sevice can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds.| -| **`files`** | Array of files object |**No ** | Array of `File` objects including the encrypted file urls that overwrites the root files object for this service [Files](#files) | - +| Attribute | Type | Required | Description | +| ---------------------- | --------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------- | +| **`type`** | Text | **Yes** | Type of service (access, compute, wss, etc | +| **`name`** | Text | No | Service friendly name | +| **`description`** | Text | No | Service description | +| **`datatokenAddress`** | Text | Yes | Datatoken address | +| **`providerEndpoint`** | Text | **Yes** | Provider URI | +| **`timeout`** | Number | **Yes** | describing how long the sevice can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds. | +| **`files`** | Array of files object | **No ** | Array of `File` objects including the encrypted file urls that overwrites the root files object for this service [Files](#files) | Depending on the service type, the following attributes are applied: @@ -166,31 +158,38 @@ Depending on the service type, the following attributes are applied: An asset with a service of type `compute` has the following additional attributes under `privacy` object : -| Attribute | Type | Required | Description | -| ---------------------------- | ----------------------| ----------- |---------------------------------------------------------- | -| **`allowRawAlgorithm`** | `boolean` | yes | If True, a drag & drop algo can be runned | -| **`allowNetworkAccess`** | `boolean` | yes | If True, the algo job will have network access (stil WIP) | -| **`publisherTrustedAlgorithmPublishers `** | Array of `String` | yes | If Empty , then any published algo is allowed. Otherwise, only published algorithms by some publishers are allowed | -| **`publisherTrustedAlgorithms `** | Array of `publisherTrustedAlgorithms` | yes | If Empty , then any published algo is allowed. (see below) | +| Attribute | Type | Required | Description | +| ------------------------------------------ | ------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------ | +| **`allowRawAlgorithm`** | `boolean` | yes | If True, a drag & drop algo can be runned | +| **`allowNetworkAccess`** | `boolean` | yes | If True, the algo job will have network access (stil WIP) | +| **`publisherTrustedAlgorithmPublishers `** | Array of `String` | yes | If Empty , then any published algo is allowed. Otherwise, only published algorithms by some publishers are allowed | +| **`publisherTrustedAlgorithms `** | Array of `publisherTrustedAlgorithms` | yes | If Empty , then any published algo is allowed. (see below) | The `publisherTrustedAlgorithms ` is an array of objects with the following structure: -| Attribute | Type | Required | Description | -| ---------------------------------------- | -------- | --------- | --------------------------------------------------- | -| **`did`** | `string` | yes | The did of the algo which is trusted by the publisher. | -| **`filesChecksum`** | `string` | yes | Hash of ( algorithm's encryptedFiles + files section (as string) ) -| **`containerSectionChecksum`** | `string` | yes | Hash of the algorithm container section (as string) | +| Attribute | Type | Required | Description | +| ------------------------------ | -------- | -------- | ------------------------------------------------------------------ | +| **`did`** | `string` | yes | The did of the algo which is trusted by the publisher. | +| **`filesChecksum`** | `string` | yes | Hash of ( algorithm's encryptedFiles + files section (as string) ) | +| **`containerSectionChecksum`** | `string` | yes | Hash of the algorithm container section (as string) | -To produce filesChecksum: +To produce filesChecksum: ```js -sha256(algorithm_ddo.service['metadata'].attributes.encryptedFiles + JSON.Stringify(algorithm_ddo.service['metadata'].attributes.main.files) ) +sha256( + algorithm_ddo.service['metadata'].attributes.encryptedFiles + + JSON.Stringify(algorithm_ddo.service['metadata'].attributes.main.files) +) ``` -To produce containerSectionChecksum: +To produce containerSectionChecksum: ```js -sha256(JSON.Stringify(algorithm_ddo.service['metadata'].attributes.main.algorithm.container)) +sha256( + JSON.Stringify( + algorithm_ddo.service['metadata'].attributes.main.algorithm.container + ) +) ``` Example: @@ -269,19 +268,18 @@ Here's an example object with both `"allow"` and `"deny"` entries. } ], "deny":[ - { + { "type":"address", "values":[ "0x2222", "0x333" ] - } + } ] } } ``` - For future usage, we can extend that with different credentials types. Example: ```json @@ -291,29 +289,6 @@ For future usage, we can extend that with different credentials types. Example: } ``` - - - -## Status - -The `status` object contains the following attributes: - -| Attribute | Type | Required | Description | -| ---------------------------------------- | -------- | --------- | --------------------------------------------------- | -| **`state`** | `number` | yes | State of the asset (see [State](#state) ) | -| **`isListed`** | `boolean` | no | If this asset should be displayed | -| **`isOrderDisabled`** | `boolean` | no | If this asset has ordering disabled | - -```json -{ - {...}, - "status": { - "status": 0, - "isListed": true, - "isOrderDisabled": false - } -``` - ## Files The `files` section contains a `file` object (that contains a list of `file` objects) and a `encryptedFiles` string which contains the encrypted urls @@ -322,7 +297,7 @@ Each `file` object has the following attributes, with the details necessary to c | Attribute | Required | Description | | -------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`contentType`** |**Yes** | File format. | +| **`contentType`** | **Yes** | File format. | | **`url`** | Local | Content URL. Omitted from the remote metadata. Supports `http(s)://` and `ipfs://` URLs. | | **`name`** | No | File name. | | **`checksum`** | No | Checksum of the file using your preferred format (i.e. MD5). Format specified in `checksumType`. If it's not provided can't be validated if the file was not modified after registering. | @@ -333,9 +308,9 @@ Each `file` object has the following attributes, with the details necessary to c | **`encrypted`** | No | Boolean. Is the file encrypted? If is not set is assumed the file is not encrypted | | **`encryptionMode`** | No | Encryption mode used. Just valid if `encrypted=true` | | **`resourceId`** | No | Remote identifier of the file in the external provider. It is typically the remote id in the cloud provider. | -| **`attributes`** | No | Key-Value hash map with additional attributes describing the asset file. It could include details like the Amazon S3 bucket, region, etc. +| **`attributes`** | No | Key-Value hash map with additional attributes describing the asset file. It could include details like the Amazon S3 bucket, region, etc. | -Exanple: +Example: ```json { @@ -352,28 +327,86 @@ Exanple: } ``` -## Event +## DDO Hash -The `event` section contains informations about the latest transaction that created or update the ddo -This section is auto-completed by aquarius. +In order to ensure the integrity, a hash is computed for each DDO: + +```js +const hash = sha256(JSON.stringify(DDO)) +``` + +The hash is used when publishing/update metadata using setMetaData function in ERC721 contract and it is stored in the event generated by the ERC721 contract: + +```solidity +event MetadataCreated( + address indexed createdBy, + uint8 state, + string decryptorUrl, + bytes flags, + bytes data, + bytes metaDataHash, + uint256 timestamp, + uint256 blockNumber + ); + +event MetadataUpdated( + address indexed updatedBy, + uint8 state, + string decryptorUrl, + bytes flags, + bytes data, + bytes metaDataHash, + uint256 timestamp, + uint256 blockNumber + ); +``` + +_Aquarius_ should always check the hash after data is decrypted via a _Provider_ API call, in order to ensure DDO integrity. + +## Aquarius Enhanced DDO Response + +The following fields are added by Aquarius in its DDO response for convenience reasons. These are never stored on chain, and not taken into consideration when [hashing the DDO](#ddo-hash). + +### Status + +The `status` object contains the following attributes: + +| Attribute | Type | Required | Description | +| --------------------- | --------- | -------- | ------------------------------------------------------------------------- | +| **`state`** | `number` | yes | State of the asset reflecting the NFT contract value. See [State](#state) | +| **`isListed`** | `boolean` | no | If this asset should be displayed | +| **`isOrderDisabled`** | `boolean` | no | If this asset has ordering disabled | ```json { {...}, - "event": { + "status": { + "state": 0, + "isListed": true, + "isOrderDisabled": false + } +``` + +### Events + +The `events` section contains informations about the transactions that created or updated the DDO + +```json +{ + {...}, + "events": [{ "txid": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", "blockNo": 12831214, "from": "0xAcca11dbeD4F863Bb3bC2336D3CE5BAC52aa1f83", "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf", "update": false, "chainId": 1, - } + }] ``` -## Stats +### Stats -The `stats` section contains different statics fields -This section is auto-completed by aquarius. +The `stats` section contains different statics fields. ```json { @@ -383,45 +416,7 @@ This section is auto-completed by aquarius. } ``` - -## DDO Hash - -In order to ensure the integrity, a hash is computed for each DDO, following the next steps: - - - remove `event` object from root (if exists) - - remove `stats` object from root (if exists) - - hash = sha256(JSON.stringify(DDO)) - - The hash is used when publishing/update metadata using setMetaData function in ERC721 contract and it is stored in the event generated by the ERC721 contract: - - ```solidity - event MetadataCreated( - address indexed createdBy, - uint8 state, - string decryptorUrl, - bytes flags, - bytes data, - bytes metaDataHash, - uint256 timestamp, - uint256 blockNumber - ); - -event MetadataUpdated( - address indexed updatedBy, - uint8 state, - string decryptorUrl, - bytes flags, - bytes data, - bytes metaDataHash, - uint256 timestamp, - uint256 blockNumber - ); -``` - -_Aquarius_ should always check the hash after data is decrypted via a _Provider_ API call, in order to ensure DDO integrity. - - -## Full DDO Example: +## Full Enhanced DDO Example: ```json { @@ -431,56 +426,64 @@ _Aquarius_ should always check the hash after data is decrypted via a _Provider_ "updated": "2021-05-17T21:58:02Z", "version": "v4.0.0", "chainId": 1, - "metadata":{ - "description": "Sample description", - "name": "Sample asset", - "type": "dataset", - "author": "OPF", - "license": "https://market.oceanprotocol.com/terms", - }, - files:{ - "files": [ - { - "contentLength": "3975", - "contentType": "text/csv" - } - ], - "encryptedFiles": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", - }, - "services":[ + "metadata": { + "description": "Sample description", + "name": "Sample asset", + "type": "dataset", + "author": "OPF", + "license": "https://market.oceanprotocol.com/terms" + }, + "files": { + "files": [ { - "type":"access", - "name":"Download service", - "description":"Download service", - "datatokenAddress":"0x123", - "providerEndpoint":"https://myprovider", - "timeout":0 + "url": "https://demo.com/file.csv" } - ], - "credentials":{ - "allow":[ - { - "type":"address", - "values":[ - "0x123", - "0x456" - ] - } - ], - "deny":[ - { - "type":"address", - "values":[ - "0x2222", - "0x333" - ] - } - ] - }, - "status": { - "status": 0, - "isListed": true, - "isOrderDisabled": false - } + ], + "encryptedFiles": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735" + }, + "services": [ + { + "type": "access", + "name": "Download service", + "description": "Download service", + "datatokenAddress": "0x123", + "providerEndpoint": "https://myprovider", + "timeout": 0 + } + ], + "credentials": { + "allow": [ + { + "type": "address", + "values": ["0x123", "0x456"] + } + ], + "deny": [ + { + "type": "address", + "values": ["0x2222", "0x333"] + } + ] + }, + + // Enhanced Aquarius response begins here + "status": { + "state": 0, + "isListed": true, + "isOrderDisabled": false + }, + "events": [ + { + "txid": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", + "blockNo": 12831214, + "from": "0xAcca11dbeD4F863Bb3bC2336D3CE5BAC52aa1f83", + "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf", + "update": false, + "chainId": 1 + } + ], + "stats": { + "consumes": 4 + } } ``` From acb3e2c9f00e56051e6302097b5ddf61fdc39deb Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 12:23:18 +0100 Subject: [PATCH 022/145] metadata.links changes --- content/concepts/did-ddo.md | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 93d81eca..204bcf68 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -9,7 +9,7 @@ section: concepts This document describes how Ocean assets follow the DID/DDO spec, such that Ocean assets can inherit DID/DDO benefits and enhance interoperability. -Decentralized identifiers (DIDs) are a new type of identifier that enables verifiable, decentralized digital identity. Each DID is associated with a unique entity. DIDs may represent humans, objects, and more. +Decentralized identifiers (DIDs) are a type of identifier that enables verifiable, decentralized digital identity. Each DID is associated with a unique entity. DIDs may represent humans, objects, and more. A DID Document (DDO) is JSON blob that holds information about the DID. Given a DID, a _resolver_ will return the DDO of that DID. @@ -18,11 +18,11 @@ The combination of a DID and its associated DID Document forms the root record f DIDs and DDOs follow the [specification defined by the World Wide Web Consortium (W3C)](https://w3c-ccg.github.io/did-spec/). -## Rules for DIDs & DDOs in Ocean +## Rules for DIDs & DDOs An _asset_ in Ocean represents a downloadable file, compute service, or similar. Each asset is a _resource_ under control of a _publisher_. The Ocean network itself does _not_ store the actual resource (e.g. files). -An _asset_ should have a DID and DDO. and the DDO should include metadata about the asset. The DDO can only can be modified by _owners_ or _delegated users_. +An _asset_ should have a DID and DDO and the DDO should include metadata about the asset. The DDO can only can be modified by _owners_ or _delegated users_. There _must_ be at least one client library acting as _resolver_, to get a DDO from a DID. A metadata cache like Aquarius can help in reading and searching through DDO data from the chain. @@ -105,19 +105,19 @@ In addition, Aquarius will add the following objects, which are not taken into a The object has the following attributes. -| Attribute | Type | Required | Description | -| --------------------------- | ------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`description`** | Text | **Yes** | Details of what the resource is. For a dataset, this attribute explains what the data represents and what it can be used for. | -| **`copyrightHolder`** | Text | No | The party holding the legal copyright. Empty by default. | -| **`name`** | Text | **Yes** | Descriptive name or title of the asset. | -| **`type`** | Text | **Yes** | Asset type. Includes `"dataset"` (e.g. csv file), `"algorithm"` (e.g. Python script). Each type needs a different subset of metadata attributes. | -| **`author`** | Text | **Yes** | Name of the entity generating this data (e.g. Tfl, Disney Corp, etc.). | -| **`license`** | Text | **Yes** | Short name referencing the license of the asset (e.g. Public Domain, CC-0, CC-BY, No License Specified, etc. ). If it's not specified, the following value will be added: "No License Specified". | -| **`links`** | Array of Link | No | Mapping of links for data samples, or links to find out more information. Links may be to either a URL or another Asset. We expect marketplaces to converge on agreements of typical formats for linked data: The Ocean Protocol itself does not mandate any specific formats as these requirements are likely to be domain-specific. The links array can be an empty array, but if there is a link object in it, then an "url" is required in that link object. | -| **`contentLanguage`** | Text | No | The language of the content. Please use one of the language codes from the [IETF BCP 47 standard](https://tools.ietf.org/html/bcp47) | -| **`categories`** | Array of Text | No | Optional array of categories associated to the asset. Note: recommended to use `"tags"` instead of this. | -| **`tags`** | Array of Text | No | Array of keywords or tags used to describe this content. Empty by default. | -| **`additionalInformation`** | Object | No | Stores additional information, this is customizable by publisher | +| Attribute | Type | Required | Description | +| --------------------------- | --------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **`description`** | Text | **Yes** | Details of what the resource is. For a dataset, this attribute explains what the data represents and what it can be used for. | +| **`copyrightHolder`** | Text | No | The party holding the legal copyright. Empty by default. | +| **`name`** | Text | **Yes** | Descriptive name or title of the asset. | +| **`type`** | Text | **Yes** | Asset type. Includes `"dataset"` (e.g. csv file), `"algorithm"` (e.g. Python script). Each type needs a different subset of metadata attributes. | +| **`author`** | Text | **Yes** | Name of the entity generating this data (e.g. Tfl, Disney Corp, etc.). | +| **`license`** | Text | **Yes** | Short name referencing the license of the asset (e.g. Public Domain, CC-0, CC-BY, No License Specified, etc. ). If it's not specified, the following value will be added: "No License Specified". | +| **`links`** | Array of string | No | Mapping of URL strings for data samples, or links to find out more information. Links may be to either a URL or another asset. | +| **`contentLanguage`** | Text | No | The language of the content. Please use one of the language codes from the [IETF BCP 47 standard](https://tools.ietf.org/html/bcp47) | +| **`categories`** | Array of Text | No | Optional array of categories associated to the asset. Note: recommended to use `"tags"` instead of this. | +| **`tags`** | Array of Text | No | Array of keywords or tags used to describe this content. Empty by default. | +| **`additionalInformation`** | Object | No | Stores additional information, this is customizable by publisher | Depending on the asset type (dataset, algorithm), there are different metadata attributes supported: From cd47fd60c34bc3329e550b8c3204ed3897ee93c6 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 12:33:01 +0100 Subject: [PATCH 023/145] json formatting --- content/concepts/did-ddo.md | 174 +++++++++++++++++------------------- 1 file changed, 81 insertions(+), 93 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 204bcf68..615e5ddc 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -89,17 +89,11 @@ A DDO has these required attributes: In Ocean, the DDO also has: - `version` - string, stores version information (example: `v4.0.0`) -- `chainId` - integer, stores chainId of the network used +- `chainId` - integer, stores chainId of the network the DDO was published to - `metadata` - stores metadata information [Metadata](#metadata) - `services` - stores an array of services [Services](#services) -- `credentials` - optional flag, which describes the credentials needed to access a dataset [Credentials](#credentials) - `files` and `encryptedFiles` - stores file(s) informations [Files](#files) - -In addition, Aquarius will add the following objects, which are not taken into account when [DDO hash](#ddo-hash) is calculated: - -- `status` - stores status related fields [Status](#status) -- `event` - stores the last event information [Event](#event) -- `stats` - stores several fields for statistics [Stats](#stats) +- `credentials` - optional flag, which describes the credentials needed to access a dataset [Credentials](#credentials) ## Metadata @@ -195,49 +189,43 @@ sha256( Example: ```json - { - {...}, - "services":[ - { - "type":"access", - "name":"Download service", - "description":"Download service", - "datatokenAddress":"0x123", - "providerEndpoint":"https://myprovider", - "timeout":0 - }, - { - "type":"compute", - "name":"Compute service", - "description":"Compute service", - "datatokenAddress":"0x124", - "providerEndpoint":"https://myprovider", - "timeout":0, - "privacy":{ - "allowRawAlgorithm":false, - "allowNetworkAccess":true, - "publisherTrustedAlgorithmPublishers":[ - "0x234", - "0x235" - ], - "publisherTrustedAlgorithms":[ - { - "did":"did:op:123", - "filesChecksum":"100", - "containerSectionChecksum":"200" - }, - { - "did":"did:op:124", - "filesChecksum":"110", - "containerSectionChecksum":"210" - } - ] - } + "services": [ + { + "type": "access", + "name": "Download service", + "description": "Download service", + "datatokenAddress": "0x123", + "providerEndpoint": "https://myprovider", + "timeout": 0 + }, + { + "type": "compute", + "name": "Compute service", + "description": "Compute service", + "datatokenAddress": "0x124", + "providerEndpoint": "https://myprovider", + "timeout": 0, + "privacy": { + "allowRawAlgorithm": false, + "allowNetworkAccess": true, + "publisherTrustedAlgorithmPublishers": ["0x234", "0x235"], + "publisherTrustedAlgorithms": [ + { + "did": "did:op:123", + "filesChecksum": "100", + "containerSectionChecksum": "200" + }, + { + "did": "did:op:124", + "filesChecksum": "110", + "containerSectionChecksum": "210" + } + ] } - ] + } + ] } - ``` ## Credentials @@ -248,39 +236,34 @@ Consider a medical data use case, where only a credentialed EU researcher can le This is like going to an R-rated movie, where you can only get in if you show both your movie ticket (datatoken) _and_ some some id showing you're old enough (credential). -Only credentials that can be proven are supported. This includes Ethereum public addresses, and (in the future) W3C Verifiable Credentials and more. +Only credentials that can be proven are supported. This includes Ethereum public addresses, and (in the future) [W3C Verifiable Credentials]() and more. Ocean also supports `"deny"` credentials: if a consumer has any of these credentials, they cannot access the resource. -Here's an example object with both `"allow"` and `"deny"` entries. +Here's an example object with both `"allow"` and `"deny"` entries: ```json { - {...}, - "credentials":{ - "allow":[ - { - "type":"address", - "values":[ - "0x123", - "0x456" - ] - } - ], - "deny":[ - { - "type":"address", - "values":[ - "0x2222", - "0x333" - ] - } - ] + "credentials": { + "allow": [ + { + "type": "address", + "values": ["0x123", "0x456"] + } + ], + "deny": [ + { + "type": "address", + "values": ["0x2222", "0x333"] + } + ] } } ``` -For future usage, we can extend that with different credentials types. Example: +For future usage, we can extend that with different credentials types. + +Example: ```json { @@ -314,15 +297,14 @@ Example: ```json { - {..}, - files:{ + "files": { "files": [ - { - "contentLength": "3975", - "contentType": "text/csv" - } - ], - "encryptedFiles": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", + { + "contentLength": "3975", + "contentType": "text/csv" + } + ], + "encryptedFiles": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735" } } ``` @@ -379,41 +361,47 @@ The `status` object contains the following attributes: ```json { - {...}, "status": { "state": 0, "isListed": true, "isOrderDisabled": false } +} ``` ### Events -The `events` section contains informations about the transactions that created or updated the DDO +The `events` section contains informations about the transactions that created or updated the DDO. + +Example: ```json { - {...}, - "events": [{ - "txid": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", - "blockNo": 12831214, - "from": "0xAcca11dbeD4F863Bb3bC2336D3CE5BAC52aa1f83", - "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf", - "update": false, - "chainId": 1, - }] + "events": [ + { + "txid": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", + "blockNo": 12831214, + "from": "0xAcca11dbeD4F863Bb3bC2336D3CE5BAC52aa1f83", + "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf", + "update": false, + "chainId": 1 + } + ] +} ``` ### Stats The `stats` section contains different statics fields. +Example: + ```json { - {...}, "stats": { - "consumes":4 + "consumes": 4 } +} ``` ## Full Enhanced DDO Example: @@ -447,7 +435,7 @@ The `stats` section contains different statics fields. "name": "Download service", "description": "Download service", "datatokenAddress": "0x123", - "providerEndpoint": "https://myprovider", + "providerEndpoint": "https://myprovider.com", "timeout": 0 } ], From 691bf708818efe089e0d7e97006cd6956d8f6ec8 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 12:55:05 +0100 Subject: [PATCH 024/145] add nft to enhanced DDO section --- content/concepts/did-ddo.md | 110 ++++++++++++++++++++++-------------- 1 file changed, 69 insertions(+), 41 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 615e5ddc..c35dd92b 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -1,5 +1,5 @@ --- -title: DIDs & DDOs - Asset Identifiers & Objects +title: DIDs & DDOs description: Specification of Ocean asset identifiers and objects using DIDs & DDOs slug: /concepts/did-ddo/ section: concepts @@ -13,8 +13,7 @@ Decentralized identifiers (DIDs) are a type of identifier that enables verifiabl A DID Document (DDO) is JSON blob that holds information about the DID. Given a DID, a _resolver_ will return the DDO of that DID. -If a DID is the index key in a key-value pair, then the DID Document is the value to which the index key points. -The combination of a DID and its associated DID Document forms the root record for a decentralized identifier. +If a DID is the index key in a key-value pair, then the DID Document is the value to which the index key points. The combination of a DID and its associated DID Document forms the root record for a decentralized identifier. DIDs and DDOs follow the [specification defined by the World Wide Web Consortium (W3C)](https://w3c-ccg.github.io/did-spec/). @@ -113,17 +112,15 @@ The object has the following attributes. | **`tags`** | Array of Text | No | Array of keywords or tags used to describe this content. Empty by default. | | **`additionalInformation`** | Object | No | Stores additional information, this is customizable by publisher | -Depending on the asset type (dataset, algorithm), there are different metadata attributes supported: - ### Algorithm attributes An asset of type `algorithm` has the following additional attributes under `algorithm` in metadata object: -| Attribute | Type | Required | Description | -| --------------- | ------------------ | -------- | -------------------------------------------------------- | -| **`language`** | `string` | no | Language used to implement the software | -| **`version`** | `string` | no | Version of the software. | -| **`container`** | `Container Object` | yes | Object describing the Docker container image.(see below) | +| Attribute | Type | Required | Description | +| --------------- | ------------------ | -------- | ------------------------------------------------------- | +| **`language`** | `string` | no | Language used to implement the software | +| **`version`** | `string` | no | Version of the software. | +| **`container`** | `Container Object` | yes | Object describing the Docker container image. See below | The `container` object has the following attributes: @@ -136,38 +133,37 @@ The `container` object has the following attributes: ## Services -| Attribute | Type | Required | Description | -| ---------------------- | --------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------- | -| **`type`** | Text | **Yes** | Type of service (access, compute, wss, etc | -| **`name`** | Text | No | Service friendly name | -| **`description`** | Text | No | Service description | -| **`datatokenAddress`** | Text | Yes | Datatoken address | -| **`providerEndpoint`** | Text | **Yes** | Provider URI | -| **`timeout`** | Number | **Yes** | describing how long the sevice can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds. | -| **`files`** | Array of files object | **No ** | Array of `File` objects including the encrypted file urls that overwrites the root files object for this service [Files](#files) | +| Attribute | Type | Required | Description | +| ---------------------- | --------------------- | -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | +| **`type`** | Text | **Yes** | Type of service (access, compute, wss, etc | +| **`name`** | Text | No | Service friendly name | +| **`description`** | Text | No | Service description | +| **`datatokenAddress`** | Text | Yes | Datatoken address | +| **`providerEndpoint`** | Text | **Yes** | Provider URI | +| **`timeout`** | Number | **Yes** | describing how long the sevice can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds. | +| **`files`** | Array of files object | **Yes** | Array of `File` objects for publishing. These will be transformed to `encryptedFiles` during publish process. See [Files](#files) | +| **`privacy`** | Object | **Yes for compute assets** | If asset is of compute `type`, holds information about the compute-ralyted privacy settings. | -Depending on the service type, the following attributes are applied: +### Compute Privacy Attributes -### Compute datasets attributes - -An asset with a service of type `compute` has the following additional attributes under `privacy` object : +An asset with a service of `type` `compute` has the following additional attributes under the `privacy` object. This object is required if the asset is of `type` `compute`. | Attribute | Type | Required | Description | | ------------------------------------------ | ------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------ | -| **`allowRawAlgorithm`** | `boolean` | yes | If True, a drag & drop algo can be runned | -| **`allowNetworkAccess`** | `boolean` | yes | If True, the algo job will have network access (stil WIP) | +| **`allowRawAlgorithm`** | `boolean` | yes | If `true`, a drag & drop algorithm can be run | +| **`allowNetworkAccess`** | `boolean` | yes | If `true`, the algorithm job will have network access (still WIP) | | **`publisherTrustedAlgorithmPublishers `** | Array of `String` | yes | If Empty , then any published algo is allowed. Otherwise, only published algorithms by some publishers are allowed | | **`publisherTrustedAlgorithms `** | Array of `publisherTrustedAlgorithms` | yes | If Empty , then any published algo is allowed. (see below) | The `publisherTrustedAlgorithms ` is an array of objects with the following structure: -| Attribute | Type | Required | Description | -| ------------------------------ | -------- | -------- | ------------------------------------------------------------------ | -| **`did`** | `string` | yes | The did of the algo which is trusted by the publisher. | -| **`filesChecksum`** | `string` | yes | Hash of ( algorithm's encryptedFiles + files section (as string) ) | -| **`containerSectionChecksum`** | `string` | yes | Hash of the algorithm container section (as string) | +| Attribute | Type | Required | Description | +| ------------------------------ | -------- | -------- | -------------------------------------------------------------- | +| **`did`** | `string` | yes | The DID of the algorithm which is trusted by the publisher. | +| **`filesChecksum`** | `string` | yes | Hash of algorithm's encryptedFiles + files section (as string) | +| **`containerSectionChecksum`** | `string` | yes | Hash of the algorithm container section (as string) | -To produce filesChecksum: +To produce `filesChecksum`: ```js sha256( @@ -176,7 +172,7 @@ sha256( ) ``` -To produce containerSectionChecksum: +To produce `containerSectionChecksum`: ```js sha256( @@ -349,15 +345,41 @@ _Aquarius_ should always check the hash after data is decrypted via a _Provider_ The following fields are added by Aquarius in its DDO response for convenience reasons. These are never stored on chain, and not taken into consideration when [hashing the DDO](#ddo-hash). +### NFT + +The `nft` object contains information on the NFT contract. + +| Attribute | Type | Description | +| ------------- | -------- | --------------------------------------------- | +| **`address`** | `string` | Contract address of the deployed NFT contract | +| **`name`** | `string` | Name of NFT set in contract | +| **`symbol`** | `string` | Symbol of NFT set in contract | +| **`owner`** | `string` | ETH account address of the NFT owner | + +Example: + +```json +{ + "nft": { + "adddress": "0x000000", + "name": "Ocean Protocol Asset v4", + "symbol": "OCEAN-A-v4", + "owner": "0x0000000" + } +} +``` + ### Status -The `status` object contains the following attributes: +The `status` object contains attributes for marketplaces to implement various visibility states for an asset. -| Attribute | Type | Required | Description | -| --------------------- | --------- | -------- | ------------------------------------------------------------------------- | -| **`state`** | `number` | yes | State of the asset reflecting the NFT contract value. See [State](#state) | -| **`isListed`** | `boolean` | no | If this asset should be displayed | -| **`isOrderDisabled`** | `boolean` | no | If this asset has ordering disabled | +| Attribute | Type | Description | +| --------------------- | --------- | ------------------------------------------------------------------------- | +| **`state`** | `number` | State of the asset reflecting the NFT contract value. See [State](#state) | +| **`isListed`** | `boolean` | If this asset should be displayed | +| **`isOrderDisabled`** | `boolean` | If this asset has ordering disabled | + +Example: ```json { @@ -371,7 +393,7 @@ The `status` object contains the following attributes: ### Events -The `events` section contains informations about the transactions that created or updated the DDO. +The `events` section contains information about the transactions that created or updated the DDO which can be useful for displaying a metadata history for provenance reasons. Example: @@ -390,9 +412,9 @@ Example: } ``` -### Stats +### Statistics -The `stats` section contains different statics fields. +The `stats` section contains different statistics fields. Example: @@ -455,6 +477,12 @@ Example: }, // Enhanced Aquarius response begins here + "nft": { + "adddress": "0x000000", + "name": "Ocean Protocol Asset v4", + "symbol": "OCEAN-A-v4", + "owner": "0x0000000" + }, "status": { "state": 0, "isListed": true, From f505002fbabd11185eed3a29e0bfa37af2dc646e Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 12:59:20 +0100 Subject: [PATCH 025/145] fixes --- content/concepts/did-ddo.md | 102 +++++++++++++++++------------------- 1 file changed, 49 insertions(+), 53 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index c35dd92b..b9f96cec 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -167,19 +167,15 @@ To produce `filesChecksum`: ```js sha256( - algorithm_ddo.service['metadata'].attributes.encryptedFiles + - JSON.Stringify(algorithm_ddo.service['metadata'].attributes.main.files) + algorithm_ddo.metadata.encryptedFiles + + JSON.Stringify(algorithm_ddo.metadata.files) ) ``` To produce `containerSectionChecksum`: ```js -sha256( - JSON.Stringify( - algorithm_ddo.service['metadata'].attributes.main.algorithm.container - ) -) +sha256(JSON.Stringify(algorithm_ddo.metadata.algorithm.container)) ``` Example: @@ -224,50 +220,6 @@ Example: } ``` -## Credentials - -By default, a consumer can access a resource if they have 1.0 datatokens. _Credentials_ allow the publisher to optionally specify finer-grained permissions. - -Consider a medical data use case, where only a credentialed EU researcher can legally access a given dataset. Ocean supports this as follows: a consumer can only access the resource if they have 1.0 datatokens _and_ one of the specified `"allow"` credentials. - -This is like going to an R-rated movie, where you can only get in if you show both your movie ticket (datatoken) _and_ some some id showing you're old enough (credential). - -Only credentials that can be proven are supported. This includes Ethereum public addresses, and (in the future) [W3C Verifiable Credentials]() and more. - -Ocean also supports `"deny"` credentials: if a consumer has any of these credentials, they cannot access the resource. - -Here's an example object with both `"allow"` and `"deny"` entries: - -```json -{ - "credentials": { - "allow": [ - { - "type": "address", - "values": ["0x123", "0x456"] - } - ], - "deny": [ - { - "type": "address", - "values": ["0x2222", "0x333"] - } - ] - } -} -``` - -For future usage, we can extend that with different credentials types. - -Example: - -```json -{ - "type": "credential3Box", - "values": ["profile1", "profile2"] -} -``` - ## Files The `files` section contains a `file` object (that contains a list of `file` objects) and a `encryptedFiles` string which contains the encrypted urls @@ -305,9 +257,53 @@ Example: } ``` +## Credentials + +By default, a consumer can access a resource if they have 1.0 datatokens. _Credentials_ allow the publisher to optionally specify finer-grained permissions. + +Consider a medical data use case, where only a credentialed EU researcher can legally access a given dataset. Ocean supports this as follows: a consumer can only access the resource if they have 1.0 datatokens _and_ one of the specified `"allow"` credentials. + +This is like going to an R-rated movie, where you can only get in if you show both your movie ticket (datatoken) _and_ some some id showing you're old enough (credential). + +Only credentials that can be proven are supported. This includes Ethereum public addresses, and (in the future) [W3C Verifiable Credentials](https://www.w3.org/TR/vc-data-model/) and more. + +Ocean also supports `"deny"` credentials: if a consumer has any of these credentials, they can not access the resource. + +Here's an example object with both `"allow"` and `"deny"` entries: + +```json +{ + "credentials": { + "allow": [ + { + "type": "address", + "values": ["0x123", "0x456"] + } + ], + "deny": [ + { + "type": "address", + "values": ["0x2222", "0x333"] + } + ] + } +} +``` + +For future usage, we can extend that with different credentials types. + +Example: + +```json +{ + "type": "credential3Box", + "values": ["profile1", "profile2"] +} +``` + ## DDO Hash -In order to ensure the integrity, a hash is computed for each DDO: +In order to ensure the integrity of the DDO, a hash is computed for each DDO: ```js const hash = sha256(JSON.stringify(DDO)) @@ -343,7 +339,7 @@ _Aquarius_ should always check the hash after data is decrypted via a _Provider_ ## Aquarius Enhanced DDO Response -The following fields are added by Aquarius in its DDO response for convenience reasons. These are never stored on chain, and not taken into consideration when [hashing the DDO](#ddo-hash). +The following fields are added by Aquarius in its DDO response for convenience reasons. These are never stored on chain, and are not taken into consideration when [hashing the DDO](#ddo-hash). ### NFT From ae70ca79ca25021c878f250def79dd6ec5662560 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 13:20:15 +0100 Subject: [PATCH 026/145] consistent attributes formatting --- content/concepts/did-ddo.md | 57 +++++++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index b9f96cec..303af609 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -21,7 +21,7 @@ DIDs and DDOs follow the [specification defined by the World Wide Web Consortium An _asset_ in Ocean represents a downloadable file, compute service, or similar. Each asset is a _resource_ under control of a _publisher_. The Ocean network itself does _not_ store the actual resource (e.g. files). -An _asset_ should have a DID and DDO and the DDO should include metadata about the asset. The DDO can only can be modified by _owners_ or _delegated users_. +An _asset_ should have a DID and DDO. The DDO should include [metadata](#metadata) about the asset, and define access in at least one [service](#services). The DDO can only can be modified by _owners_ or _delegated users_. There _must_ be at least one client library acting as _resolver_, to get a DDO from a DID. A metadata cache like Aquarius can help in reading and searching through DDO data from the chain. @@ -80,23 +80,32 @@ It follows [the generic DID scheme](https://w3c-ccg.github.io/did-spec/#the-gene A DDO has these required attributes: -- `@context` = array, contexts used for validation -- `id` = string, computed as sha256(address of ERC721 contract + chainId) -- `created` = contains the date of publishing, ISO Date Time Format yyyy-MM-dd'T'HH:mm:ss. SSSXXX — for example, "2000-10-31T01:30:00.000-05:00 -- `updated` = contains the date of last update, ISO Date Time Format +| Attribute | Type | Description | +| -------------------- | --------------------------- | ---------------------------------------------------------------------------------------------- | +| **`@context`** | Array of `string` | Contexts used for validation. | +| **`id`** | `string` | Computed as `sha256(address of ERC721 contract + chainId)`. | +| **`created`** | `ISO Date Time string` | Contains the date of publishing in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | +| **`updated`** | `ISO Date Time string` | Contains the the date of last update in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | +| **`services`** | [Services](#services) | Stores an array of services defining access to the asset. | +| **`files`** | [Files](#files) | Stores information about the asset's files. | +| **`encryptedFiles`** | [Files](#files) | Added after publishing. | +| **`credentials`** | [Credentials](#credentials) | Describes the credentials needed to access a dataset in addition to the `services` definition. | -In Ocean, the DDO also has: +In Ocean, the DDO at its root has: -- `version` - string, stores version information (example: `v4.0.0`) -- `chainId` - integer, stores chainId of the network the DDO was published to -- `metadata` - stores metadata information [Metadata](#metadata) -- `services` - stores an array of services [Services](#services) -- `files` and `encryptedFiles` - stores file(s) informations [Files](#files) -- `credentials` - optional flag, which describes the credentials needed to access a dataset [Credentials](#credentials) +| Attribute | Type | Description | +| -------------------- | --------------------------- | ---------------------------------------------------------------------------------------------- | +| **`version`** | `string` | Version information referring to this DDO spec version, like `4.0.0`. | +| **`chainId`** | `number` | Stores chainId of the network the DDO was published to. | +| **`metadata`** | [Metadata](#metadata) | Stores metadata information about the asset. | +| **`services`** | [Services](#services) | Stores an array of services defining access to the asset. | +| **`files`** | [Files](#files) | Stores information about the asset's files. | +| **`encryptedFiles`** | [Files](#files) | Added after publishing. | +| **`credentials`** | [Credentials](#credentials) | Describes the credentials needed to access a dataset in addition to the `services` definition. | ## Metadata -The object has the following attributes. +This object holds information describing the actual actual asset. | Attribute | Type | Required | Description | | --------------------------- | --------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -112,7 +121,7 @@ The object has the following attributes. | **`tags`** | Array of Text | No | Array of keywords or tags used to describe this content. Empty by default. | | **`additionalInformation`** | Object | No | Stores additional information, this is customizable by publisher | -### Algorithm attributes +### Metadata: Algorithm An asset of type `algorithm` has the following additional attributes under `algorithm` in metadata object: @@ -133,6 +142,8 @@ The `container` object has the following attributes: ## Services +Services define the access to the asset. + | Attribute | Type | Required | Description | | ---------------------- | --------------------- | -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | | **`type`** | Text | **Yes** | Type of service (access, compute, wss, etc | @@ -142,11 +153,11 @@ The `container` object has the following attributes: | **`providerEndpoint`** | Text | **Yes** | Provider URI | | **`timeout`** | Number | **Yes** | describing how long the sevice can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds. | | **`files`** | Array of files object | **Yes** | Array of `File` objects for publishing. These will be transformed to `encryptedFiles` during publish process. See [Files](#files) | -| **`privacy`** | Object | **Yes for compute assets** | If asset is of compute `type`, holds information about the compute-ralyted privacy settings. | +| **`privacy`** | Object | **Yes for compute assets** | If asset is of compute `type`, holds information about the compute-related privacy settings. | -### Compute Privacy Attributes +### Compute Privacy -An asset with a service of `type` `compute` has the following additional attributes under the `privacy` object. This object is required if the asset is of `type` `compute`. +An asset with a service of `type` `compute` has the following additional attributes under the `privacy` object. This object is required if the asset is of `type` `compute`, but can be omitted for `type` of `access`. | Attribute | Type | Required | Description | | ------------------------------------------ | ------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------ | @@ -309,7 +320,7 @@ In order to ensure the integrity of the DDO, a hash is computed for each DDO: const hash = sha256(JSON.stringify(DDO)) ``` -The hash is used when publishing/update metadata using setMetaData function in ERC721 contract and it is stored in the event generated by the ERC721 contract: +The hash is used when publishing/update metadata using `setMetaData` function in the ERC721 contract, and is stored in the event generated by the ERC721 contract: ```solidity event MetadataCreated( @@ -339,11 +350,11 @@ _Aquarius_ should always check the hash after data is decrypted via a _Provider_ ## Aquarius Enhanced DDO Response -The following fields are added by Aquarius in its DDO response for convenience reasons. These are never stored on chain, and are not taken into consideration when [hashing the DDO](#ddo-hash). +The following fields are added by _Aquarius_ in its DDO response for convenience reasons. These are never stored on-chain, and are never taken into consideration when [hashing the DDO](#ddo-hash). ### NFT -The `nft` object contains information on the NFT contract. +The `nft` object contains information about the NFT contract which represents the intellectual property of the publisher. | Attribute | Type | Description | | ------------- | -------- | --------------------------------------------- | @@ -412,6 +423,10 @@ Example: The `stats` section contains different statistics fields. +| Attribute | Type | Description | +| -------------- | -------- | ------------------------------------------------------------------------------------------------------------- | +| **`consumes`** | `number` | How often an asset was consumed, meaning how often it was either downloaded or used as part of a compute job. | + Example: ```json @@ -430,7 +445,7 @@ Example: "id": "did:op:ACce67694eD2848dd683c651Dab7Af823b7dd123", "created": "2020-11-15T12:27:48Z", "updated": "2021-05-17T21:58:02Z", - "version": "v4.0.0", + "version": "4.0.0", "chainId": 1, "metadata": { "description": "Sample description", From 3f80e563a14c2da12c2a4e1496254c6d42cb041d Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 13:29:30 +0100 Subject: [PATCH 027/145] more examples --- content/concepts/did-ddo.md | 75 ++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 35 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 303af609..0e428ba6 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -5,6 +5,8 @@ slug: /concepts/did-ddo/ section: concepts --- +**v4.0.0** + ## Overview This document describes how Ocean assets follow the DID/DDO spec, such that Ocean assets can inherit DID/DDO benefits and enhance interoperability. @@ -40,6 +42,8 @@ The DDO is stored on-chain as part of the NFT contract and it is stored encrypte Here is the complete flow: +![DDO_flow](images/DDO_flow.png) + ```text title DDO flow @@ -58,8 +62,6 @@ Aquarius -> Aquarius : cache DDO Aquarius -> Aquarius : enhance cached DDO in response with additional infos like `events` & `stats` ``` -![DDO_flow](images/DDO_flow.png) - ## DID Structure In Ocean, a DID is a string that looks like: @@ -78,26 +80,16 @@ It follows [the generic DID scheme](https://w3c-ccg.github.io/did-spec/#the-gene ## DDO Attributes -A DDO has these required attributes: +A DDO in Ocean has these required attributes: | Attribute | Type | Description | | -------------------- | --------------------------- | ---------------------------------------------------------------------------------------------- | | **`@context`** | Array of `string` | Contexts used for validation. | | **`id`** | `string` | Computed as `sha256(address of ERC721 contract + chainId)`. | -| **`created`** | `ISO Date Time string` | Contains the date of publishing in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | -| **`updated`** | `ISO Date Time string` | Contains the the date of last update in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | -| **`services`** | [Services](#services) | Stores an array of services defining access to the asset. | -| **`files`** | [Files](#files) | Stores information about the asset's files. | -| **`encryptedFiles`** | [Files](#files) | Added after publishing. | -| **`credentials`** | [Credentials](#credentials) | Describes the credentials needed to access a dataset in addition to the `services` definition. | - -In Ocean, the DDO at its root has: - -| Attribute | Type | Description | -| -------------------- | --------------------------- | ---------------------------------------------------------------------------------------------- | | **`version`** | `string` | Version information referring to this DDO spec version, like `4.0.0`. | | **`chainId`** | `number` | Stores chainId of the network the DDO was published to. | -| **`metadata`** | [Metadata](#metadata) | Stores metadata information about the asset. | +| **`created`** | `ISO Date Time string` | Contains the date of publishing in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | +| **`updated`** | `ISO Date Time string` | Contains the the date of last update in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | | **`services`** | [Services](#services) | Stores an array of services defining access to the asset. | | **`files`** | [Files](#files) | Stores information about the asset's files. | | **`encryptedFiles`** | [Files](#files) | Added after publishing. | @@ -121,17 +113,31 @@ This object holds information describing the actual actual asset. | **`tags`** | Array of Text | No | Array of keywords or tags used to describe this content. Empty by default. | | **`additionalInformation`** | Object | No | Stores additional information, this is customizable by publisher | -### Metadata: Algorithm +Example: -An asset of type `algorithm` has the following additional attributes under `algorithm` in metadata object: +```json +{ + "metadata": { + "description": "Sample description", + "name": "Sample asset", + "type": "dataset", + "author": "OPF", + "license": "https://market.oceanprotocol.com/terms" + } +} +``` -| Attribute | Type | Required | Description | -| --------------- | ------------------ | -------- | ------------------------------------------------------- | -| **`language`** | `string` | no | Language used to implement the software | -| **`version`** | `string` | no | Version of the software. | -| **`container`** | `Container Object` | yes | Object describing the Docker container image. See below | +### Algorithm Metadata -The `container` object has the following attributes: +An asset of type `algorithm` has the following additional attributes under `algorithm` within the `metadata` object: + +| Attribute | Type | Required | Description | +| --------------- | ----------- | -------- | ------------------------------------------------------- | +| **`language`** | `string` | no | Language used to implement the software | +| **`version`** | `string` | no | Version of the software. | +| **`container`** | `container` | yes | Object describing the Docker container image. See below | + +The `container` object has the following attributes defining the Docker image the algorithm needs to run: | Attribute | Type | Required | Description | | ---------------- | -------- | -------- | ----------------------------------------------------------------- | @@ -144,16 +150,16 @@ The `container` object has the following attributes: Services define the access to the asset. -| Attribute | Type | Required | Description | -| ---------------------- | --------------------- | -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | -| **`type`** | Text | **Yes** | Type of service (access, compute, wss, etc | -| **`name`** | Text | No | Service friendly name | -| **`description`** | Text | No | Service description | -| **`datatokenAddress`** | Text | Yes | Datatoken address | -| **`providerEndpoint`** | Text | **Yes** | Provider URI | -| **`timeout`** | Number | **Yes** | describing how long the sevice can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds. | -| **`files`** | Array of files object | **Yes** | Array of `File` objects for publishing. These will be transformed to `encryptedFiles` during publish process. See [Files](#files) | -| **`privacy`** | Object | **Yes for compute assets** | If asset is of compute `type`, holds information about the compute-related privacy settings. | +| Attribute | Type | Required | Description | +| ---------------------- | --------------------- | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | +| **`type`** | Text | **Yes** | Type of service (access, compute, wss, etc | +| **`name`** | Text | No | Service friendly name | +| **`description`** | Text | No | Service description | +| **`datatokenAddress`** | Text | Yes | Datatoken address | +| **`providerEndpoint`** | Text | **Yes** | Provider URI | +| **`timeout`** | Number | **Yes** | describing how long the service can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds. | +| **`files`** | Array of files object | **Yes** | Array of `File` objects for publishing. These will be transformed to `encryptedFiles` during publish process. See [Files](#files) | +| **`privacy`** | Object | **Yes for compute assets** | If asset is of compute `type`, holds information about the compute-related privacy settings. | ### Compute Privacy @@ -259,8 +265,7 @@ Example: "files": { "files": [ { - "contentLength": "3975", - "contentType": "text/csv" + "url": "https://demo.com/file.csv" } ], "encryptedFiles": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735" From beca473cbdb5923c2e04bc4485ab5f7d2995601b Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 13:42:52 +0100 Subject: [PATCH 028/145] fix --- content/concepts/did-ddo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 0e428ba6..2fb29ef3 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -36,7 +36,7 @@ Each asset has a state, which is held by the NFT contract. The possible states a - `2` = deprecated (by another asset) - `3` = revoked by publisher -## Publishing an Retrieving DDOs +## Publishing & Retrieving DDOs The DDO is stored on-chain as part of the NFT contract and it is stored encrypted using the private key of the _Provider_. To resolve it, a metadata cache like _Aquarius_ must query the provider to decrypt the DDO. From 96ed5e15fe867e32c101e54874011dd837d3ccdd Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 13:50:33 +0100 Subject: [PATCH 029/145] consistent table value formatting --- content/concepts/did-ddo.md | 102 ++++++++++++++++++------------------ 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 2fb29ef3..928ae37b 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -73,7 +73,7 @@ did:op:0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea where ```text -0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea` = sha256(ERC721 contract address + chainId) +0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea = sha256(ERC721 contract address + chainId) ``` It follows [the generic DID scheme](https://w3c-ccg.github.io/did-spec/#the-generic-did-scheme). @@ -99,19 +99,19 @@ A DDO in Ocean has these required attributes: This object holds information describing the actual actual asset. -| Attribute | Type | Required | Description | -| --------------------------- | --------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`description`** | Text | **Yes** | Details of what the resource is. For a dataset, this attribute explains what the data represents and what it can be used for. | -| **`copyrightHolder`** | Text | No | The party holding the legal copyright. Empty by default. | -| **`name`** | Text | **Yes** | Descriptive name or title of the asset. | -| **`type`** | Text | **Yes** | Asset type. Includes `"dataset"` (e.g. csv file), `"algorithm"` (e.g. Python script). Each type needs a different subset of metadata attributes. | -| **`author`** | Text | **Yes** | Name of the entity generating this data (e.g. Tfl, Disney Corp, etc.). | -| **`license`** | Text | **Yes** | Short name referencing the license of the asset (e.g. Public Domain, CC-0, CC-BY, No License Specified, etc. ). If it's not specified, the following value will be added: "No License Specified". | -| **`links`** | Array of string | No | Mapping of URL strings for data samples, or links to find out more information. Links may be to either a URL or another asset. | -| **`contentLanguage`** | Text | No | The language of the content. Please use one of the language codes from the [IETF BCP 47 standard](https://tools.ietf.org/html/bcp47) | -| **`categories`** | Array of Text | No | Optional array of categories associated to the asset. Note: recommended to use `"tags"` instead of this. | -| **`tags`** | Array of Text | No | Array of keywords or tags used to describe this content. Empty by default. | -| **`additionalInformation`** | Object | No | Stores additional information, this is customizable by publisher | +| Attribute | Type | Required | Description | +| --------------------------- | ----------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **`description`** | `string` | **✓** | Details of what the resource is. For a dataset, this attribute explains what the data represents and what it can be used for. | +| **`copyrightHolder`** | `string` | | The party holding the legal copyright. Empty by default. | +| **`name`** | `string` | **✓** | Descriptive name or title of the asset. | +| **`type`** | `string` | **✓** | Asset type. Includes `"dataset"` (e.g. csv file), `"algorithm"` (e.g. Python script). Each type needs a different subset of metadata attributes. | +| **`author`** | `string` | **✓** | Name of the entity generating this data (e.g. Tfl, Disney Corp, etc.). | +| **`license`** | `string` | **✓** | Short name referencing the license of the asset (e.g. Public Domain, CC-0, CC-BY, No License Specified, etc. ). If it's not specified, the following value will be added: "No License Specified". | +| **`links`** | Array of `string` | | Mapping of URL strings for data samples, or links to find out more information. Links may be to either a URL or another asset. | +| **`contentLanguage`** | `string` | | The language of the content. Please use one of the language codes from the [IETF BCP 47 standard](https://tools.ietf.org/html/bcp47) | +| **`categories`** | Array of `string` | | Optional array of categories associated to the asset. Note: recommended to use `"tags"` instead of this. | +| **`tags`** | Array of `string` | | Array of keywords or tags used to describe this content. Empty by default. | +| **`additionalInformation`** | Object | | Stores additional information, this is customizable by publisher | Example: @@ -133,33 +133,33 @@ An asset of type `algorithm` has the following additional attributes under `algo | Attribute | Type | Required | Description | | --------------- | ----------- | -------- | ------------------------------------------------------- | -| **`language`** | `string` | no | Language used to implement the software | -| **`version`** | `string` | no | Version of the software. | -| **`container`** | `container` | yes | Object describing the Docker container image. See below | +| **`language`** | `string` | | Language used to implement the software | +| **`version`** | `string` | | Version of the software. | +| **`container`** | `container` | **✓** | Object describing the Docker container image. See below | The `container` object has the following attributes defining the Docker image the algorithm needs to run: | Attribute | Type | Required | Description | | ---------------- | -------- | -------- | ----------------------------------------------------------------- | -| **`entrypoint`** | `string` | yes | The command to execute, or script to run inside the Docker image. | -| **`image`** | `string` | yes | Name of the Docker image. | -| **`tag`** | `string` | yes | Tag of the Docker image. | -| **`checksum`** | `string` | yes | Checksum of the Docker image. | +| **`entrypoint`** | `string` | **✓** | The command to execute, or script to run inside the Docker image. | +| **`image`** | `string` | **✓** | Name of the Docker image. | +| **`tag`** | `string` | **✓** | Tag of the Docker image. | +| **`checksum`** | `string` | **✓** | Checksum of the Docker image. | ## Services Services define the access to the asset. -| Attribute | Type | Required | Description | -| ---------------------- | --------------------- | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | -| **`type`** | Text | **Yes** | Type of service (access, compute, wss, etc | -| **`name`** | Text | No | Service friendly name | -| **`description`** | Text | No | Service description | -| **`datatokenAddress`** | Text | Yes | Datatoken address | -| **`providerEndpoint`** | Text | **Yes** | Provider URI | -| **`timeout`** | Number | **Yes** | describing how long the service can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds. | -| **`files`** | Array of files object | **Yes** | Array of `File` objects for publishing. These will be transformed to `encryptedFiles` during publish process. See [Files](#files) | -| **`privacy`** | Object | **Yes for compute assets** | If asset is of compute `type`, holds information about the compute-related privacy settings. | +| Attribute | Type | Required | Description | +| ---------------------- | --------------------- | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | +| **`type`** | Text | **✓** | Type of service (`access`, `compute`, `wss`, etc. | +| **`name`** | Text | | Service friendly name | +| **`description`** | Text | | Service description | +| **`datatokenAddress`** | Text | **✓** | Datatoken address | +| **`providerEndpoint`** | Text | **✓** | Provider URI | +| **`timeout`** | Number | **✓** | describing how long the service can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds. | +| **`files`** | Array of files object | **✓** | Array of `File` objects for publishing. These will be transformed to `encryptedFiles` during publish process. See [Files](#files) | +| **`privacy`** | Object | **✓** (for compute assets only) | If asset is of compute `type`, holds information about the compute-related privacy settings. | ### Compute Privacy @@ -167,18 +167,18 @@ An asset with a service of `type` `compute` has the following additional attribu | Attribute | Type | Required | Description | | ------------------------------------------ | ------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------ | -| **`allowRawAlgorithm`** | `boolean` | yes | If `true`, a drag & drop algorithm can be run | -| **`allowNetworkAccess`** | `boolean` | yes | If `true`, the algorithm job will have network access (still WIP) | -| **`publisherTrustedAlgorithmPublishers `** | Array of `String` | yes | If Empty , then any published algo is allowed. Otherwise, only published algorithms by some publishers are allowed | -| **`publisherTrustedAlgorithms `** | Array of `publisherTrustedAlgorithms` | yes | If Empty , then any published algo is allowed. (see below) | +| **`allowRawAlgorithm`** | `boolean` | **✓** | If `true`, a drag & drop algorithm can be run | +| **`allowNetworkAccess`** | `boolean` | **✓** | If `true`, the algorithm job will have network access (still WIP) | +| **`publisherTrustedAlgorithmPublishers `** | Array of `String` | **✓** | If Empty , then any published algo is allowed. Otherwise, only published algorithms by some publishers are allowed | +| **`publisherTrustedAlgorithms `** | Array of `publisherTrustedAlgorithms` | **✓** | If Empty , then any published algo is allowed. (see below) | The `publisherTrustedAlgorithms ` is an array of objects with the following structure: -| Attribute | Type | Required | Description | -| ------------------------------ | -------- | -------- | -------------------------------------------------------------- | -| **`did`** | `string` | yes | The DID of the algorithm which is trusted by the publisher. | -| **`filesChecksum`** | `string` | yes | Hash of algorithm's encryptedFiles + files section (as string) | -| **`containerSectionChecksum`** | `string` | yes | Hash of the algorithm container section (as string) | +| Attribute | Type | Required | Description | +| ------------------------------ | -------- | -------- | ------------------------------------------------------------------ | +| **`did`** | `string` | **✓** | The DID of the algorithm which is trusted by the publisher. | +| **`filesChecksum`** | `string` | **✓** | Hash of algorithm's `encryptedFiles` + `files` section (as string) | +| **`containerSectionChecksum`** | `string` | **✓** | Hash of the algorithm `container` section (as string) | To produce `filesChecksum`: @@ -245,18 +245,18 @@ Each `file` object has the following attributes, with the details necessary to c | Attribute | Required | Description | | -------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`contentType`** | **Yes** | File format. | +| **`contentType`** | **✓** | File format. | | **`url`** | Local | Content URL. Omitted from the remote metadata. Supports `http(s)://` and `ipfs://` URLs. | -| **`name`** | No | File name. | -| **`checksum`** | No | Checksum of the file using your preferred format (i.e. MD5). Format specified in `checksumType`. If it's not provided can't be validated if the file was not modified after registering. | -| **`checksumType`** | No | Format of the provided checksum. Can vary according to server (i.e Amazon vs. Azure) | -| **`contentLength`** | No | Size of the file in bytes. | -| **`encoding`** | No | File encoding (e.g. UTF-8). | -| **`compression`** | No | File compression (e.g. no, gzip, bzip2, etc). | -| **`encrypted`** | No | Boolean. Is the file encrypted? If is not set is assumed the file is not encrypted | -| **`encryptionMode`** | No | Encryption mode used. Just valid if `encrypted=true` | -| **`resourceId`** | No | Remote identifier of the file in the external provider. It is typically the remote id in the cloud provider. | -| **`attributes`** | No | Key-Value hash map with additional attributes describing the asset file. It could include details like the Amazon S3 bucket, region, etc. | +| **`name`** | | File name. | +| **`checksum`** | | Checksum of the file using your preferred format (i.e. MD5). Format specified in `checksumType`. If it's not provided can't be validated if the file was not modified after registering. | +| **`checksumType`** | | Format of the provided checksum. Can vary according to server (i.e Amazon vs. Azure) | +| **`contentLength`** | | Size of the file in bytes. | +| **`encoding`** | | File encoding (e.g. UTF-8). | +| **`compression`** | | File compression (e.g. no, gzip, bzip2, etc). | +| **`encrypted`** | | Boolean. Is the file encrypted? If is not set is assumed the file is not encrypted | +| **`encryptionMode`** | | Encryption mode used. Just valid if `encrypted=true` | +| **`resourceId`** | | Remote identifier of the file in the external provider. It is typically the remote id in the cloud provider. | +| **`attributes`** | | Key-Value hash map with additional attributes describing the asset file. It could include details like the Amazon S3 bucket, region, etc. | Example: From 3fe13e7b8c6429620aa0ce7fb7055c2602f019e0 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 13:53:49 +0100 Subject: [PATCH 030/145] move state section to end until we figure out what to do with it --- content/concepts/did-ddo.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 928ae37b..c118b305 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -25,16 +25,7 @@ An _asset_ in Ocean represents a downloadable file, compute service, or similar. An _asset_ should have a DID and DDO. The DDO should include [metadata](#metadata) about the asset, and define access in at least one [service](#services). The DDO can only can be modified by _owners_ or _delegated users_. -There _must_ be at least one client library acting as _resolver_, to get a DDO from a DID. A metadata cache like Aquarius can help in reading and searching through DDO data from the chain. - -## State - -Each asset has a state, which is held by the NFT contract. The possible states are: - -- `0` = active -- `1` = end-of-life -- `2` = deprecated (by another asset) -- `3` = revoked by publisher +A metadata cache like _Aquarius_ can help in reading and searching through encrypted DDO data from the chain. ## Publishing & Retrieving DDOs @@ -353,6 +344,15 @@ event MetadataUpdated( _Aquarius_ should always check the hash after data is decrypted via a _Provider_ API call, in order to ensure DDO integrity. +## State + +Each asset has a state, which is held by the NFT contract. The possible states are: + +- `0` = active +- `1` = end-of-life +- `2` = deprecated (by another asset) +- `3` = revoked by publisher + ## Aquarius Enhanced DDO Response The following fields are added by _Aquarius_ in its DDO response for convenience reasons. These are never stored on-chain, and are never taken into consideration when [hashing the DDO](#ddo-hash). From c73a312f2451fc1803a01c38779001f056d7aff1 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 14:13:32 +0100 Subject: [PATCH 031/145] hierarchy formatting --- content/concepts/did-ddo.md | 38 ++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index c118b305..faac4dac 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -1,6 +1,6 @@ --- -title: DIDs & DDOs -description: Specification of Ocean asset identifiers and objects using DIDs & DDOs +title: DID & DDO +description: Specification of decentralized identifiers for assets in Ocean Protocol using the DID & DDO standards. slug: /concepts/did-ddo/ section: concepts --- @@ -9,21 +9,19 @@ section: concepts ## Overview -This document describes how Ocean assets follow the DID/DDO spec, such that Ocean assets can inherit DID/DDO benefits and enhance interoperability. +This document describes how Ocean assets follow the DID/DDO specification, such that Ocean assets can inherit DID/DDO benefits and enhance interoperability. DIDs and DDOs follow the [specification defined by the World Wide Web Consortium (W3C)](https://w3c-ccg.github.io/did-spec/). -Decentralized identifiers (DIDs) are a type of identifier that enables verifiable, decentralized digital identity. Each DID is associated with a unique entity. DIDs may represent humans, objects, and more. +Decentralized identifiers (DIDs) are a type of identifier that enable verifiable, decentralized digital identity. Each DID is associated with a unique entity and DIDs may represent humans, objects, and more. A DID Document (DDO) is JSON blob that holds information about the DID. Given a DID, a _resolver_ will return the DDO of that DID. If a DID is the index key in a key-value pair, then the DID Document is the value to which the index key points. The combination of a DID and its associated DID Document forms the root record for a decentralized identifier. -DIDs and DDOs follow the [specification defined by the World Wide Web Consortium (W3C)](https://w3c-ccg.github.io/did-spec/). - ## Rules for DIDs & DDOs An _asset_ in Ocean represents a downloadable file, compute service, or similar. Each asset is a _resource_ under control of a _publisher_. The Ocean network itself does _not_ store the actual resource (e.g. files). -An _asset_ should have a DID and DDO. The DDO should include [metadata](#metadata) about the asset, and define access in at least one [service](#services). The DDO can only can be modified by _owners_ or _delegated users_. +An _asset_ should have a DID and DDO. The DDO should include [metadata](#metadata) about the asset, and define access in at least one [service](#services). The DDO can only be modified by _owners_ or _delegated users_. A metadata cache like _Aquarius_ can help in reading and searching through encrypted DDO data from the chain. @@ -53,7 +51,7 @@ Aquarius -> Aquarius : cache DDO Aquarius -> Aquarius : enhance cached DDO in response with additional infos like `events` & `stats` ``` -## DID Structure +## DID In Ocean, a DID is a string that looks like: @@ -69,7 +67,7 @@ where It follows [the generic DID scheme](https://w3c-ccg.github.io/did-spec/#the-generic-did-scheme). -## DDO Attributes +## DDO A DDO in Ocean has these required attributes: @@ -86,7 +84,7 @@ A DDO in Ocean has these required attributes: | **`encryptedFiles`** | [Files](#files) | Added after publishing. | | **`credentials`** | [Credentials](#credentials) | Describes the credentials needed to access a dataset in addition to the `services` definition. | -## Metadata +### Metadata This object holds information describing the actual actual asset. @@ -118,7 +116,7 @@ Example: } ``` -### Algorithm Metadata +#### Algorithm Metadata An asset of type `algorithm` has the following additional attributes under `algorithm` within the `metadata` object: @@ -137,7 +135,7 @@ The `container` object has the following attributes defining the Docker image th | **`tag`** | `string` | **✓** | Tag of the Docker image. | | **`checksum`** | `string` | **✓** | Checksum of the Docker image. | -## Services +### Services Services define the access to the asset. @@ -152,7 +150,7 @@ Services define the access to the asset. | **`files`** | Array of files object | **✓** | Array of `File` objects for publishing. These will be transformed to `encryptedFiles` during publish process. See [Files](#files) | | **`privacy`** | Object | **✓** (for compute assets only) | If asset is of compute `type`, holds information about the compute-related privacy settings. | -### Compute Privacy +#### Compute Privacy An asset with a service of `type` `compute` has the following additional attributes under the `privacy` object. This object is required if the asset is of `type` `compute`, but can be omitted for `type` of `access`. @@ -228,7 +226,7 @@ Example: } ``` -## Files +### Files The `files` section contains a `file` object (that contains a list of `file` objects) and a `encryptedFiles` string which contains the encrypted urls @@ -264,7 +262,7 @@ Example: } ``` -## Credentials +### Credentials By default, a consumer can access a resource if they have 1.0 datatokens. _Credentials_ allow the publisher to optionally specify finer-grained permissions. @@ -308,7 +306,7 @@ Example: } ``` -## DDO Hash +### DDO Hash In order to ensure the integrity of the DDO, a hash is computed for each DDO: @@ -344,7 +342,7 @@ event MetadataUpdated( _Aquarius_ should always check the hash after data is decrypted via a _Provider_ API call, in order to ensure DDO integrity. -## State +### State Each asset has a state, which is held by the NFT contract. The possible states are: @@ -355,7 +353,9 @@ Each asset has a state, which is held by the NFT contract. The possible states a ## Aquarius Enhanced DDO Response -The following fields are added by _Aquarius_ in its DDO response for convenience reasons. These are never stored on-chain, and are never taken into consideration when [hashing the DDO](#ddo-hash). +The following fields are added by _Aquarius_ in its DDO response for convenience reasons where an `Asset` returned by _Aquarius_ inherits the DDO fields from the chain. + +These additional fields are never stored on-chain, and are never taken into consideration when [hashing the DDO](#ddo-hash). ### NFT @@ -442,7 +442,7 @@ Example: } ``` -## Full Enhanced DDO Example: +## Full Enhanced DDO Example ```json { From b0957f997215fa28633054447dfa4454a0fdd096 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 14:22:19 +0100 Subject: [PATCH 032/145] moving things around --- content/concepts/did-ddo.md | 155 ++++++++++++++++++------------------ 1 file changed, 78 insertions(+), 77 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index faac4dac..f63208d7 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -88,19 +88,20 @@ A DDO in Ocean has these required attributes: This object holds information describing the actual actual asset. -| Attribute | Type | Required | Description | -| --------------------------- | ----------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`description`** | `string` | **✓** | Details of what the resource is. For a dataset, this attribute explains what the data represents and what it can be used for. | -| **`copyrightHolder`** | `string` | | The party holding the legal copyright. Empty by default. | -| **`name`** | `string` | **✓** | Descriptive name or title of the asset. | -| **`type`** | `string` | **✓** | Asset type. Includes `"dataset"` (e.g. csv file), `"algorithm"` (e.g. Python script). Each type needs a different subset of metadata attributes. | -| **`author`** | `string` | **✓** | Name of the entity generating this data (e.g. Tfl, Disney Corp, etc.). | -| **`license`** | `string` | **✓** | Short name referencing the license of the asset (e.g. Public Domain, CC-0, CC-BY, No License Specified, etc. ). If it's not specified, the following value will be added: "No License Specified". | -| **`links`** | Array of `string` | | Mapping of URL strings for data samples, or links to find out more information. Links may be to either a URL or another asset. | -| **`contentLanguage`** | `string` | | The language of the content. Please use one of the language codes from the [IETF BCP 47 standard](https://tools.ietf.org/html/bcp47) | -| **`categories`** | Array of `string` | | Optional array of categories associated to the asset. Note: recommended to use `"tags"` instead of this. | -| **`tags`** | Array of `string` | | Array of keywords or tags used to describe this content. Empty by default. | -| **`additionalInformation`** | Object | | Stores additional information, this is customizable by publisher | +| Attribute | Type | Required | Description | +| --------------------------- | ----------------------------------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **`description`** | `string` | **✓** | Details of what the resource is. For a dataset, this attribute explains what the data represents and what it can be used for. | +| **`copyrightHolder`** | `string` | | The party holding the legal copyright. Empty by default. | +| **`name`** | `string` | **✓** | Descriptive name or title of the asset. | +| **`type`** | `string` | **✓** | Asset type. Includes `"dataset"` (e.g. csv file), `"algorithm"` (e.g. Python script). Each type needs a different subset of metadata attributes. | +| **`author`** | `string` | **✓** | Name of the entity generating this data (e.g. Tfl, Disney Corp, etc.). | +| **`license`** | `string` | **✓** | Short name referencing the license of the asset (e.g. Public Domain, CC-0, CC-BY, No License Specified, etc. ). If it's not specified, the following value will be added: "No License Specified". | +| **`links`** | Array of `string` | | Mapping of URL strings for data samples, or links to find out more information. Links may be to either a URL or another asset. | +| **`contentLanguage`** | `string` | | The language of the content. Please use one of the language codes from the [IETF BCP 47 standard](https://tools.ietf.org/html/bcp47) | +| **`categories`** | Array of `string` | | Optional array of categories associated to the asset. Note: recommended to use `"tags"` instead of this. | +| **`tags`** | Array of `string` | | Array of keywords or tags used to describe this content. Empty by default. | +| **`additionalInformation`** | Object | | Stores additional information, this is customizable by publisher | +| **`algorithm`** | [Algorithm Metadata](#algorithm-metadata) | **✓** (for algorithm assets only) | Information about asset of `type` `algorithm` | Example: @@ -135,20 +136,56 @@ The `container` object has the following attributes defining the Docker image th | **`tag`** | `string` | **✓** | Tag of the Docker image. | | **`checksum`** | `string` | **✓** | Checksum of the Docker image. | +### Files + +The `files` section contains a `file` object (that contains a list of `file` objects) and a `encryptedFiles` string which contains the encrypted urls + +Each `file` object has the following attributes, with the details necessary to consume and validate the data. + +| Attribute | Required | Description | +| -------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **`contentType`** | **✓** | File format. | +| **`url`** | Local | Content URL. Omitted from the remote metadata. Supports `http(s)://` and `ipfs://` URLs. | +| **`name`** | | File name. | +| **`checksum`** | | Checksum of the file using your preferred format (i.e. MD5). Format specified in `checksumType`. If it's not provided can't be validated if the file was not modified after registering. | +| **`checksumType`** | | Format of the provided checksum. Can vary according to server (i.e Amazon vs. Azure) | +| **`contentLength`** | | Size of the file in bytes. | +| **`encoding`** | | File encoding (e.g. UTF-8). | +| **`compression`** | | File compression (e.g. no, gzip, bzip2, etc). | +| **`encrypted`** | | Boolean. Is the file encrypted? If is not set is assumed the file is not encrypted | +| **`encryptionMode`** | | Encryption mode used. Just valid if `encrypted=true` | +| **`resourceId`** | | Remote identifier of the file in the external provider. It is typically the remote id in the cloud provider. | +| **`attributes`** | | Key-Value hash map with additional attributes describing the asset file. It could include details like the Amazon S3 bucket, region, etc. | + +Example: + +```json +{ + "files": { + "files": [ + { + "url": "https://demo.com/file.csv" + } + ], + "encryptedFiles": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735" + } +} +``` + ### Services Services define the access to the asset. -| Attribute | Type | Required | Description | -| ---------------------- | --------------------- | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | -| **`type`** | Text | **✓** | Type of service (`access`, `compute`, `wss`, etc. | -| **`name`** | Text | | Service friendly name | -| **`description`** | Text | | Service description | -| **`datatokenAddress`** | Text | **✓** | Datatoken address | -| **`providerEndpoint`** | Text | **✓** | Provider URI | -| **`timeout`** | Number | **✓** | describing how long the service can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds. | -| **`files`** | Array of files object | **✓** | Array of `File` objects for publishing. These will be transformed to `encryptedFiles` during publish process. See [Files](#files) | -| **`privacy`** | Object | **✓** (for compute assets only) | If asset is of compute `type`, holds information about the compute-related privacy settings. | +| Attribute | Type | Required | Description | +| ---------------------- | --------------------------- | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | +| **`type`** | `string` | **✓** | Type of service (`access`, `compute`, `wss`, etc. | +| **`name`** | `string` | | Service friendly name | +| **`description`** | `string` | | Service description | +| **`datatokenAddress`** | `string` | **✓** | Datatoken address | +| **`providerEndpoint`** | `string` | **✓** | Provider endpoint URI (URI + path) | +| **`timeout`** | `number` | **✓** | describing how long the service can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds. | +| **`files`** | Array of [Files](#files) | **✓** | Array of [Files](#files) objects for publishing. These will be transformed to `encryptedFiles` during publish process. | +| **`privacy`** | [Privacy](#compute-privacy) | **✓** (for compute assets only) | If asset service is of `type` `compute`, holds information about the compute-related privacy settings. | #### Compute Privacy @@ -226,42 +263,6 @@ Example: } ``` -### Files - -The `files` section contains a `file` object (that contains a list of `file` objects) and a `encryptedFiles` string which contains the encrypted urls - -Each `file` object has the following attributes, with the details necessary to consume and validate the data. - -| Attribute | Required | Description | -| -------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`contentType`** | **✓** | File format. | -| **`url`** | Local | Content URL. Omitted from the remote metadata. Supports `http(s)://` and `ipfs://` URLs. | -| **`name`** | | File name. | -| **`checksum`** | | Checksum of the file using your preferred format (i.e. MD5). Format specified in `checksumType`. If it's not provided can't be validated if the file was not modified after registering. | -| **`checksumType`** | | Format of the provided checksum. Can vary according to server (i.e Amazon vs. Azure) | -| **`contentLength`** | | Size of the file in bytes. | -| **`encoding`** | | File encoding (e.g. UTF-8). | -| **`compression`** | | File compression (e.g. no, gzip, bzip2, etc). | -| **`encrypted`** | | Boolean. Is the file encrypted? If is not set is assumed the file is not encrypted | -| **`encryptionMode`** | | Encryption mode used. Just valid if `encrypted=true` | -| **`resourceId`** | | Remote identifier of the file in the external provider. It is typically the remote id in the cloud provider. | -| **`attributes`** | | Key-Value hash map with additional attributes describing the asset file. It could include details like the Amazon S3 bucket, region, etc. | - -Example: - -```json -{ - "files": { - "files": [ - { - "url": "https://demo.com/file.csv" - } - ], - "encryptedFiles": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735" - } -} -``` - ### Credentials By default, a consumer can access a resource if they have 1.0 datatokens. _Credentials_ allow the publisher to optionally specify finer-grained permissions. @@ -318,26 +319,26 @@ The hash is used when publishing/update metadata using `setMetaData` function in ```solidity event MetadataCreated( - address indexed createdBy, - uint8 state, - string decryptorUrl, - bytes flags, - bytes data, - bytes metaDataHash, - uint256 timestamp, - uint256 blockNumber - ); + address indexed createdBy, + uint8 state, + string decryptorUrl, + bytes flags, + bytes data, + bytes metaDataHash, + uint256 timestamp, + uint256 blockNumber +); event MetadataUpdated( - address indexed updatedBy, - uint8 state, - string decryptorUrl, - bytes flags, - bytes data, - bytes metaDataHash, - uint256 timestamp, - uint256 blockNumber - ); + address indexed updatedBy, + uint8 state, + string decryptorUrl, + bytes flags, + bytes data, + bytes metaDataHash, + uint256 timestamp, + uint256 blockNumber +); ``` _Aquarius_ should always check the hash after data is decrypted via a _Provider_ API call, in order to ensure DDO integrity. From 34c3bcb4aa9460f42cd3d30caaf4b0ffa65f876d Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 14:40:12 +0100 Subject: [PATCH 033/145] sidebar reordering --- data/sidebars/concepts.yml | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/data/sidebars/concepts.yml b/data/sidebars/concepts.yml index 0bb7fecc..15839c67 100644 --- a/data/sidebars/concepts.yml +++ b/data/sidebars/concepts.yml @@ -6,27 +6,20 @@ link: /concepts/quickstart/ - title: Architecture Overview link: /concepts/architecture/ + - title: DIDs & DDOs + link: /concepts/did-ddo/ - title: Supported Networks link: /concepts/networks/ - - title: Deployments - link: /concepts/deployments/ - - title: Projects using Ocean - link: /concepts/projects-using-ocean/ - group: Compute-to-Data items: - - title: Compute-to-Data Overview + - title: Overview link: /concepts/compute-to-data/ -- group: Specifying Assets - items: - - title: DIDs & DDOs - link: /concepts/did-ddo/ - - title: DDO Metadata - link: /concepts/ddo-metadata/ - - group: Contribute items: + - title: Projects using Ocean + link: /concepts/projects-using-ocean/ - title: Ways to Contribute link: /concepts/contributing/ - title: Get Funding From cc150422c2076b732ab1040255c6e4e8c290507a Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 14:41:24 +0100 Subject: [PATCH 034/145] remove `event.chainId` --- content/concepts/did-ddo.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index f63208d7..fd5e1677 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -418,8 +418,7 @@ Example: "blockNo": 12831214, "from": "0xAcca11dbeD4F863Bb3bC2336D3CE5BAC52aa1f83", "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf", - "update": false, - "chainId": 1 + "update": false } ] } From c949a70ee9e336612c5e7db6a3ece94ecb9cb075 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 14:52:44 +0100 Subject: [PATCH 035/145] suggest `ddo.files` & `ddo.encryptedFiles` --- content/concepts/did-ddo.md | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index fd5e1677..40484d38 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -459,14 +459,12 @@ Example: "author": "OPF", "license": "https://market.oceanprotocol.com/terms" }, - "files": { - "files": [ - { - "url": "https://demo.com/file.csv" - } - ], - "encryptedFiles": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735" - }, + "files": [ + { + "url": "https://demo.com/file.csv" + } + ], + "encryptedFiles": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", "services": [ { "type": "access", From 37bba3244dfc040ff3b3d87445dcf44edb275d42 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 15:02:31 +0100 Subject: [PATCH 036/145] files example updates --- content/concepts/did-ddo.md | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 40484d38..7daf6320 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -138,13 +138,13 @@ The `container` object has the following attributes defining the Docker image th ### Files -The `files` section contains a `file` object (that contains a list of `file` objects) and a `encryptedFiles` string which contains the encrypted urls +The `ddo.files` array contains a `file` object which needs to be present when publishing a new asset. This then gets removed and transformed into an `ddo.encryptedFiles` string which contains the encrypted urls. Each `file` object has the following attributes, with the details necessary to consume and validate the data. | Attribute | Required | Description | | -------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`contentType`** | **✓** | File format. | +| **`contentType`** | **✓** | File MIME type. | | **`url`** | Local | Content URL. Omitted from the remote metadata. Supports `http(s)://` and `ipfs://` URLs. | | **`name`** | | File name. | | **`checksum`** | | Checksum of the file using your preferred format (i.e. MD5). Format specified in `checksumType`. If it's not provided can't be validated if the file was not modified after registering. | @@ -161,14 +161,12 @@ Example: ```json { - "files": { - "files": [ - { - "url": "https://demo.com/file.csv" - } - ], - "encryptedFiles": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735" - } + "files": [ + { + "url": "https://demo.com/file.csv" + } + ], + "encryptedFiles": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735" } ``` @@ -459,11 +457,15 @@ Example: "author": "OPF", "license": "https://market.oceanprotocol.com/terms" }, + + // Never in response, only for publishing "files": [ { "url": "https://demo.com/file.csv" } ], + + // Created automatically after publishing, and `files` gets removed. "encryptedFiles": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", "services": [ { From cb831cb439d7a6b132538f3f08487e0a4cbf2361 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 17:22:18 +0100 Subject: [PATCH 037/145] remove all the file things --- content/concepts/did-ddo.md | 84 ++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 7daf6320..fee399d4 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -97,8 +97,8 @@ This object holds information describing the actual actual asset. | **`author`** | `string` | **✓** | Name of the entity generating this data (e.g. Tfl, Disney Corp, etc.). | | **`license`** | `string` | **✓** | Short name referencing the license of the asset (e.g. Public Domain, CC-0, CC-BY, No License Specified, etc. ). If it's not specified, the following value will be added: "No License Specified". | | **`links`** | Array of `string` | | Mapping of URL strings for data samples, or links to find out more information. Links may be to either a URL or another asset. | -| **`contentLanguage`** | `string` | | The language of the content. Please use one of the language codes from the [IETF BCP 47 standard](https://tools.ietf.org/html/bcp47) | -| **`categories`** | Array of `string` | | Optional array of categories associated to the asset. Note: recommended to use `"tags"` instead of this. | +| **`contentLanguage`** | `string` | | The language of the content. Use one of the language codes from the [IETF BCP 47 standard](https://tools.ietf.org/html/bcp47) | +| **`categories`** | Array of `string` | | Optional array of categories associated to the asset. Note: recommended to use `tags` instead of this. | | **`tags`** | Array of `string` | | Array of keywords or tags used to describe this content. Empty by default. | | **`additionalInformation`** | Object | | Stores additional information, this is customizable by publisher | | **`algorithm`** | [Algorithm Metadata](#algorithm-metadata) | **✓** (for algorithm assets only) | Information about asset of `type` `algorithm` | @@ -136,37 +136,37 @@ The `container` object has the following attributes defining the Docker image th | **`tag`** | `string` | **✓** | Tag of the Docker image. | | **`checksum`** | `string` | **✓** | Checksum of the Docker image. | +```json +{ + "metadata": { + "description": "Sample description", + "name": "Sample algorithm asset", + "type": "algorithm", + "author": "OPF", + "license": "https://market.oceanprotocol.com/terms", + "algorithm": { + "language": "", + "version": "", + "container": { + "entrypoint": "", + "image": "", + "tag": "", + "checksum": "" + } + } + } +} +``` + ### Files -The `ddo.files` array contains a `file` object which needs to be present when publishing a new asset. This then gets removed and transformed into an `ddo.encryptedFiles` string which contains the encrypted urls. - -Each `file` object has the following attributes, with the details necessary to consume and validate the data. - -| Attribute | Required | Description | -| -------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`contentType`** | **✓** | File MIME type. | -| **`url`** | Local | Content URL. Omitted from the remote metadata. Supports `http(s)://` and `ipfs://` URLs. | -| **`name`** | | File name. | -| **`checksum`** | | Checksum of the file using your preferred format (i.e. MD5). Format specified in `checksumType`. If it's not provided can't be validated if the file was not modified after registering. | -| **`checksumType`** | | Format of the provided checksum. Can vary according to server (i.e Amazon vs. Azure) | -| **`contentLength`** | | Size of the file in bytes. | -| **`encoding`** | | File encoding (e.g. UTF-8). | -| **`compression`** | | File compression (e.g. no, gzip, bzip2, etc). | -| **`encrypted`** | | Boolean. Is the file encrypted? If is not set is assumed the file is not encrypted | -| **`encryptionMode`** | | Encryption mode used. Just valid if `encrypted=true` | -| **`resourceId`** | | Remote identifier of the file in the external provider. It is typically the remote id in the cloud provider. | -| **`attributes`** | | Key-Value hash map with additional attributes describing the asset file. It could include details like the Amazon S3 bucket, region, etc. | +The `ddo.files` field is returned as a string which holds the encrypted file URLs. During the publish process this needs to be encrypted with a respective _Provider_ API call. Example: ```json { - "files": [ - { - "url": "https://demo.com/file.csv" - } - ], - "encryptedFiles": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735" + "files": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735" } ``` @@ -174,27 +174,27 @@ Example: Services define the access to the asset. -| Attribute | Type | Required | Description | -| ---------------------- | --------------------------- | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | -| **`type`** | `string` | **✓** | Type of service (`access`, `compute`, `wss`, etc. | -| **`name`** | `string` | | Service friendly name | -| **`description`** | `string` | | Service description | -| **`datatokenAddress`** | `string` | **✓** | Datatoken address | -| **`providerEndpoint`** | `string` | **✓** | Provider endpoint URI (URI + path) | -| **`timeout`** | `number` | **✓** | describing how long the service can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds. | -| **`files`** | Array of [Files](#files) | **✓** | Array of [Files](#files) objects for publishing. These will be transformed to `encryptedFiles` during publish process. | -| **`privacy`** | [Privacy](#compute-privacy) | **✓** (for compute assets only) | If asset service is of `type` `compute`, holds information about the compute-related privacy settings. | +| Attribute | Type | Required | Description | +| ---------------------- | ----------------------------- | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | +| **`type`** | `string` | **✓** | Type of service (`access`, `compute`, `wss`, etc. | +| **`name`** | `string` | | Service friendly name | +| **`description`** | `string` | | Service description | +| **`datatokenAddress`** | `string` | **✓** | Datatoken address | +| **`providerEndpoint`** | `string` | **✓** | Provider endpoint URI (URI + path) | +| **`timeout`** | `number` | **✓** | describing how long the service can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds. | +| **`files`** | `string`, see [Files](#files) | **✓** | Encrypted file URLs | +| **`privacy`** | [Privacy](#compute-privacy) | **✓** (for compute assets only) | If asset service is of `type` `compute`, holds information about the compute-related privacy settings. | #### Compute Privacy An asset with a service of `type` `compute` has the following additional attributes under the `privacy` object. This object is required if the asset is of `type` `compute`, but can be omitted for `type` of `access`. -| Attribute | Type | Required | Description | -| ------------------------------------------ | ------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------ | -| **`allowRawAlgorithm`** | `boolean` | **✓** | If `true`, a drag & drop algorithm can be run | -| **`allowNetworkAccess`** | `boolean` | **✓** | If `true`, the algorithm job will have network access (still WIP) | -| **`publisherTrustedAlgorithmPublishers `** | Array of `String` | **✓** | If Empty , then any published algo is allowed. Otherwise, only published algorithms by some publishers are allowed | -| **`publisherTrustedAlgorithms `** | Array of `publisherTrustedAlgorithms` | **✓** | If Empty , then any published algo is allowed. (see below) | +| Attribute | Type | Required | Description | +| ------------------------------------------ | ------------------------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------- | +| **`allowRawAlgorithm`** | `boolean` | **✓** | If `true`, a drag & drop algorithm can be run | +| **`allowNetworkAccess`** | `boolean` | **✓** | If `true`, the algorithm job will have network access (still WIP) | +| **`publisherTrustedAlgorithmPublishers `** | Array of `String` | **✓** | If empty, then any published algorithm is allowed. Otherwise, only published algorithms by some publishers are allowed | +| **`publisherTrustedAlgorithms `** | Array of `publisherTrustedAlgorithms` | **✓** | If empty, then any published algorithm is allowed. (see below) | The `publisherTrustedAlgorithms ` is an array of objects with the following structure: From aac4823bc7d5886038323294875596955b3da345 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 17:52:56 +0100 Subject: [PATCH 038/145] example updates --- content/concepts/did-ddo.md | 72 +++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 40 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index fee399d4..a8661060 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -71,22 +71,21 @@ It follows [the generic DID scheme](https://w3c-ccg.github.io/did-spec/#the-gene A DDO in Ocean has these required attributes: -| Attribute | Type | Description | -| -------------------- | --------------------------- | ---------------------------------------------------------------------------------------------- | -| **`@context`** | Array of `string` | Contexts used for validation. | -| **`id`** | `string` | Computed as `sha256(address of ERC721 contract + chainId)`. | -| **`version`** | `string` | Version information referring to this DDO spec version, like `4.0.0`. | -| **`chainId`** | `number` | Stores chainId of the network the DDO was published to. | -| **`created`** | `ISO Date Time string` | Contains the date of publishing in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | -| **`updated`** | `ISO Date Time string` | Contains the the date of last update in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | -| **`services`** | [Services](#services) | Stores an array of services defining access to the asset. | -| **`files`** | [Files](#files) | Stores information about the asset's files. | -| **`encryptedFiles`** | [Files](#files) | Added after publishing. | -| **`credentials`** | [Credentials](#credentials) | Describes the credentials needed to access a dataset in addition to the `services` definition. | +| Attribute | Type | Description | +| ----------------- | --------------------------- | ---------------------------------------------------------------------------------------------- | +| **`@context`** | Array of `string` | Contexts used for validation. | +| **`id`** | `string` | Computed as `sha256(address of ERC721 contract + chainId)`. | +| **`version`** | `string` | Version information referring to this DDO spec version, like `4.0.0`. | +| **`chainId`** | `number` | Stores chainId of the network the DDO was published to. | +| **`created`** | `ISO Date Time string` | Contains the date of publishing in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | +| **`updated`** | `ISO Date Time string` | Contains the the date of last update in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | +| **`services`** | [Services](#services) | Stores an array of services defining access to the asset. | +| **`files`** | [Files](#files) | Encrypted file URLs | +| **`credentials`** | [Credentials](#credentials) | Describes the credentials needed to access a dataset in addition to the `services` definition. | ### Metadata -This object holds information describing the actual actual asset. +This object holds information describing the actual asset. | Attribute | Type | Required | Description | | --------------------------- | ----------------------------------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -123,7 +122,7 @@ An asset of type `algorithm` has the following additional attributes under `algo | Attribute | Type | Required | Description | | --------------- | ----------- | -------- | ------------------------------------------------------- | -| **`language`** | `string` | | Language used to implement the software | +| **`language`** | `string` | | Language used to implement the software. | | **`version`** | `string` | | Version of the software. | | **`container`** | `container` | **✓** | Object describing the Docker container image. See below | @@ -145,13 +144,13 @@ The `container` object has the following attributes defining the Docker image th "author": "OPF", "license": "https://market.oceanprotocol.com/terms", "algorithm": { - "language": "", - "version": "", + "language": "Node.js", + "version": "v1", "container": { - "entrypoint": "", - "image": "", - "tag": "", - "checksum": "" + "entrypoint": "node $ALGO", + "image": "ubuntu", + "tag": "latest", + "checksum": "44e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550" } } } @@ -172,7 +171,9 @@ Example: ### Services -Services define the access to the asset. +Services define the access to the asset, and each service is represented by its respective datatoken. + +An asset should have at least one service to be actually accessible, but can have as many services which make sense for a specific use case. | Attribute | Type | Required | Description | | ---------------------- | ----------------------------- | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | @@ -181,20 +182,20 @@ Services define the access to the asset. | **`description`** | `string` | | Service description | | **`datatokenAddress`** | `string` | **✓** | Datatoken address | | **`providerEndpoint`** | `string` | **✓** | Provider endpoint URI (URI + path) | -| **`timeout`** | `number` | **✓** | describing how long the service can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds. | -| **`files`** | `string`, see [Files](#files) | **✓** | Encrypted file URLs | -| **`privacy`** | [Privacy](#compute-privacy) | **✓** (for compute assets only) | If asset service is of `type` `compute`, holds information about the compute-related privacy settings. | +| **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds. | +| **`files`** | `string`, see [Files](#files) | **✓** | Encrypted file URLs. | +| **`privacy`** | [Privacy](#compute-privacy) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings. | #### Compute Privacy An asset with a service of `type` `compute` has the following additional attributes under the `privacy` object. This object is required if the asset is of `type` `compute`, but can be omitted for `type` of `access`. -| Attribute | Type | Required | Description | -| ------------------------------------------ | ------------------------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------- | -| **`allowRawAlgorithm`** | `boolean` | **✓** | If `true`, a drag & drop algorithm can be run | -| **`allowNetworkAccess`** | `boolean` | **✓** | If `true`, the algorithm job will have network access (still WIP) | -| **`publisherTrustedAlgorithmPublishers `** | Array of `String` | **✓** | If empty, then any published algorithm is allowed. Otherwise, only published algorithms by some publishers are allowed | -| **`publisherTrustedAlgorithms `** | Array of `publisherTrustedAlgorithms` | **✓** | If empty, then any published algorithm is allowed. (see below) | +| Attribute | Type | Required | Description | +| ------------------------------------------ | ------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **`allowRawAlgorithm`** | `boolean` | **✓** | If `true`, any passed raw text will be allowed to run. Useful for an algorithm drag & drop use case, but increases risk of data escape through malicious user input. Should be `false` by default in all implementations. | +| **`allowNetworkAccess`** | `boolean` | **✓** | If `true`, the algorithm job will have network access (still WIP) | +| **`publisherTrustedAlgorithmPublishers `** | Array of `string` | **✓** | If empty, then any published algorithm is allowed. Otherwise, only published algorithms by some publishers are allowed | +| **`publisherTrustedAlgorithms `** | Array of `publisherTrustedAlgorithms` | **✓** | If empty, then any published algorithm is allowed. (see below) | The `publisherTrustedAlgorithms ` is an array of objects with the following structure: @@ -457,16 +458,7 @@ Example: "author": "OPF", "license": "https://market.oceanprotocol.com/terms" }, - - // Never in response, only for publishing - "files": [ - { - "url": "https://demo.com/file.csv" - } - ], - - // Created automatically after publishing, and `files` gets removed. - "encryptedFiles": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", + "files": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", "services": [ { "type": "access", From a68f1dcee37f82a248c046eb0ab0bb2f52481d15 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 18:15:49 +0100 Subject: [PATCH 039/145] typos, more examples --- content/concepts/did-ddo.md | 57 ++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index a8661060..6f0d2821 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -71,17 +71,17 @@ It follows [the generic DID scheme](https://w3c-ccg.github.io/did-spec/#the-gene A DDO in Ocean has these required attributes: -| Attribute | Type | Description | -| ----------------- | --------------------------- | ---------------------------------------------------------------------------------------------- | -| **`@context`** | Array of `string` | Contexts used for validation. | -| **`id`** | `string` | Computed as `sha256(address of ERC721 contract + chainId)`. | -| **`version`** | `string` | Version information referring to this DDO spec version, like `4.0.0`. | -| **`chainId`** | `number` | Stores chainId of the network the DDO was published to. | -| **`created`** | `ISO Date Time string` | Contains the date of publishing in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | -| **`updated`** | `ISO Date Time string` | Contains the the date of last update in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | -| **`services`** | [Services](#services) | Stores an array of services defining access to the asset. | -| **`files`** | [Files](#files) | Encrypted file URLs | -| **`credentials`** | [Credentials](#credentials) | Describes the credentials needed to access a dataset in addition to the `services` definition. | +| Attribute | Type | Description | +| ----------------- | --------------------------- | -------------------------------------------------------------------------------------------------------------- | +| **`@context`** | Array of `string` | Contexts used for validation. | +| **`id`** | `string` | Computed as `sha256(address of ERC721 contract + chainId)`. | +| **`version`** | `string` | Version information in [SemVer](https://semver.org) notation referring to this DDO spec version, like `4.0.0`. | +| **`chainId`** | `number` | Stores chainId of the network the DDO was published to. | +| **`created`** | `ISO Date Time string` | Contains the date of publishing in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | +| **`updated`** | `ISO Date Time string` | Contains the the date of last update in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | +| **`services`** | [Services](#services) | Stores an array of services defining access to the asset. | +| **`files`** | [Files](#files) | Encrypted file URLs. | +| **`credentials`** | [Credentials](#credentials) | Describes the credentials needed to access a dataset in addition to the `services` definition. | ### Metadata @@ -268,9 +268,9 @@ By default, a consumer can access a resource if they have 1.0 datatokens. _Crede Consider a medical data use case, where only a credentialed EU researcher can legally access a given dataset. Ocean supports this as follows: a consumer can only access the resource if they have 1.0 datatokens _and_ one of the specified `"allow"` credentials. -This is like going to an R-rated movie, where you can only get in if you show both your movie ticket (datatoken) _and_ some some id showing you're old enough (credential). +This is like going to an R-rated movie, where you can only get in if you show both your movie ticket (datatoken) _and_ some identification showing you're old enough (credential). -Only credentials that can be proven are supported. This includes Ethereum public addresses, and (in the future) [W3C Verifiable Credentials](https://www.w3.org/TR/vc-data-model/) and more. +Only credentials that can be proven are supported. This includes Ethereum public addresses, and in the future [W3C Verifiable Credentials](https://www.w3.org/TR/vc-data-model/) and more. Ocean also supports `"deny"` credentials: if a consumer has any of these credentials, they can not access the resource. @@ -314,7 +314,7 @@ In order to ensure the integrity of the DDO, a hash is computed for each DDO: const hash = sha256(JSON.stringify(DDO)) ``` -The hash is used when publishing/update metadata using `setMetaData` function in the ERC721 contract, and is stored in the event generated by the ERC721 contract: +The hash is used when publishing/update metadata using the `setMetaData` function in the ERC721 contract, and is stored in the event generated by the ERC721 contract: ```solidity event MetadataCreated( @@ -361,12 +361,12 @@ These additional fields are never stored on-chain, and are never taken into cons The `nft` object contains information about the NFT contract which represents the intellectual property of the publisher. -| Attribute | Type | Description | -| ------------- | -------- | --------------------------------------------- | -| **`address`** | `string` | Contract address of the deployed NFT contract | -| **`name`** | `string` | Name of NFT set in contract | -| **`symbol`** | `string` | Symbol of NFT set in contract | -| **`owner`** | `string` | ETH account address of the NFT owner | +| Attribute | Type | Description | +| ------------- | -------- | ---------------------------------------------- | +| **`address`** | `string` | Contract address of the deployed NFT contract. | +| **`name`** | `string` | Name of NFT set in contract. | +| **`symbol`** | `string` | Symbol of NFT set in contract. | +| **`owner`** | `string` | ETH account address of the NFT owner. | Example: @@ -407,17 +407,18 @@ Example: The `events` section contains information about the transactions that created or updated the DDO which can be useful for displaying a metadata history for provenance reasons. +They are ordered in descending order based on the `block` number, where the very last item in the `events` array is the event for the asset creation, and the first item is the latest update event if there has been one. + Example: ```json { "events": [ { - "txid": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", - "blockNo": 12831214, + "tx": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", + "block": 12831214, "from": "0xAcca11dbeD4F863Bb3bC2336D3CE5BAC52aa1f83", - "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf", - "update": false + "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf" } ] } @@ -498,12 +499,10 @@ Example: }, "events": [ { - "txid": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", - "blockNo": 12831214, + "tx": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", + "block": 12831214, "from": "0xAcca11dbeD4F863Bb3bC2336D3CE5BAC52aa1f83", - "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf", - "update": false, - "chainId": 1 + "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf" } ], "stats": { From a505f35add76fc6cc62fc5a0a6d239fb1cfc3a35 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 20:10:21 +0100 Subject: [PATCH 040/145] clarifications, update DDO flow image --- content/concepts/did-ddo.md | 34 ++++++++++++------------ content/concepts/images/DDO_flow.png | Bin 69347 -> 0 bytes content/concepts/images/ddo-content.png | Bin 30654 -> 0 bytes content/concepts/images/ddo-flow.png | Bin 0 -> 104794 bytes 4 files changed, 17 insertions(+), 17 deletions(-) delete mode 100644 content/concepts/images/DDO_flow.png delete mode 100644 content/concepts/images/ddo-content.png create mode 100644 content/concepts/images/ddo-flow.png diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 6f0d2821..104ee774 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -31,7 +31,7 @@ The DDO is stored on-chain as part of the NFT contract and it is stored encrypte Here is the complete flow: -![DDO_flow](images/DDO_flow.png) +![DDO_flow](images/ddo-flow.png) ```text title DDO flow @@ -118,15 +118,15 @@ Example: #### Algorithm Metadata -An asset of type `algorithm` has the following additional attributes under `algorithm` within the `metadata` object: +An asset of type `algorithm` has additional attributes under `metadata.algorithm`, describing the algorithm and the Docker environment it is supposed to be run under. -| Attribute | Type | Required | Description | -| --------------- | ----------- | -------- | ------------------------------------------------------- | -| **`language`** | `string` | | Language used to implement the software. | -| **`version`** | `string` | | Version of the software. | -| **`container`** | `container` | **✓** | Object describing the Docker container image. See below | +| Attribute | Type | Required | Description | +| --------------- | ----------- | -------- | ------------------------------------------------------------------------------------------ | +| **`language`** | `string` | | Language used to implement the software. | +| **`version`** | `string` | | Version of the software preferably in [SemVer](https://semver.org) notation. E.g. `1.0.0`. | +| **`container`** | `container` | **✓** | Object describing the Docker container image. See below | -The `container` object has the following attributes defining the Docker image the algorithm needs to run: +The `container` object has the following attributes defining the Docker image for running the algorithm: | Attribute | Type | Required | Description | | ---------------- | -------- | -------- | ----------------------------------------------------------------- | @@ -145,7 +145,7 @@ The `container` object has the following attributes defining the Docker image th "license": "https://market.oceanprotocol.com/terms", "algorithm": { "language": "Node.js", - "version": "v1", + "version": "1.0.0", "container": { "entrypoint": "node $ALGO", "image": "ubuntu", @@ -171,7 +171,7 @@ Example: ### Services -Services define the access to the asset, and each service is represented by its respective datatoken. +Services define the access for an asset, and each service is represented by its respective datatoken. An asset should have at least one service to be actually accessible, but can have as many services which make sense for a specific use case. @@ -359,14 +359,14 @@ These additional fields are never stored on-chain, and are never taken into cons ### NFT -The `nft` object contains information about the NFT contract which represents the intellectual property of the publisher. +The `nft` object contains information about the ERC721 NFT contract which represents the intellectual property of the publisher. -| Attribute | Type | Description | -| ------------- | -------- | ---------------------------------------------- | -| **`address`** | `string` | Contract address of the deployed NFT contract. | -| **`name`** | `string` | Name of NFT set in contract. | -| **`symbol`** | `string` | Symbol of NFT set in contract. | -| **`owner`** | `string` | ETH account address of the NFT owner. | +| Attribute | Type | Description | +| ------------- | -------- | ----------------------------------------------------- | +| **`address`** | `string` | Contract address of the deployed ERC721 NFT contract. | +| **`name`** | `string` | Name of NFT set in contract. | +| **`symbol`** | `string` | Symbol of NFT set in contract. | +| **`owner`** | `string` | ETH account address of the NFT owner. | Example: diff --git a/content/concepts/images/DDO_flow.png b/content/concepts/images/DDO_flow.png deleted file mode 100644 index f2fe3790f8919567b954fa50c8f0b91b1f3fab42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69347 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

aO6m_%5z9=l25u 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 OAn Date: Fri, 5 Nov 2021 09:44:22 +0100 Subject: [PATCH 041/145] copy fixes --- content/concepts/did-ddo.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 104ee774..7f868712 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -13,7 +13,7 @@ This document describes how Ocean assets follow the DID/DDO specification, such Decentralized identifiers (DIDs) are a type of identifier that enable verifiable, decentralized digital identity. Each DID is associated with a unique entity and DIDs may represent humans, objects, and more. -A DID Document (DDO) is JSON blob that holds information about the DID. Given a DID, a _resolver_ will return the DDO of that DID. +A DID Document (DDO) is a JSON blob that holds information about the DID. Given a DID, a _resolver_ will return the DDO of that DID. If a DID is the index key in a key-value pair, then the DID Document is the value to which the index key points. The combination of a DID and its associated DID Document forms the root record for a decentralized identifier. @@ -79,6 +79,7 @@ A DDO in Ocean has these required attributes: | **`chainId`** | `number` | Stores chainId of the network the DDO was published to. | | **`created`** | `ISO Date Time string` | Contains the date of publishing in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | | **`updated`** | `ISO Date Time string` | Contains the the date of last update in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | +| **`metadata`** | [Metadata](#metadata) | Stores an object describing the asset. | | **`services`** | [Services](#services) | Stores an array of services defining access to the asset. | | **`files`** | [Files](#files) | Encrypted file URLs. | | **`credentials`** | [Credentials](#credentials) | Describes the credentials needed to access a dataset in addition to the `services` definition. | @@ -173,18 +174,17 @@ Example: Services define the access for an asset, and each service is represented by its respective datatoken. -An asset should have at least one service to be actually accessible, but can have as many services which make sense for a specific use case. +An asset should have at least one service to be actually accessible, and can have as many services which make sense for a specific use case. -| Attribute | Type | Required | Description | -| ---------------------- | ----------------------------- | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | -| **`type`** | `string` | **✓** | Type of service (`access`, `compute`, `wss`, etc. | -| **`name`** | `string` | | Service friendly name | -| **`description`** | `string` | | Service description | -| **`datatokenAddress`** | `string` | **✓** | Datatoken address | -| **`providerEndpoint`** | `string` | **✓** | Provider endpoint URI (URI + path) | -| **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds. | -| **`files`** | `string`, see [Files](#files) | **✓** | Encrypted file URLs. | -| **`privacy`** | [Privacy](#compute-privacy) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings. | +| Attribute | Type | Required | Description | +| ---------------------- | --------------------------- | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | +| **`type`** | `string` | **✓** | Type of service (`access`, `compute`, `wss`, etc. | +| **`name`** | `string` | | Service friendly name | +| **`description`** | `string` | | Service description | +| **`datatokenAddress`** | `string` | **✓** | Datatoken address | +| **`providerEndpoint`** | `string` | **✓** | Provider endpoint URI (URI + path) | +| **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds. | +| **`privacy`** | [Privacy](#compute-privacy) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings. | #### Compute Privacy @@ -353,7 +353,7 @@ Each asset has a state, which is held by the NFT contract. The possible states a ## Aquarius Enhanced DDO Response -The following fields are added by _Aquarius_ in its DDO response for convenience reasons where an `Asset` returned by _Aquarius_ inherits the DDO fields from the chain. +The following fields are added by _Aquarius_ in its DDO response for convenience reasons, where an asset returned by _Aquarius_ inherits the DDO fields stored on-chain. These additional fields are never stored on-chain, and are never taken into consideration when [hashing the DDO](#ddo-hash). From 3cb0b63aa9cfe13e6d9b786f7ef2ef8e4d92e9b7 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Fri, 5 Nov 2021 09:01:11 +0000 Subject: [PATCH 042/145] fixes, providerEndpoint -> providerUrl --- content/concepts/did-ddo.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 7f868712..b4577fa5 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -176,15 +176,15 @@ Services define the access for an asset, and each service is represented by its An asset should have at least one service to be actually accessible, and can have as many services which make sense for a specific use case. -| Attribute | Type | Required | Description | -| ---------------------- | --------------------------- | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | -| **`type`** | `string` | **✓** | Type of service (`access`, `compute`, `wss`, etc. | -| **`name`** | `string` | | Service friendly name | -| **`description`** | `string` | | Service description | -| **`datatokenAddress`** | `string` | **✓** | Datatoken address | -| **`providerEndpoint`** | `string` | **✓** | Provider endpoint URI (URI + path) | -| **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds. | -| **`privacy`** | [Privacy](#compute-privacy) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings. | +| Attribute | Type | Required | Description | +| ---------------------- | --------------------------- | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | +| **`type`** | `string` | **✓** | Type of service (`access`, `compute`, `wss`, etc. | +| **`name`** | `string` | | Service friendly name | +| **`description`** | `string` | | Service description | +| **`datatokenAddress`** | `string` | **✓** | Datatoken address | +| **`providerUrl`** | `string` | **✓** | Provider URL (schema + host) | +| **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of `0` represents no time limit. Expressed in seconds. | +| **`privacy`** | [Privacy](#compute-privacy) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings. | #### Compute Privacy @@ -193,7 +193,7 @@ An asset with a service of `type` `compute` has the following additional attribu | Attribute | Type | Required | Description | | ------------------------------------------ | ------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **`allowRawAlgorithm`** | `boolean` | **✓** | If `true`, any passed raw text will be allowed to run. Useful for an algorithm drag & drop use case, but increases risk of data escape through malicious user input. Should be `false` by default in all implementations. | -| **`allowNetworkAccess`** | `boolean` | **✓** | If `true`, the algorithm job will have network access (still WIP) | +| **`allowNetworkAccess`** | `boolean` | **✓** | If `true`, the algorithm job will have network access. | | **`publisherTrustedAlgorithmPublishers `** | Array of `string` | **✓** | If empty, then any published algorithm is allowed. Otherwise, only published algorithms by some publishers are allowed | | **`publisherTrustedAlgorithms `** | Array of `publisherTrustedAlgorithms` | **✓** | If empty, then any published algorithm is allowed. (see below) | @@ -230,7 +230,7 @@ Example: "name": "Download service", "description": "Download service", "datatokenAddress": "0x123", - "providerEndpoint": "https://myprovider", + "providerUrl": "https://myprovider.com", "timeout": 0 }, { @@ -238,7 +238,7 @@ Example: "name": "Compute service", "description": "Compute service", "datatokenAddress": "0x124", - "providerEndpoint": "https://myprovider", + "providerUrl": "https://myprovider.com", "timeout": 0, "privacy": { "allowRawAlgorithm": false, @@ -466,7 +466,7 @@ Example: "name": "Download service", "description": "Download service", "datatokenAddress": "0x123", - "providerEndpoint": "https://myprovider.com", + "providerUrl": "https://myprovider.com", "timeout": 0 } ], From 37125600a511c2b41893e8a16da920a0eb4fc9b6 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Tue, 9 Nov 2021 09:41:05 +0000 Subject: [PATCH 043/145] consolidate & rewrite NFT docs --- content/concepts/nft.md | 37 +++++++++++++++++++++++-------------- content/concepts/roles.md | 25 ------------------------- data/sidebars/concepts.yml | 4 +--- 3 files changed, 24 insertions(+), 42 deletions(-) delete mode 100644 content/concepts/roles.md diff --git a/content/concepts/nft.md b/content/concepts/nft.md index 56afa38a..0cea874a 100644 --- a/content/concepts/nft.md +++ b/content/concepts/nft.md @@ -1,40 +1,49 @@ --- -title: v4 NFT introduction -description: The page describes NFT, IP and sub-licensing using Ocean Protocol's contracts, and use case. +title: Data NFTs +description: Ocean Protocol uses ERC721 NFTs to represent the intellectual property (IP) of published datasets or algorithms, and to further sub-license access to it with user roles or ERC20 data tokens. --- -## NFTS - -A non-fungible token stored on the blockchain represents a unique asset. NFTs can represent images, videos, digital art, or any piece of information. NFTs can be traded and allow transfer of ownership and copyright. [EIP-721](https://eips.ethereum.org/EIPS/eip-721) defines an interface for handling NFTs on Ethereum blockchain. The creator of the NFT can deploy a new contract on Ethereum or any Blockchain supporting NFT related interface and also, transfer the ownership through the transaction(s). +A non-fungible token stored on the blockchain represents a unique asset. NFTs can represent images, videos, digital art, or any piece of information. NFTs can be traded and allow transfer of ownership and copyright. [EIP-721](https://eips.ethereum.org/EIPS/eip-721) defines an interface for handling NFTs on Ethereum blockchain. The creator of the NFT can deploy a new contract on Ethereum or any Blockchain supporting NFT related interface and also, transfer the ownership through transfer transactions. ## Terminology - **Base IP** means the artifact being copyrighted. Represented by the {ERC721 address, tokenId} from the publish transactions. - - **Base IP holder** means the holder of the Base IP. Represented as the the actor that did the initial "publish" action. - - **Sub-licensee** is the holder of the sub-license. Represented as the entity that controls address ERC721.\_owners[tokenId=x]. - - **To Publish**: Claim copyright or exclusive base license - - **To Sub-license**:Transfer one (of many) sub-licenses to new licensee: ERC20.transfer(to=licensee, value=1.0) -## Supporting NFT using Ocean Protocol +## Supporting NFTs using Ocean Protocol -Ocean Protocol defines [ERC721Factory](https://github.com/oceanprotocol/contracts/blob/v4main/contracts/ERC721Factory.sol) contract, allowing **Base IP holders** to create their ERC721 contract instances on any supported networks. The deployed contract stores Metadata, ownership, sub-license information, permissions. The creator of the contract can also create and mint ERC20 token instances for sub-licensing the **Base IP**. +Ocean Protocol defines the [ERC721Factory](https://github.com/oceanprotocol/contracts/blob/v4main/contracts/ERC721Factory.sol) contract, allowing **Base IP holders** to create their ERC721 contract instances on any supported networks. The deployed contract stores Metadata, ownership, sub-license information, permissions. The creator of the contract can also create and mint ERC20 token instances for sub-licensing the **Base IP**. -## Sub licensing the Base IP +## Sub-licensing the Base IP ERC721 tokens are non-fungible, thus cannot be used for automatic price discovery like ERC20 tokens. ERC721 and ERC20 combined together can be used for sub-licensing. Ocean Protocol's [ERC721Template](https://github.com/oceanprotocol/contracts/blob/v4main/contracts/templates/ERC721Template.sol) solves this problem by using ERC721 for tokenizing the **Base IP** and tokenizing sub-licenses by using ERC20. Thus, sub-licenses can be traded on any AMM as the underlying contract is ERC20 compliant. +## Roles + +[ERC721Template](https://github.com/oceanprotocol/contracts/blob/v4Hardhat/contracts/templates/ERC721Template.sol) contract defines following roles: + +### NFT Owner + +- NFT Owner is the publisher. I.e. Owner is a public address which transacted with `ERC721Factory` contract and deployed a new `ERC721` contract. +- NFT Owner can assign managers while deploying the contract. +- NFT Owner is also added to the Managers. +- NFT Owner can add/remove Managers. +- Clean all permissions + +### Manager + +- A public address with a `Magner` role can update the metadata +- Can deploy new ERC20 contract which is associtated with the `ERC721` contract. ## Use case 1 - + Alice is the creator of a painting and wants to make sure that the ownership of her artwork is uniquely determined. She performs the **Publish** action. She creates an ERC721 token which represents the ownership of the physical asset. Here, **Base IP** is Alice's artwork. **Base IP holder** is Alice. Now, Alice wants to transfer the ownership of her Artwork to Bob. So, Alice makes Bob's address as owner of the token in the discussion by sending a Blockchain transaction. ![Image 1](images/use-case-1.PNG) - ## Use case 2 Alice is the author of a book. Alice wants to hold the copyright of her work but, allows others to read her book. So, She creates 2 versions of her book namely: digital copy, physical copy. She assigns Bob as one of the holder of digital edition of the book. Here, **Base IP** is the book. **Base IP holder** is Alice and Bob is **Sub-licensee** for a digital edition of the book. Alice tokenizes her work by performing **Publish** action i.e _ERC721.safeMint(to=aliceWalletAddress, tokenid=1)_. Alice also creates sub-licenses of her book by creating two ERC20 tokens and transfers the digital copy token to Bob's wallet. diff --git a/content/concepts/roles.md b/content/concepts/roles.md deleted file mode 100644 index dfe547cb..00000000 --- a/content/concepts/roles.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: v4 roles and permissions -description: The page describes the roles and permissions present in ERC721Template contract. ---- - -## Roles - -[ERC721Template](https://github.com/oceanprotocol/contracts/blob/v4Hardhat/contracts/templates/ERC721Template.sol) contract defines following roles: - -- NFT Owner -- Manager - -## NFT Owner - -- NFT Owner is the publisher. I.e. Owner is a public address which transacted with `ERC721Factory` contract and deployed a new `ERC721` contract. - -- NFT Owner can assign managers while deploying the contract. -- NFT Owner is also added to the Managers. -- NFT Owner can add/remove Managers. -- Clean all permissions - -## Manager - -- A public address with a `Magner` role can update the metadata -- Can deploy new ERC20 contract which is associtated with the `ERC721` contract. diff --git a/data/sidebars/concepts.yml b/data/sidebars/concepts.yml index 0edff29b..c90edef4 100644 --- a/data/sidebars/concepts.yml +++ b/data/sidebars/concepts.yml @@ -6,10 +6,8 @@ link: /concepts/quickstart/ - title: Architecture Overview link: /concepts/architecture/ - - title: NFTs + - title: Data NFTs link: /concepts/nft/ - - title: Roles - link: /concepts/roles/ - title: Supported Networks link: /concepts/networks/ - title: Deployments From a87ec6fb34c1ce45f54290a95fc26a9c7fcca6eb Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Wed, 10 Nov 2021 05:41:45 -0800 Subject: [PATCH 044/145] more refactor --- content/concepts/did-ddo.md | 56 ++++++++++++++++++++++++++----------- 1 file changed, 39 insertions(+), 17 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index b4577fa5..fee6670e 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -15,8 +15,6 @@ Decentralized identifiers (DIDs) are a type of identifier that enable verifiable A DID Document (DDO) is a JSON blob that holds information about the DID. Given a DID, a _resolver_ will return the DDO of that DID. -If a DID is the index key in a key-value pair, then the DID Document is the value to which the index key points. The combination of a DID and its associated DID Document forms the root record for a decentralized identifier. - ## Rules for DIDs & DDOs An _asset_ in Ocean represents a downloadable file, compute service, or similar. Each asset is a _resource_ under control of a _publisher_. The Ocean network itself does _not_ store the actual resource (e.g. files). @@ -81,7 +79,6 @@ A DDO in Ocean has these required attributes: | **`updated`** | `ISO Date Time string` | Contains the the date of last update in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | | **`metadata`** | [Metadata](#metadata) | Stores an object describing the asset. | | **`services`** | [Services](#services) | Stores an array of services defining access to the asset. | -| **`files`** | [Files](#files) | Encrypted file URLs. | | **`credentials`** | [Credentials](#credentials) | Describes the credentials needed to access a dataset in addition to the `services` definition. | ### Metadata @@ -158,9 +155,27 @@ The `container` object has the following attributes defining the Docker image fo } ``` +### Services + +Services define the access for an asset, and each service is represented by its respective datatoken. + +An asset should have at least one service to be actually accessible, and can have as many services which make sense for a specific use case. + +| Attribute | Type | Required | Description | +| ---------------------- | --------------------------- | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | +| **`id`** | `string` | **✓** | Unique ID | +| **`type`** | `string` | **✓** | Type of service (`access`, `compute`, `wss`, etc. | +| **`name`** | `string` | | Service friendly name | +| **`description`** | `string` | | Service description | +| **`datatokenAddress`** | `string` | **✓** | Datatoken address | +| **`serviceEndpoint`** | `string` | **✓** | Provider URL (schema + host) | +| **`files`** | [Files](#files) | **/** | Encrypted file URLs. | +| **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of `0` represents no time limit. Expressed in seconds. | +| **`privacy`** | [Privacy](#compute-privacy) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings. | + ### Files -The `ddo.files` field is returned as a string which holds the encrypted file URLs. During the publish process this needs to be encrypted with a respective _Provider_ API call. +The `files` field is returned as a string which holds the encrypted file URLs. Example: @@ -170,21 +185,28 @@ Example: } ``` -### Services +During the publish process this needs to be encrypted with a respective _Provider_ API call. (Sending an array of strings) -Services define the access for an asset, and each service is represented by its respective datatoken. +```json +[ + "url1", + "url2" +] +``` -An asset should have at least one service to be actually accessible, and can have as many services which make sense for a specific use case. +In order to get the files information, you should call the fileinfo endpoint of __Provider__ , provide the DID/or DDO/or encrypted string, and you will get an array of file informations: +```json +[{ + "contentLength":100, + "contentType":"application/json" +}, +{ + "contentLength":130, + "contentType":"application/text" +} +] +``` -| Attribute | Type | Required | Description | -| ---------------------- | --------------------------- | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | -| **`type`** | `string` | **✓** | Type of service (`access`, `compute`, `wss`, etc. | -| **`name`** | `string` | | Service friendly name | -| **`description`** | `string` | | Service description | -| **`datatokenAddress`** | `string` | **✓** | Datatoken address | -| **`providerUrl`** | `string` | **✓** | Provider URL (schema + host) | -| **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of `0` represents no time limit. Expressed in seconds. | -| **`privacy`** | [Privacy](#compute-privacy) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings. | #### Compute Privacy @@ -202,7 +224,7 @@ The `publisherTrustedAlgorithms ` is an array of objects with the following stru | Attribute | Type | Required | Description | | ------------------------------ | -------- | -------- | ------------------------------------------------------------------ | | **`did`** | `string` | **✓** | The DID of the algorithm which is trusted by the publisher. | -| **`filesChecksum`** | `string` | **✓** | Hash of algorithm's `encryptedFiles` + `files` section (as string) | +| **`filesChecksum`** | `string` | **✓** | Hash of algorithm's `files` section (as string) | | **`containerSectionChecksum`** | `string` | **✓** | Hash of the algorithm `container` section (as string) | To produce `filesChecksum`: From a0136db86ce17c7a4cc45b5262b867cddad135e5 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Wed, 10 Nov 2021 05:49:12 -0800 Subject: [PATCH 045/145] add state 4 --- content/concepts/did-ddo.md | 1 + 1 file changed, 1 insertion(+) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index fee6670e..a174e383 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -372,6 +372,7 @@ Each asset has a state, which is held by the NFT contract. The possible states a - `1` = end-of-life - `2` = deprecated (by another asset) - `3` = revoked by publisher +- `4` = temporary disabled ## Aquarius Enhanced DDO Response From 813bd454b964fa8764eb6bf71c7306e2850a9fb0 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Wed, 10 Nov 2021 06:26:43 -0800 Subject: [PATCH 046/145] update with market typings --- content/concepts/did-ddo.md | 75 ++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 35 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index a174e383..1dd46c62 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -195,6 +195,7 @@ During the publish process this needs to be encrypted with a respective _Provide ``` In order to get the files information, you should call the fileinfo endpoint of __Provider__ , provide the DID/or DDO/or encrypted string, and you will get an array of file informations: + ```json [{ "contentLength":100, @@ -390,6 +391,7 @@ The `nft` object contains information about the ERC721 NFT contract which repres | **`name`** | `string` | Name of NFT set in contract. | | **`symbol`** | `string` | Symbol of NFT set in contract. | | **`owner`** | `string` | ETH account address of the NFT owner. | +| **`state`** | `number` | State of the asset reflecting the NFT contract value. See [State](#state) | Example: @@ -399,44 +401,52 @@ Example: "adddress": "0x000000", "name": "Ocean Protocol Asset v4", "symbol": "OCEAN-A-v4", - "owner": "0x0000000" + "owner": "0x0000000", + "state": 0 } } ``` -### Status +### DataTokens -The `status` object contains attributes for marketplaces to implement various visibility states for an asset. +The `datatokens` object contains information about the ERC20 datatokens. -| Attribute | Type | Description | -| --------------------- | --------- | ------------------------------------------------------------------------- | -| **`state`** | `number` | State of the asset reflecting the NFT contract value. See [State](#state) | -| **`isListed`** | `boolean` | If this asset should be displayed | -| **`isOrderDisabled`** | `boolean` | If this asset has ordering disabled | +| Attribute | Type | Description | +| ------------- | -------- | ----------------------------------------------------- | +| **`address`** | `string` | Contract address of the deployed ERC721 NFT contract. | +| **`name`** | `string` | Name of NFT set in contract. | +| **`symbol`** | `string` | Symbol of NFT set in contract. | +| **`serviceId`** | `string` | ServiceID | +Example: + +```json +{ + "datatokens": [ + { + "adddress": "0x000000", + "name": "Ocean Protocol Asset v4", + "symbol": "OCEAN-A-v4", + "serviceId": "1" + }, + { + "adddress": "0x000001", + "name": "Ocean Protocol Asset v4", + "symbol": "OCEAN-A-v4", + "serviceId": "2" + }, + ] +} +``` + +### Event + +The `event` section contains information about the last transaction that created or updated the DDO. Example: ```json { - "status": { - "state": 0, - "isListed": true, - "isOrderDisabled": false - } -} -``` - -### Events - -The `events` section contains information about the transactions that created or updated the DDO which can be useful for displaying a metadata history for provenance reasons. - -They are ordered in descending order based on the `block` number, where the very last item in the `events` array is the event for the asset creation, and the first item is the latest update event if there has been one. - -Example: - -```json -{ - "events": [ + "event": [ { "tx": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", "block": 12831214, @@ -513,21 +523,16 @@ Example: "adddress": "0x000000", "name": "Ocean Protocol Asset v4", "symbol": "OCEAN-A-v4", - "owner": "0x0000000" - }, - "status": { + "owner": "0x0000000", "state": 0, - "isListed": true, - "isOrderDisabled": false }, - "events": [ + "event": { "tx": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", "block": 12831214, "from": "0xAcca11dbeD4F863Bb3bC2336D3CE5BAC52aa1f83", "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf" - } - ], + }, "stats": { "consumes": 4 } From 6f02648d58b2c4df3002cd22a9ba1d11039c160f Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Wed, 10 Nov 2021 06:37:50 -0800 Subject: [PATCH 047/145] make state 4 clearer --- content/concepts/did-ddo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 1dd46c62..aed72588 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -373,7 +373,7 @@ Each asset has a state, which is held by the NFT contract. The possible states a - `1` = end-of-life - `2` = deprecated (by another asset) - `3` = revoked by publisher -- `4` = temporary disabled +- `4` = ordering is temporary disabled ## Aquarius Enhanced DDO Response From 93ecc527fb0dffee0b1095d2cd386261f969b6fe Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Wed, 10 Nov 2021 16:33:59 +0000 Subject: [PATCH 048/145] copywriting, update examples --- content/concepts/did-ddo.md | 165 +++++++++++++++++++----------------- 1 file changed, 88 insertions(+), 77 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index aed72588..26076422 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -163,19 +163,19 @@ An asset should have at least one service to be actually accessible, and can hav | Attribute | Type | Required | Description | | ---------------------- | --------------------------- | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | -| **`id`** | `string` | **✓** | Unique ID | +| **`id`** | `string` | **✓** | Unique ID | | **`type`** | `string` | **✓** | Type of service (`access`, `compute`, `wss`, etc. | | **`name`** | `string` | | Service friendly name | | **`description`** | `string` | | Service description | | **`datatokenAddress`** | `string` | **✓** | Datatoken address | -| **`serviceEndpoint`** | `string` | **✓** | Provider URL (schema + host) | -| **`files`** | [Files](#files) | **/** | Encrypted file URLs. | +| **`serviceEndpoint`** | `string` | **✓** | Provider URL (schema + host) | +| **`files`** | [Files](#files) | **/** | Encrypted file URLs. | | **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of `0` represents no time limit. Expressed in seconds. | | **`privacy`** | [Privacy](#compute-privacy) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings. | -### Files +#### Files -The `files` field is returned as a string which holds the encrypted file URLs. +The `files` field is returned as a string which holds the encrypted file URLs. Example: @@ -185,30 +185,27 @@ Example: } ``` -During the publish process this needs to be encrypted with a respective _Provider_ API call. (Sending an array of strings) +During the publish process file URLs need to be encrypted with a respective _Provider_ API call before storing the DDO on-chain. For this an array of strings with one or multiple URLs is what gets encrypted: + +```json +["https://url.com/file1.csv", "https://url.com/file2.csv"] +``` + +To get information about the files after encryption, the `/fileinfo` endpoint of _Provider_ must return based on passed DID: ```json [ - "url1", - "url2" + { + "contentLength": 100, + "contentType": "application/json" + }, + { + "contentLength": 130, + "contentType": "application/text" + } ] ``` -In order to get the files information, you should call the fileinfo endpoint of __Provider__ , provide the DID/or DDO/or encrypted string, and you will get an array of file informations: - -```json -[{ - "contentLength":100, - "contentType":"application/json" -}, -{ - "contentLength":130, - "contentType":"application/text" -} -] -``` - - #### Compute Privacy An asset with a service of `type` `compute` has the following additional attributes under the `privacy` object. This object is required if the asset is of `type` `compute`, but can be omitted for `type` of `access`. @@ -222,19 +219,16 @@ An asset with a service of `type` `compute` has the following additional attribu The `publisherTrustedAlgorithms ` is an array of objects with the following structure: -| Attribute | Type | Required | Description | -| ------------------------------ | -------- | -------- | ------------------------------------------------------------------ | -| **`did`** | `string` | **✓** | The DID of the algorithm which is trusted by the publisher. | -| **`filesChecksum`** | `string` | **✓** | Hash of algorithm's `files` section (as string) | -| **`containerSectionChecksum`** | `string` | **✓** | Hash of the algorithm `container` section (as string) | +| Attribute | Type | Required | Description | +| ------------------------------ | -------- | -------- | ------------------------------------------------------------------------ | +| **`did`** | `string` | **✓** | The DID of the algorithm which is trusted by the publisher. | +| **`filesChecksum`** | `string` | **✓** | Hash of algorithm's `files` section (as `string`) | +| **`containerSectionChecksum`** | `string` | **✓** | Hash of algorithm's `metadata.algorithm.container` section (as `string`) | To produce `filesChecksum`: ```js -sha256( - algorithm_ddo.metadata.encryptedFiles + - JSON.Stringify(algorithm_ddo.metadata.files) -) +sha256(JSON.Stringify(algorithm_ddo.services[0].files)) ``` To produce `containerSectionChecksum`: @@ -253,7 +247,7 @@ Example: "name": "Download service", "description": "Download service", "datatokenAddress": "0x123", - "providerUrl": "https://myprovider.com", + "serviceEndpoint": "https://myprovider.com", "timeout": 0 }, { @@ -261,7 +255,7 @@ Example: "name": "Compute service", "description": "Compute service", "datatokenAddress": "0x124", - "providerUrl": "https://myprovider.com", + "serviceEndpoint": "https://myprovider.com", "timeout": 0, "privacy": { "allowRawAlgorithm": false, @@ -334,7 +328,7 @@ Example: In order to ensure the integrity of the DDO, a hash is computed for each DDO: ```js -const hash = sha256(JSON.stringify(DDO)) +const hash = sha256(JSON.stringify(ddo)) ``` The hash is used when publishing/update metadata using the `setMetaData` function in the ERC721 contract, and is stored in the event generated by the ERC721 contract: @@ -369,11 +363,13 @@ _Aquarius_ should always check the hash after data is decrypted via a _Provider_ Each asset has a state, which is held by the NFT contract. The possible states are: -- `0` = active -- `1` = end-of-life -- `2` = deprecated (by another asset) -- `3` = revoked by publisher -- `4` = ordering is temporary disabled +| State | Description | +| ------- | ------------------------------- | +| **`0`** | Active. | +| **`1`** | End-of-life. | +| **`2`** | Deprecated (by another asset). | +| **`3`** | Revoked by publisher. | +| **`4`** | Ordering is temporary disabled. | ## Aquarius Enhanced DDO Response @@ -385,12 +381,12 @@ These additional fields are never stored on-chain, and are never taken into cons The `nft` object contains information about the ERC721 NFT contract which represents the intellectual property of the publisher. -| Attribute | Type | Description | -| ------------- | -------- | ----------------------------------------------------- | -| **`address`** | `string` | Contract address of the deployed ERC721 NFT contract. | -| **`name`** | `string` | Name of NFT set in contract. | -| **`symbol`** | `string` | Symbol of NFT set in contract. | -| **`owner`** | `string` | ETH account address of the NFT owner. | +| Attribute | Type | Description | +| ------------- | -------- | ------------------------------------------------------------------------- | +| **`address`** | `string` | Contract address of the deployed ERC721 NFT contract. | +| **`name`** | `string` | Name of NFT set in contract. | +| **`symbol`** | `string` | Symbol of NFT set in contract. | +| **`owner`** | `string` | ETH account address of the NFT owner. | | **`state`** | `number` | State of the asset reflecting the NFT contract value. See [State](#state) | Example: @@ -409,31 +405,32 @@ Example: ### DataTokens -The `datatokens` object contains information about the ERC20 datatokens. +The `datatokens` array contains information about the ERC20 datatokens attached to [services](#services). + +| Attribute | Type | Description | +| --------------- | -------- | ----------------------------------------------------- | +| **`address`** | `string` | Contract address of the deployed ERC721 NFT contract. | +| **`name`** | `string` | Name of NFT set in contract. | +| **`symbol`** | `string` | Symbol of NFT set in contract. | +| **`serviceId`** | `string` | ID of the service the datatoken is attached to. | -| Attribute | Type | Description | -| ------------- | -------- | ----------------------------------------------------- | -| **`address`** | `string` | Contract address of the deployed ERC721 NFT contract. | -| **`name`** | `string` | Name of NFT set in contract. | -| **`symbol`** | `string` | Symbol of NFT set in contract. | -| **`serviceId`** | `string` | ServiceID | Example: ```json { "datatokens": [ - { + { "adddress": "0x000000", - "name": "Ocean Protocol Asset v4", - "symbol": "OCEAN-A-v4", + "name": "Datatoken 1", + "symbol": "DT-1", "serviceId": "1" - }, - { + }, + { "adddress": "0x000001", - "name": "Ocean Protocol Asset v4", - "symbol": "OCEAN-A-v4", + "name": "Datatoken 2", + "symbol": "DT-2", "serviceId": "2" - }, + } ] } ``` @@ -446,14 +443,12 @@ Example: ```json { - "event": [ - { - "tx": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", - "block": 12831214, - "from": "0xAcca11dbeD4F863Bb3bC2336D3CE5BAC52aa1f83", - "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf" - } - ] + "event": { + "tx": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", + "block": 12831214, + "from": "0xAcca11dbeD4F863Bb3bC2336D3CE5BAC52aa1f83", + "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf" + } } ``` @@ -492,14 +487,14 @@ Example: "author": "OPF", "license": "https://market.oceanprotocol.com/terms" }, - "files": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", "services": [ { "type": "access", + "files": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", "name": "Download service", "description": "Download service", "datatokenAddress": "0x123", - "providerUrl": "https://myprovider.com", + "serviceEndpoint": "https://myprovider.com", "timeout": 0 } ], @@ -524,15 +519,31 @@ Example: "name": "Ocean Protocol Asset v4", "symbol": "OCEAN-A-v4", "owner": "0x0000000", - "state": 0, + "state": 0 }, - "event": + + "datatokens": [ { - "tx": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", - "block": 12831214, - "from": "0xAcca11dbeD4F863Bb3bC2336D3CE5BAC52aa1f83", - "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf" + "adddress": "0x000000", + "name": "Datatoken 1", + "symbol": "DT-1", + "serviceId": "1" }, + { + "adddress": "0x000001", + "name": "Datatoken 2", + "symbol": "DT-2", + "serviceId": "2" + } + ], + + "event": { + "tx": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", + "block": 12831214, + "from": "0xAcca11dbeD4F863Bb3bC2336D3CE5BAC52aa1f83", + "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf" + }, + "stats": { "consumes": 4 } From d17b5831278a80659b632354916e0e0d4d705695 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Wed, 10 Nov 2021 17:25:31 +0000 Subject: [PATCH 049/145] more copywriting, example updates --- content/concepts/did-ddo.md | 69 +++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 34 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 26076422..ad2b0690 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -19,9 +19,9 @@ A DID Document (DDO) is a JSON blob that holds information about the DID. Given An _asset_ in Ocean represents a downloadable file, compute service, or similar. Each asset is a _resource_ under control of a _publisher_. The Ocean network itself does _not_ store the actual resource (e.g. files). -An _asset_ should have a DID and DDO. The DDO should include [metadata](#metadata) about the asset, and define access in at least one [service](#services). The DDO can only be modified by _owners_ or _delegated users_. +An _asset_ has a DID and DDO. The DDO should include [metadata](#metadata) about the asset, and define access in at least one [service](#services). The DDO can only be modified by _owners_ or _delegated users_. -A metadata cache like _Aquarius_ can help in reading and searching through encrypted DDO data from the chain. +All DDOs are stored on-chain in encrypted form to be fully GDPR-compatible. A metadata cache like _Aquarius_ can help in reading, decrypting, and searching through encrypted DDO data from the chain. Because the file URLs are encrypted on top of the full DDO encryption, returning unencrypted DDOs e.g. via an API is safe to do as the file URLs will still stay encrypted. ## Publishing & Retrieving DDOs @@ -31,6 +31,9 @@ Here is the complete flow: ![DDO_flow](images/ddo-flow.png) +

+ UML source + ```text title DDO flow @@ -47,20 +50,25 @@ Provider -> Aquarius: DDO Aquarius -> Aquarius : validate DDO Aquarius -> Aquarius : cache DDO Aquarius -> Aquarius : enhance cached DDO in response with additional infos like `events` & `stats` -``` + +```` + +
## DID -In Ocean, a DID is a string that looks like: +In Ocean, a DID is a string that looks like this: ```text did:op:0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea -``` +```` -where +The part after `did:op:` is the checksum of the ERC721 contract address and the chain the asset has been published to: -```text -0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea = sha256(ERC721 contract address + chainId) +```js +const checksum = sha256(ERC721 contract address + chainId) +console.log(checksum) +// 0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea ``` It follows [the generic DID scheme](https://w3c-ccg.github.io/did-spec/#the-generic-did-scheme). @@ -185,13 +193,13 @@ Example: } ``` -During the publish process file URLs need to be encrypted with a respective _Provider_ API call before storing the DDO on-chain. For this an array of strings with one or multiple URLs is what gets encrypted: +During the publish process, file URLs must be encrypted with a respective _Provider_ API call before storing the DDO on-chain. For this an array of strings with one or multiple URLs is what gets encrypted and send to _Provider_: ```json ["https://url.com/file1.csv", "https://url.com/file2.csv"] ``` -To get information about the files after encryption, the `/fileinfo` endpoint of _Provider_ must return based on passed DID: +To get information about the files after encryption, the `/fileinfo` endpoint of _Provider_ returns based on a passed DID an array of file metadata: ```json [ @@ -206,6 +214,8 @@ To get information about the files after encryption, the `/fileinfo` endpoint of ] ``` +This only concerns metadata about a file, but never the file URLs. The only way to decrypt them is to exchange at least 1 datatoken based on the respective service pricing scheme. + #### Compute Privacy An asset with a service of `type` `compute` has the following additional attributes under the `privacy` object. This object is required if the asset is of `type` `compute`, but can be omitted for `type` of `access`. @@ -244,6 +254,7 @@ Example: "services": [ { "type": "access", + "files": "0x044736da6dae39889ff570c34540f24e5e084f...", "name": "Download service", "description": "Download service", "datatokenAddress": "0x123", @@ -252,6 +263,7 @@ Example: }, { "type": "compute", + "files": "0x6dd05e0edb460623c843a263291ebe757c1eb3...", "name": "Compute service", "description": "Compute service", "datatokenAddress": "0x124", @@ -312,26 +324,15 @@ Here's an example object with both `"allow"` and `"deny"` entries: } ``` -For future usage, we can extend that with different credentials types. +### DDO Checksum -Example: - -```json -{ - "type": "credential3Box", - "values": ["profile1", "profile2"] -} -``` - -### DDO Hash - -In order to ensure the integrity of the DDO, a hash is computed for each DDO: +In order to ensure the integrity of the DDO, a checksum is computed for each DDO: ```js -const hash = sha256(JSON.stringify(ddo)) +const checksum = sha256(JSON.stringify(ddo)) ``` -The hash is used when publishing/update metadata using the `setMetaData` function in the ERC721 contract, and is stored in the event generated by the ERC721 contract: +The checksum hash is used when publishing/updating metadata using the `setMetaData` function in the ERC721 contract, and is stored in the event generated by the ERC721 contract: ```solidity event MetadataCreated( @@ -357,7 +358,7 @@ event MetadataUpdated( ); ``` -_Aquarius_ should always check the hash after data is decrypted via a _Provider_ API call, in order to ensure DDO integrity. +_Aquarius_ should always verify the checksum after data is decrypted via a _Provider_ API call. ### State @@ -403,16 +404,16 @@ Example: } ``` -### DataTokens +### Datatokens -The `datatokens` array contains information about the ERC20 datatokens attached to [services](#services). +The `datatokens` array contains information about the ERC20 datatokens attached to [asset services](#services). -| Attribute | Type | Description | -| --------------- | -------- | ----------------------------------------------------- | -| **`address`** | `string` | Contract address of the deployed ERC721 NFT contract. | -| **`name`** | `string` | Name of NFT set in contract. | -| **`symbol`** | `string` | Symbol of NFT set in contract. | -| **`serviceId`** | `string` | ID of the service the datatoken is attached to. | +| Attribute | Type | Description | +| --------------- | -------- | ------------------------------------------------ | +| **`address`** | `string` | Contract address of the deployed ERC20 contract. | +| **`name`** | `string` | Name of NFT set in contract. | +| **`symbol`** | `string` | Symbol of NFT set in contract. | +| **`serviceId`** | `string` | ID of the service the datatoken is attached to. | Example: From e52ebbd15488f0cb2d98895c99c8c19a14e5441b Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Wed, 10 Nov 2021 23:02:12 -0800 Subject: [PATCH 050/145] add compute resources --- content/concepts/did-ddo.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index ad2b0690..c3473571 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -180,6 +180,7 @@ An asset should have at least one service to be actually accessible, and can hav | **`files`** | [Files](#files) | **/** | Encrypted file URLs. | | **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of `0` represents no time limit. Expressed in seconds. | | **`privacy`** | [Privacy](#compute-privacy) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings. | +| **`resources`** | [Resources](#compute-resources) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related resources. | #### Files @@ -216,6 +217,21 @@ To get information about the files after encryption, the `/fileinfo` endpoint of This only concerns metadata about a file, but never the file URLs. The only way to decrypt them is to exchange at least 1 datatoken based on the respective service pricing scheme. +#### Compute Resources + +An asset with a service of `type` `compute` has the following additional attributes under the `resources` object. This object is required if the asset is of `type` `compute`, but can be omitted for `type` of `access`. + +| Attribute | Type | Required | Description | +| ------------------------------------------ | ------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **`namespace`** | `string` | **✓** | Namespaced used for the compute job. Defaults to 'ocean-compute'. | +| **`cpus`** | `number` | | Maximum number of CPUs allocated for a job| +| **`gpus`** | `number` | | Maximum number of GPUs allocated for a job| +| **`gpuType`** | `string` | | Type of GPU (if any) +| **`memory`** | `string` | | Maximum amount of memory allocated for a job. You can express memory as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. For example, the following represent roughly the same value: + +128974848, 129e6, 129M, 123Mi| +| **`volumeSize`** | `string` | | Amount of disk space allocated. You can express it as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. | + #### Compute Privacy An asset with a service of `type` `compute` has the following additional attributes under the `privacy` object. This object is required if the asset is of `type` `compute`, but can be omitted for `type` of `access`. @@ -269,6 +285,14 @@ Example: "datatokenAddress": "0x124", "serviceEndpoint": "https://myprovider.com", "timeout": 0, + "resources":{ + "namespace":"ocean-compute", + "cpus":2, + "gpus":4, + "gpuType":"NVIDIA Tesla V100 GPU", + "memory":"128M", + "volumeSize":"2G" + }, "privacy": { "allowRawAlgorithm": false, "allowNetworkAccess": true, From 575b2ee9750ad092696e30d7daa93907f50ec0ba Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Wed, 10 Nov 2021 23:03:39 -0800 Subject: [PATCH 051/145] fix typo --- content/concepts/did-ddo.md | 1 - 1 file changed, 1 deletion(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index c3473571..0524bd14 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -228,7 +228,6 @@ An asset with a service of `type` `compute` has the following additional attribu | **`gpus`** | `number` | | Maximum number of GPUs allocated for a job| | **`gpuType`** | `string` | | Type of GPU (if any) | **`memory`** | `string` | | Maximum amount of memory allocated for a job. You can express memory as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. For example, the following represent roughly the same value: - 128974848, 129e6, 129M, 123Mi| | **`volumeSize`** | `string` | | Amount of disk space allocated. You can express it as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. | From 87e7b084c16cfcd2eb1aabb9f572f9a235bd6270 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Wed, 10 Nov 2021 23:04:14 -0800 Subject: [PATCH 052/145] fix typo --- content/concepts/did-ddo.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 0524bd14..b750b090 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -227,8 +227,7 @@ An asset with a service of `type` `compute` has the following additional attribu | **`cpus`** | `number` | | Maximum number of CPUs allocated for a job| | **`gpus`** | `number` | | Maximum number of GPUs allocated for a job| | **`gpuType`** | `string` | | Type of GPU (if any) -| **`memory`** | `string` | | Maximum amount of memory allocated for a job. You can express memory as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. For example, the following represent roughly the same value: -128974848, 129e6, 129M, 123Mi| +| **`memory`** | `string` | | Maximum amount of memory allocated for a job. You can express memory as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. For example, the following represent roughly the same value: 128974848, 129e6, 129M, 123Mi| | **`volumeSize`** | `string` | | Amount of disk space allocated. You can express it as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. | #### Compute Privacy From 45ad47ce830501ccb03196ab8e75d7175d7ee459 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Thu, 11 Nov 2021 00:59:50 -0800 Subject: [PATCH 053/145] mv created&updated to metadata, add datetime to ev --- content/concepts/did-ddo.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index b750b090..650503c5 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -83,8 +83,6 @@ A DDO in Ocean has these required attributes: | **`id`** | `string` | Computed as `sha256(address of ERC721 contract + chainId)`. | | **`version`** | `string` | Version information in [SemVer](https://semver.org) notation referring to this DDO spec version, like `4.0.0`. | | **`chainId`** | `number` | Stores chainId of the network the DDO was published to. | -| **`created`** | `ISO Date Time string` | Contains the date of publishing in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | -| **`updated`** | `ISO Date Time string` | Contains the the date of last update in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | | **`metadata`** | [Metadata](#metadata) | Stores an object describing the asset. | | **`services`** | [Services](#services) | Stores an array of services defining access to the asset. | | **`credentials`** | [Credentials](#credentials) | Describes the credentials needed to access a dataset in addition to the `services` definition. | @@ -95,6 +93,8 @@ This object holds information describing the actual asset. | Attribute | Type | Required | Description | | --------------------------- | ----------------------------------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **`created`** | `ISO Date Time string` | **✓** | Contains the date of publishing in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | +| **`updated`** | `ISO Date Time string` | **✓** | Contains the the date of last update in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | | **`description`** | `string` | **✓** | Details of what the resource is. For a dataset, this attribute explains what the data represents and what it can be used for. | | **`copyrightHolder`** | `string` | | The party holding the legal copyright. Empty by default. | | **`name`** | `string` | **✓** | Descriptive name or title of the asset. | @@ -470,7 +470,8 @@ Example: "tx": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", "block": 12831214, "from": "0xAcca11dbeD4F863Bb3bC2336D3CE5BAC52aa1f83", - "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf" + "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf", + "datetime": "2000-10-31T01:30:00" } } ``` @@ -564,7 +565,8 @@ Example: "tx": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", "block": 12831214, "from": "0xAcca11dbeD4F863Bb3bC2336D3CE5BAC52aa1f83", - "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf" + "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf", + "datetime": "2000-10-31T01:30:00" }, "stats": { From f05989d0c523c2f9c02cddef62b17fc32411c07a Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Thu, 11 Nov 2021 01:04:39 -0800 Subject: [PATCH 054/145] create compute object --- content/concepts/did-ddo.md | 83 +++++++++++++++++++++++-------------- 1 file changed, 53 insertions(+), 30 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 650503c5..3148f43f 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -179,8 +179,7 @@ An asset should have at least one service to be actually accessible, and can hav | **`serviceEndpoint`** | `string` | **✓** | Provider URL (schema + host) | | **`files`** | [Files](#files) | **/** | Encrypted file URLs. | | **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of `0` represents no time limit. Expressed in seconds. | -| **`privacy`** | [Privacy](#compute-privacy) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings. | -| **`resources`** | [Resources](#compute-resources) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related resources. | +| **`compute`** | [Compute](#compute-options) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings & resources. | #### Files @@ -217,30 +216,24 @@ To get information about the files after encryption, the `/fileinfo` endpoint of This only concerns metadata about a file, but never the file URLs. The only way to decrypt them is to exchange at least 1 datatoken based on the respective service pricing scheme. -#### Compute Resources +#### Compute Options -An asset with a service of `type` `compute` has the following additional attributes under the `resources` object. This object is required if the asset is of `type` `compute`, but can be omitted for `type` of `access`. +An asset with a service of `type` `compute` has the following additional attributes under the `compute` object. This object is required if the asset is of `type` `compute`, but can be omitted for `type` of `access`. | Attribute | Type | Required | Description | | ------------------------------------------ | ------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`namespace`** | `string` | **✓** | Namespaced used for the compute job. Defaults to 'ocean-compute'. | +| **`namespace`** | `string` | **✓** | Namespaced used for the compute job. Defaults to 'ocean-compute'. | | **`cpus`** | `number` | | Maximum number of CPUs allocated for a job| | **`gpus`** | `number` | | Maximum number of GPUs allocated for a job| -| **`gpuType`** | `string` | | Type of GPU (if any) -| **`memory`** | `string` | | Maximum amount of memory allocated for a job. You can express memory as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. For example, the following represent roughly the same value: 128974848, 129e6, 129M, 123Mi| -| **`volumeSize`** | `string` | | Amount of disk space allocated. You can express it as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. | - -#### Compute Privacy - -An asset with a service of `type` `compute` has the following additional attributes under the `privacy` object. This object is required if the asset is of `type` `compute`, but can be omitted for `type` of `access`. - -| Attribute | Type | Required | Description | -| ------------------------------------------ | ------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`allowRawAlgorithm`** | `boolean` | **✓** | If `true`, any passed raw text will be allowed to run. Useful for an algorithm drag & drop use case, but increases risk of data escape through malicious user input. Should be `false` by default in all implementations. | -| **`allowNetworkAccess`** | `boolean` | **✓** | If `true`, the algorithm job will have network access. | +| **`gpuType`** | `string` | | Type of GPU (if any) +| **`memory`** | `string` | | Maximum amount of memory allocated for a job. You can express memory as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. For example, the following represent roughly the same value: 128974848, 129e6, 129M, 123Mi| +| **`volumeSize`** | `string` | | Amount of disk space allocated. You can express it as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. | +| **`allowRawAlgorithm`** | `boolean` | **✓** | If `true`, any passed raw text will be allowed to run. Useful for an algorithm drag & drop use case, but increases risk of data escape through malicious user input. Should be `false` by default in all implementations. | +| **`allowNetworkAccess`** | `boolean` | **✓** | If `true`, the algorithm job will have network access. | | **`publisherTrustedAlgorithmPublishers `** | Array of `string` | **✓** | If empty, then any published algorithm is allowed. Otherwise, only published algorithms by some publishers are allowed | | **`publisherTrustedAlgorithms `** | Array of `publisherTrustedAlgorithms` | **✓** | If empty, then any published algorithm is allowed. (see below) | + The `publisherTrustedAlgorithms ` is an array of objects with the following structure: | Attribute | Type | Required | Description | @@ -283,19 +276,17 @@ Example: "datatokenAddress": "0x124", "serviceEndpoint": "https://myprovider.com", "timeout": 0, - "resources":{ - "namespace":"ocean-compute", - "cpus":2, - "gpus":4, - "gpuType":"NVIDIA Tesla V100 GPU", - "memory":"128M", - "volumeSize":"2G" - }, - "privacy": { - "allowRawAlgorithm": false, - "allowNetworkAccess": true, - "publisherTrustedAlgorithmPublishers": ["0x234", "0x235"], - "publisherTrustedAlgorithms": [ + "compute":{ + "namespace": "ocean-compute", + "cpus": 2, + "gpus": 4, + "gpuType": "NVIDIA Tesla V100 GPU", + "memory": "128M", + "volumeSize": "2G", + "allowRawAlgorithm": false, + "allowNetworkAccess": true, + "publisherTrustedAlgorithmPublishers": ["0x234", "0x235"], + "publisherTrustedAlgorithms": [ { "did": "did:op:123", "filesChecksum": "100", @@ -520,6 +511,38 @@ Example: "datatokenAddress": "0x123", "serviceEndpoint": "https://myprovider.com", "timeout": 0 + }, + { + "type": "compute", + "files": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", + "name": "Compute service", + "description": "Compute service", + "datatokenAddress": "0x124", + "serviceEndpoint": "https://myprovider.com", + "timeout": 3600, + "compute":{ + "namespace": "ocean-compute", + "cpus": 2, + "gpus": 4, + "gpuType": "NVIDIA Tesla V100 GPU", + "memory": "128M", + "volumeSize": "2G", + "allowRawAlgorithm": false, + "allowNetworkAccess": true, + "publisherTrustedAlgorithmPublishers": ["0x234", "0x235"], + "publisherTrustedAlgorithms": [ + { + "did": "did:op:123", + "filesChecksum": "100", + "containerSectionChecksum": "200" + }, + { + "did": "did:op:124", + "filesChecksum": "110", + "containerSectionChecksum": "210" + } + ] + } } ], "credentials": { From c3f4d5b2cedbf21f80f9d8606629e3a4cc2c8203 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Thu, 11 Nov 2021 01:09:41 -0800 Subject: [PATCH 055/145] fix typo for files object --- content/concepts/did-ddo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 3148f43f..a4d1dcf5 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -177,7 +177,7 @@ An asset should have at least one service to be actually accessible, and can hav | **`description`** | `string` | | Service description | | **`datatokenAddress`** | `string` | **✓** | Datatoken address | | **`serviceEndpoint`** | `string` | **✓** | Provider URL (schema + host) | -| **`files`** | [Files](#files) | **/** | Encrypted file URLs. | +| **`files`** | [Files](#files) | **✓** | Encrypted file URLs. | | **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of `0` represents no time limit. Expressed in seconds. | | **`compute`** | [Compute](#compute-options) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings & resources. | From 541522ef095de74a0cdf842b8355b2e7e70a5c7f Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Thu, 11 Nov 2021 01:54:46 -0800 Subject: [PATCH 056/145] more created&updated updates --- content/concepts/did-ddo.md | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index a4d1dcf5..1d771e17 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -93,8 +93,8 @@ This object holds information describing the actual asset. | Attribute | Type | Required | Description | | --------------------------- | ----------------------------------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`created`** | `ISO Date Time string` | **✓** | Contains the date of publishing in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | -| **`updated`** | `ISO Date Time string` | **✓** | Contains the the date of last update in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | +| **`created`** | `ISO Date Time string` | | Contains the date of dataset publishing in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. It refers to dataset content. | +| **`updated`** | `ISO Date Time string` | | Contains the the date of last update of the dataset content in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | | **`description`** | `string` | **✓** | Details of what the resource is. For a dataset, this attribute explains what the data represents and what it can be used for. | | **`copyrightHolder`** | `string` | | The party holding the legal copyright. Empty by default. | | **`name`** | `string` | **✓** | Descriptive name or title of the asset. | @@ -144,6 +144,8 @@ The `container` object has the following attributes defining the Docker image fo ```json { "metadata": { + "created": "2020-11-15T12:27:48Z", + "updated": "2021-05-17T21:58:02Z", "description": "Sample description", "name": "Sample algorithm asset", "type": "algorithm", @@ -491,16 +493,16 @@ Example: { "@context": ["https://w3id.org/did/v1"], "id": "did:op:ACce67694eD2848dd683c651Dab7Af823b7dd123", - "created": "2020-11-15T12:27:48Z", - "updated": "2021-05-17T21:58:02Z", "version": "4.0.0", "chainId": 1, "metadata": { - "description": "Sample description", - "name": "Sample asset", - "type": "dataset", - "author": "OPF", - "license": "https://market.oceanprotocol.com/terms" + "created": "2020-11-15T12:27:48Z", + "updated": "2021-05-17T21:58:02Z", + "description": "Sample description", + "name": "Sample asset", + "type": "dataset", + "author": "OPF", + "license": "https://market.oceanprotocol.com/terms" }, "services": [ { From 90f907e9ebe4ebac5c0cf4f0e140e52156056b38 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Thu, 11 Nov 2021 02:07:13 -0800 Subject: [PATCH 057/145] added nft.created --- content/concepts/did-ddo.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 1d771e17..4589ccff 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -404,6 +404,7 @@ The `nft` object contains information about the ERC721 NFT contract which repres | **`symbol`** | `string` | Symbol of NFT set in contract. | | **`owner`** | `string` | ETH account address of the NFT owner. | | **`state`** | `number` | State of the asset reflecting the NFT contract value. See [State](#state) | +| **`created`** | `ISO Date Time string` | Contains the date of nft creation | Example: @@ -414,7 +415,8 @@ Example: "name": "Ocean Protocol Asset v4", "symbol": "OCEAN-A-v4", "owner": "0x0000000", - "state": 0 + "state": 0, + "created": "2000-10-31T01:30:00" } } ``` @@ -568,7 +570,8 @@ Example: "name": "Ocean Protocol Asset v4", "symbol": "OCEAN-A-v4", "owner": "0x0000000", - "state": 0 + "state": 0, + "created": "2000-10-31T01:30:00" }, "datatokens": [ From c79a0b8cb5a64864c71aa9bf65efa029b1ac6f34 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Thu, 11 Nov 2021 02:11:19 -0800 Subject: [PATCH 058/145] more details --- content/concepts/did-ddo.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 4589ccff..51b9148a 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -93,8 +93,8 @@ This object holds information describing the actual asset. | Attribute | Type | Required | Description | | --------------------------- | ----------------------------------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`created`** | `ISO Date Time string` | | Contains the date of dataset publishing in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. It refers to dataset content. | -| **`updated`** | `ISO Date Time string` | | Contains the the date of last update of the dataset content in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | +| **`created`** | `ISO Date Time string` | | Contains the the date of the creation of the dataset content in ISO Date Time Format, e.g. `2000-10-31T01:30:00`.| +| **`updated`** | `ISO Date Time string` | | Contains the the date of last update of the dataset content in ISO Date Time Format, e.g. `2000-10-31T01:30:00`.| | **`description`** | `string` | **✓** | Details of what the resource is. For a dataset, this attribute explains what the data represents and what it can be used for. | | **`copyrightHolder`** | `string` | | The party holding the legal copyright. Empty by default. | | **`name`** | `string` | **✓** | Descriptive name or title of the asset. | From d4866147277e42c808f13cd9bcfd488c9b2eb3c5 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Thu, 11 Nov 2021 02:12:01 -0800 Subject: [PATCH 059/145] fix typo --- content/concepts/did-ddo.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 51b9148a..a509b1ef 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -93,8 +93,8 @@ This object holds information describing the actual asset. | Attribute | Type | Required | Description | | --------------------------- | ----------------------------------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`created`** | `ISO Date Time string` | | Contains the the date of the creation of the dataset content in ISO Date Time Format, e.g. `2000-10-31T01:30:00`.| -| **`updated`** | `ISO Date Time string` | | Contains the the date of last update of the dataset content in ISO Date Time Format, e.g. `2000-10-31T01:30:00`.| +| **`created`** | `ISO Date Time string` | | Contains the date of the creation of the dataset content in ISO Date Time Format, e.g. `2000-10-31T01:30:00`.| +| **`updated`** | `ISO Date Time string` | | Contains the date of last update of the dataset content in ISO Date Time Format, e.g. `2000-10-31T01:30:00`.| | **`description`** | `string` | **✓** | Details of what the resource is. For a dataset, this attribute explains what the data represents and what it can be used for. | | **`copyrightHolder`** | `string` | | The party holding the legal copyright. Empty by default. | | **`name`** | `string` | **✓** | Descriptive name or title of the asset. | From bd25862a77df21d32c2a53eae1a678c23f179450 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 11 Nov 2021 14:17:27 +0000 Subject: [PATCH 060/145] formatting --- content/concepts/did-ddo.md | 105 ++++++++++++++++++------------------ 1 file changed, 52 insertions(+), 53 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index a509b1ef..7f2a9268 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -93,8 +93,8 @@ This object holds information describing the actual asset. | Attribute | Type | Required | Description | | --------------------------- | ----------------------------------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`created`** | `ISO Date Time string` | | Contains the date of the creation of the dataset content in ISO Date Time Format, e.g. `2000-10-31T01:30:00`.| -| **`updated`** | `ISO Date Time string` | | Contains the date of last update of the dataset content in ISO Date Time Format, e.g. `2000-10-31T01:30:00`.| +| **`created`** | `ISO Date Time string` | | Contains the date of the creation of the dataset content in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | +| **`updated`** | `ISO Date Time string` | | Contains the date of last update of the dataset content in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | | **`description`** | `string` | **✓** | Details of what the resource is. For a dataset, this attribute explains what the data represents and what it can be used for. | | **`copyrightHolder`** | `string` | | The party holding the legal copyright. Empty by default. | | **`name`** | `string` | **✓** | Descriptive name or title of the asset. | @@ -181,7 +181,7 @@ An asset should have at least one service to be actually accessible, and can hav | **`serviceEndpoint`** | `string` | **✓** | Provider URL (schema + host) | | **`files`** | [Files](#files) | **✓** | Encrypted file URLs. | | **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of `0` represents no time limit. Expressed in seconds. | -| **`compute`** | [Compute](#compute-options) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings & resources. | +| **`compute`** | [Compute](#compute-options) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings & resources. | #### Files @@ -222,19 +222,18 @@ This only concerns metadata about a file, but never the file URLs. The only way An asset with a service of `type` `compute` has the following additional attributes under the `compute` object. This object is required if the asset is of `type` `compute`, but can be omitted for `type` of `access`. -| Attribute | Type | Required | Description | -| ------------------------------------------ | ------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`namespace`** | `string` | **✓** | Namespaced used for the compute job. Defaults to 'ocean-compute'. | -| **`cpus`** | `number` | | Maximum number of CPUs allocated for a job| -| **`gpus`** | `number` | | Maximum number of GPUs allocated for a job| -| **`gpuType`** | `string` | | Type of GPU (if any) -| **`memory`** | `string` | | Maximum amount of memory allocated for a job. You can express memory as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. For example, the following represent roughly the same value: 128974848, 129e6, 129M, 123Mi| -| **`volumeSize`** | `string` | | Amount of disk space allocated. You can express it as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. | -| **`allowRawAlgorithm`** | `boolean` | **✓** | If `true`, any passed raw text will be allowed to run. Useful for an algorithm drag & drop use case, but increases risk of data escape through malicious user input. Should be `false` by default in all implementations. | -| **`allowNetworkAccess`** | `boolean` | **✓** | If `true`, the algorithm job will have network access. | -| **`publisherTrustedAlgorithmPublishers `** | Array of `string` | **✓** | If empty, then any published algorithm is allowed. Otherwise, only published algorithms by some publishers are allowed | -| **`publisherTrustedAlgorithms `** | Array of `publisherTrustedAlgorithms` | **✓** | If empty, then any published algorithm is allowed. (see below) | - +| Attribute | Type | Required | Description | +| ------------------------------------------ | ------------------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **`namespace`** | `string` | **✓** | Namespaced used for the compute job. Defaults to 'ocean-compute'. | +| **`cpus`** | `number` | | Maximum number of CPUs allocated for a job | +| **`gpus`** | `number` | | Maximum number of GPUs allocated for a job | +| **`gpuType`** | `string` | | Type of GPU (if any) | +| **`memory`** | `string` | | Maximum amount of memory allocated for a job. You can express memory as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. For example, the following represent roughly the same value: 128974848, 129e6, 129M, 123Mi | +| **`volumeSize`** | `string` | | Amount of disk space allocated. You can express it as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. | +| **`allowRawAlgorithm`** | `boolean` | **✓** | If `true`, any passed raw text will be allowed to run. Useful for an algorithm drag & drop use case, but increases risk of data escape through malicious user input. Should be `false` by default in all implementations. | +| **`allowNetworkAccess`** | `boolean` | **✓** | If `true`, the algorithm job will have network access. | +| **`publisherTrustedAlgorithmPublishers `** | Array of `string` | **✓** | If empty, then any published algorithm is allowed. Otherwise, only published algorithms by some publishers are allowed | +| **`publisherTrustedAlgorithms `** | Array of `publisherTrustedAlgorithms` | **✓** | If empty, then any published algorithm is allowed. (see below) | The `publisherTrustedAlgorithms ` is an array of objects with the following structure: @@ -278,17 +277,17 @@ Example: "datatokenAddress": "0x124", "serviceEndpoint": "https://myprovider.com", "timeout": 0, - "compute":{ - "namespace": "ocean-compute", - "cpus": 2, - "gpus": 4, - "gpuType": "NVIDIA Tesla V100 GPU", - "memory": "128M", - "volumeSize": "2G", - "allowRawAlgorithm": false, - "allowNetworkAccess": true, - "publisherTrustedAlgorithmPublishers": ["0x234", "0x235"], - "publisherTrustedAlgorithms": [ + "compute": { + "namespace": "ocean-compute", + "cpus": 2, + "gpus": 4, + "gpuType": "NVIDIA Tesla V100 GPU", + "memory": "128M", + "volumeSize": "2G", + "allowRawAlgorithm": false, + "allowNetworkAccess": true, + "publisherTrustedAlgorithmPublishers": ["0x234", "0x235"], + "publisherTrustedAlgorithms": [ { "did": "did:op:123", "filesChecksum": "100", @@ -397,14 +396,14 @@ These additional fields are never stored on-chain, and are never taken into cons The `nft` object contains information about the ERC721 NFT contract which represents the intellectual property of the publisher. -| Attribute | Type | Description | -| ------------- | -------- | ------------------------------------------------------------------------- | -| **`address`** | `string` | Contract address of the deployed ERC721 NFT contract. | -| **`name`** | `string` | Name of NFT set in contract. | -| **`symbol`** | `string` | Symbol of NFT set in contract. | -| **`owner`** | `string` | ETH account address of the NFT owner. | -| **`state`** | `number` | State of the asset reflecting the NFT contract value. See [State](#state) | -| **`created`** | `ISO Date Time string` | Contains the date of nft creation | +| Attribute | Type | Description | +| ------------- | ---------------------- | ------------------------------------------------------------------------- | +| **`address`** | `string` | Contract address of the deployed ERC721 NFT contract. | +| **`name`** | `string` | Name of NFT set in contract. | +| **`symbol`** | `string` | Symbol of NFT set in contract. | +| **`owner`** | `string` | ETH account address of the NFT owner. | +| **`state`** | `number` | State of the asset reflecting the NFT contract value. See [State](#state) | +| **`created`** | `ISO Date Time string` | Contains the date of nft creation | Example: @@ -498,13 +497,13 @@ Example: "version": "4.0.0", "chainId": 1, "metadata": { - "created": "2020-11-15T12:27:48Z", - "updated": "2021-05-17T21:58:02Z", - "description": "Sample description", - "name": "Sample asset", - "type": "dataset", - "author": "OPF", - "license": "https://market.oceanprotocol.com/terms" + "created": "2020-11-15T12:27:48Z", + "updated": "2021-05-17T21:58:02Z", + "description": "Sample description", + "name": "Sample asset", + "type": "dataset", + "author": "OPF", + "license": "https://market.oceanprotocol.com/terms" }, "services": [ { @@ -524,17 +523,17 @@ Example: "datatokenAddress": "0x124", "serviceEndpoint": "https://myprovider.com", "timeout": 3600, - "compute":{ - "namespace": "ocean-compute", - "cpus": 2, - "gpus": 4, - "gpuType": "NVIDIA Tesla V100 GPU", - "memory": "128M", - "volumeSize": "2G", - "allowRawAlgorithm": false, - "allowNetworkAccess": true, - "publisherTrustedAlgorithmPublishers": ["0x234", "0x235"], - "publisherTrustedAlgorithms": [ + "compute": { + "namespace": "ocean-compute", + "cpus": 2, + "gpus": 4, + "gpuType": "NVIDIA Tesla V100 GPU", + "memory": "128M", + "volumeSize": "2G", + "allowRawAlgorithm": false, + "allowNetworkAccess": true, + "publisherTrustedAlgorithmPublishers": ["0x234", "0x235"], + "publisherTrustedAlgorithms": [ { "did": "did:op:123", "filesChecksum": "100", From 5aef5dfb3572b2d7b4715e93462a90a8318c4f10 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 11 Nov 2021 14:26:57 +0000 Subject: [PATCH 061/145] parser fix --- content/concepts/did-ddo.md | 45 ++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 7f2a9268..e75e4ca5 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -33,7 +33,7 @@ Here is the complete flow:
UML source - + ```text title DDO flow @@ -49,9 +49,8 @@ Provider -> Provider: depending on metadataState (expired,retired) and aquarius Provider -> Aquarius: DDO Aquarius -> Aquarius : validate DDO Aquarius -> Aquarius : cache DDO -Aquarius -> Aquarius : enhance cached DDO in response with additional infos like `events` & `stats` - -```` +Aquarius -> Aquarius : enhance cached DDO in response with additional infos like events & stats +```
@@ -61,7 +60,7 @@ In Ocean, a DID is a string that looks like this: ```text did:op:0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea -```` +``` The part after `did:op:` is the checksum of the ERC721 contract address and the chain the asset has been published to: @@ -350,25 +349,25 @@ The checksum hash is used when publishing/updating metadata using the `setMetaDa ```solidity event MetadataCreated( - address indexed createdBy, - uint8 state, - string decryptorUrl, - bytes flags, - bytes data, - bytes metaDataHash, - uint256 timestamp, - uint256 blockNumber +address indexed createdBy, +uint8 state, +string decryptorUrl, +bytes flags, +bytes data, +bytes metaDataHash, +uint256 timestamp, +uint256 blockNumber ); event MetadataUpdated( - address indexed updatedBy, - uint8 state, - string decryptorUrl, - bytes flags, - bytes data, - bytes metaDataHash, - uint256 timestamp, - uint256 blockNumber +address indexed updatedBy, +uint8 state, +string decryptorUrl, +bytes flags, +bytes data, +bytes metaDataHash, +uint256 timestamp, +uint256 blockNumber ); ``` @@ -601,3 +600,7 @@ Example: } } ``` + +``` + +``` From b8fe0e8b13847e62785d6aeca077f704901ab40c Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 11 Nov 2021 14:31:09 +0000 Subject: [PATCH 062/145] another markdown fix --- content/concepts/did-ddo.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index e75e4ca5..5a30334a 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -600,7 +600,3 @@ Example: } } ``` - -``` - -``` From 38b8e7efa52d7d7de60ea6c44d80a39bab803cfd Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Thu, 11 Nov 2021 22:10:24 -0800 Subject: [PATCH 063/145] make files string --- content/concepts/did-ddo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index a509b1ef..bbd3100e 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -179,7 +179,7 @@ An asset should have at least one service to be actually accessible, and can hav | **`description`** | `string` | | Service description | | **`datatokenAddress`** | `string` | **✓** | Datatoken address | | **`serviceEndpoint`** | `string` | **✓** | Provider URL (schema + host) | -| **`files`** | [Files](#files) | **✓** | Encrypted file URLs. | +| **`files`** | [string](#files) | **✓** | Encrypted file URLs. | | **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of `0` represents no time limit. Expressed in seconds. | | **`compute`** | [Compute](#compute-options) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings & resources. | From 9b6f2082dea416e2428ea88444f28c1ab8bcc6c5 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Fri, 12 Nov 2021 11:58:55 +0000 Subject: [PATCH 064/145] consistent date examples, mention timezone designators --- content/concepts/did-ddo.md | 44 +++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index ed9ec92d..1818047b 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -92,8 +92,8 @@ This object holds information describing the actual asset. | Attribute | Type | Required | Description | | --------------------------- | ----------------------------------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`created`** | `ISO Date Time string` | | Contains the date of the creation of the dataset content in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | -| **`updated`** | `ISO Date Time string` | | Contains the date of last update of the dataset content in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | +| **`created`** | `ISO Date Time string` | | Contains the date of the creation of the dataset content in ISO 8601 format preferably with timezone designators, e.g. `2000-10-31T01:30:00Z`. | +| **`updated`** | `ISO Date Time string` | | Contains the date of last update of the dataset content in ISO 8601 format preferably with timezone designators, e.g. `2000-10-31T01:30:00Z`. | | **`description`** | `string` | **✓** | Details of what the resource is. For a dataset, this attribute explains what the data represents and what it can be used for. | | **`copyrightHolder`** | `string` | | The party holding the legal copyright. Empty by default. | | **`name`** | `string` | **✓** | Descriptive name or title of the asset. | @@ -112,6 +112,8 @@ Example: ```json { "metadata": { + "created": "2020-11-15T12:27:48Z", + "updated": "2021-05-17T21:58:02Z", "description": "Sample description", "name": "Sample asset", "type": "dataset", @@ -178,7 +180,7 @@ An asset should have at least one service to be actually accessible, and can hav | **`description`** | `string` | | Service description | | **`datatokenAddress`** | `string` | **✓** | Datatoken address | | **`serviceEndpoint`** | `string` | **✓** | Provider URL (schema + host) | -| **`files`** | [string](#files) | **✓** | Encrypted file URLs. | +| **`files`** | [string](#files) | **✓** | Encrypted file URLs. | | **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of `0` represents no time limit. Expressed in seconds. | | **`compute`** | [Compute](#compute-options) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings & resources. | @@ -349,25 +351,25 @@ The checksum hash is used when publishing/updating metadata using the `setMetaDa ```solidity event MetadataCreated( -address indexed createdBy, -uint8 state, -string decryptorUrl, -bytes flags, -bytes data, -bytes metaDataHash, -uint256 timestamp, -uint256 blockNumber + address indexed createdBy, + uint8 state, + string decryptorUrl, + bytes flags, + bytes data, + bytes metaDataHash, + uint256 timestamp, + uint256 blockNumber ); event MetadataUpdated( -address indexed updatedBy, -uint8 state, -string decryptorUrl, -bytes flags, -bytes data, -bytes metaDataHash, -uint256 timestamp, -uint256 blockNumber + address indexed updatedBy, + uint8 state, + string decryptorUrl, + bytes flags, + bytes data, + bytes metaDataHash, + uint256 timestamp, + uint256 blockNumber ); ``` @@ -402,7 +404,7 @@ The `nft` object contains information about the ERC721 NFT contract which repres | **`symbol`** | `string` | Symbol of NFT set in contract. | | **`owner`** | `string` | ETH account address of the NFT owner. | | **`state`** | `number` | State of the asset reflecting the NFT contract value. See [State](#state) | -| **`created`** | `ISO Date Time string` | Contains the date of nft creation | +| **`created`** | `ISO Date Time string` | Contains the date of NFT creation | Example: @@ -414,7 +416,7 @@ Example: "symbol": "OCEAN-A-v4", "owner": "0x0000000", "state": 0, - "created": "2000-10-31T01:30:00" + "created": "2000-10-31T01:30:00Z" } } ``` From dfd67b2d25fc1f127a3c283ae13445afbf3f1011 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Fri, 12 Nov 2021 14:10:15 +0000 Subject: [PATCH 065/145] typos, increase TOC level --- content/concepts/did-ddo.md | 54 ++++++++++++++++++------------------- src/templates/Doc.jsx | 2 +- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 1818047b..fb72ca0a 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -25,11 +25,11 @@ All DDOs are stored on-chain in encrypted form to be fully GDPR-compatible. A me ## Publishing & Retrieving DDOs -The DDO is stored on-chain as part of the NFT contract and it is stored encrypted using the private key of the _Provider_. To resolve it, a metadata cache like _Aquarius_ must query the provider to decrypt the DDO. +The DDO is stored on-chain as part of the NFT contract, and stored encrypted using the private key of the _Provider_. To resolve it, a metadata cache like _Aquarius_ must query the provider to decrypt the DDO. Here is the complete flow: -![DDO_flow](images/ddo-flow.png) +![DDO flow](images/ddo-flow.png)
UML source @@ -92,8 +92,8 @@ This object holds information describing the actual asset. | Attribute | Type | Required | Description | | --------------------------- | ----------------------------------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`created`** | `ISO Date Time string` | | Contains the date of the creation of the dataset content in ISO 8601 format preferably with timezone designators, e.g. `2000-10-31T01:30:00Z`. | -| **`updated`** | `ISO Date Time string` | | Contains the date of last update of the dataset content in ISO 8601 format preferably with timezone designators, e.g. `2000-10-31T01:30:00Z`. | +| **`created`** | `ISO date/time string` | | Contains the date of the creation of the dataset content in ISO 8601 format preferably with timezone designators, e.g. `2000-10-31T01:30:00Z`. | +| **`updated`** | `ISO date/time string` | | Contains the date of last update of the dataset content in ISO 8601 format preferably with timezone designators, e.g. `2000-10-31T01:30:00Z`. | | **`description`** | `string` | **✓** | Details of what the resource is. For a dataset, this attribute explains what the data represents and what it can be used for. | | **`copyrightHolder`** | `string` | | The party holding the legal copyright. Empty by default. | | **`name`** | `string` | **✓** | Descriptive name or title of the asset. | @@ -102,8 +102,8 @@ This object holds information describing the actual asset. | **`license`** | `string` | **✓** | Short name referencing the license of the asset (e.g. Public Domain, CC-0, CC-BY, No License Specified, etc. ). If it's not specified, the following value will be added: "No License Specified". | | **`links`** | Array of `string` | | Mapping of URL strings for data samples, or links to find out more information. Links may be to either a URL or another asset. | | **`contentLanguage`** | `string` | | The language of the content. Use one of the language codes from the [IETF BCP 47 standard](https://tools.ietf.org/html/bcp47) | -| **`categories`** | Array of `string` | | Optional array of categories associated to the asset. Note: recommended to use `tags` instead of this. | | **`tags`** | Array of `string` | | Array of keywords or tags used to describe this content. Empty by default. | +| **`categories`** | Array of `string` | | Array of categories associated to the asset. Note: recommended to use `tags` instead of this. | | **`additionalInformation`** | Object | | Stores additional information, this is customizable by publisher | | **`algorithm`** | [Algorithm Metadata](#algorithm-metadata) | **✓** (for algorithm assets only) | Information about asset of `type` `algorithm` | @@ -180,13 +180,13 @@ An asset should have at least one service to be actually accessible, and can hav | **`description`** | `string` | | Service description | | **`datatokenAddress`** | `string` | **✓** | Datatoken address | | **`serviceEndpoint`** | `string` | **✓** | Provider URL (schema + host) | -| **`files`** | [string](#files) | **✓** | Encrypted file URLs. | +| **`files`** | [Files](#files) | **✓** | Encrypted file URLs. | | **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of `0` represents no time limit. Expressed in seconds. | | **`compute`** | [Compute](#compute-options) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings & resources. | #### Files -The `files` field is returned as a string which holds the encrypted file URLs. +The `files` field is returned as a `string` which holds the encrypted file URLs. Example: @@ -223,26 +223,26 @@ This only concerns metadata about a file, but never the file URLs. The only way An asset with a service of `type` `compute` has the following additional attributes under the `compute` object. This object is required if the asset is of `type` `compute`, but can be omitted for `type` of `access`. -| Attribute | Type | Required | Description | -| ------------------------------------------ | ------------------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`namespace`** | `string` | **✓** | Namespaced used for the compute job. Defaults to 'ocean-compute'. | -| **`cpus`** | `number` | | Maximum number of CPUs allocated for a job | -| **`gpus`** | `number` | | Maximum number of GPUs allocated for a job | -| **`gpuType`** | `string` | | Type of GPU (if any) | -| **`memory`** | `string` | | Maximum amount of memory allocated for a job. You can express memory as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. For example, the following represent roughly the same value: 128974848, 129e6, 129M, 123Mi | -| **`volumeSize`** | `string` | | Amount of disk space allocated. You can express it as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. | -| **`allowRawAlgorithm`** | `boolean` | **✓** | If `true`, any passed raw text will be allowed to run. Useful for an algorithm drag & drop use case, but increases risk of data escape through malicious user input. Should be `false` by default in all implementations. | -| **`allowNetworkAccess`** | `boolean` | **✓** | If `true`, the algorithm job will have network access. | -| **`publisherTrustedAlgorithmPublishers `** | Array of `string` | **✓** | If empty, then any published algorithm is allowed. Otherwise, only published algorithms by some publishers are allowed | -| **`publisherTrustedAlgorithms `** | Array of `publisherTrustedAlgorithms` | **✓** | If empty, then any published algorithm is allowed. (see below) | +| Attribute | Type | Required | Description | +| ------------------------------------------ | ------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| **`namespace`** | `string` | **✓** | Namespace used for the compute job. Defaults to 'ocean-compute'. | +| **`cpus`** | `number` | | Maximum number of CPUs allocated for a job. | +| **`gpus`** | `number` | | Maximum number of GPUs allocated for a job. | +| **`gpuType`** | `string` | | Type of GPU (if any). | +| **`memory`** | `string` | | Maximum amount of memory allocated for a job. You can express memory as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. For example, the following represent roughly the same value: 128974848, 129e6, 129M, 123Mi. | +| **`volumeSize`** | `string` | | Amount of disk space allocated. You can express it as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. | +| **`allowRawAlgorithm`** | `boolean` | **✓** | If `true`, any passed raw text will be allowed to run. Useful for an algorithm drag & drop use case, but increases risk of data escape through malicious user input. Should be `false` by default in all implementations. | +| **`allowNetworkAccess`** | `boolean` | **✓** | If `true`, the algorithm job will have network access. | +| **`publisherTrustedAlgorithmPublishers `** | Array of `string` | **✓** | If empty, then any published algorithm is allowed. Otherwise, only published algorithms by some publishers are allowed. | +| **`publisherTrustedAlgorithms `** | Array of `publisherTrustedAlgorithms` | **✓** | If empty, then any published algorithm is allowed. (see below). | The `publisherTrustedAlgorithms ` is an array of objects with the following structure: -| Attribute | Type | Required | Description | -| ------------------------------ | -------- | -------- | ------------------------------------------------------------------------ | -| **`did`** | `string` | **✓** | The DID of the algorithm which is trusted by the publisher. | -| **`filesChecksum`** | `string` | **✓** | Hash of algorithm's `files` section (as `string`) | -| **`containerSectionChecksum`** | `string` | **✓** | Hash of algorithm's `metadata.algorithm.container` section (as `string`) | +| Attribute | Type | Required | Description | +| ------------------------------ | -------- | -------- | ------------------------------------------------------------------------- | +| **`did`** | `string` | **✓** | The DID of the algorithm which is trusted by the publisher. | +| **`filesChecksum`** | `string` | **✓** | Hash of algorithm's `files` section (as `string`). | +| **`containerSectionChecksum`** | `string` | **✓** | Hash of algorithm's `metadata.algorithm.container` section (as `string`). | To produce `filesChecksum`: @@ -308,9 +308,9 @@ Example: ### Credentials -By default, a consumer can access a resource if they have 1.0 datatokens. _Credentials_ allow the publisher to optionally specify finer-grained permissions. +By default, a consumer can access a resource if they have 1 datatoken. _Credentials_ allow the publisher to optionally specify more fine-grained permissions. -Consider a medical data use case, where only a credentialed EU researcher can legally access a given dataset. Ocean supports this as follows: a consumer can only access the resource if they have 1.0 datatokens _and_ one of the specified `"allow"` credentials. +Consider a medical data use case, where only a credentialed EU researcher can legally access a given dataset. Ocean supports this as follows: a consumer can only access the resource if they have 1 datatoken _and_ one of the specified `"allow"` credentials. This is like going to an R-rated movie, where you can only get in if you show both your movie ticket (datatoken) _and_ some identification showing you're old enough (credential). @@ -404,7 +404,7 @@ The `nft` object contains information about the ERC721 NFT contract which repres | **`symbol`** | `string` | Symbol of NFT set in contract. | | **`owner`** | `string` | ETH account address of the NFT owner. | | **`state`** | `number` | State of the asset reflecting the NFT contract value. See [State](#state) | -| **`created`** | `ISO Date Time string` | Contains the date of NFT creation | +| **`created`** | `ISO date/time string` | Contains the date of NFT creation. | Example: diff --git a/src/templates/Doc.jsx b/src/templates/Doc.jsx index 8332d655..fc10c403 100644 --- a/src/templates/Doc.jsx +++ b/src/templates/Doc.jsx @@ -118,7 +118,7 @@ export const pageQuery = graphql` query DocBySlug($slug: String!) { markdownRemark(fields: { slug: { eq: $slug } }) { id - tableOfContents(maxDepth: 2) + tableOfContents(maxDepth: 3) html htmlAst frontmatter { From 772bae1b358d4ca00d22076ae598611da113a6ad Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Fri, 12 Nov 2021 07:11:11 -0800 Subject: [PATCH 066/145] add isInPurgatory --- content/concepts/did-ddo.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index fb72ca0a..ae59635d 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -478,13 +478,15 @@ The `stats` section contains different statistics fields. | Attribute | Type | Description | | -------------- | -------- | ------------------------------------------------------------------------------------------------------------- | | **`consumes`** | `number` | How often an asset was consumed, meaning how often it was either downloaded or used as part of a compute job. | +| **`isInPurgatory`** | `string` | If asset is listed in purgatory and reason | Example: ```json { "stats": { - "consumes": 4 + "consumes": 4, + "isInPurgatory": "false" } } ``` @@ -598,7 +600,8 @@ Example: }, "stats": { - "consumes": 4 + "consumes": 4, + "isInPurgatory": "false" } } ``` From 9fbf94df4cfec5b3de123e4104332e2a9928e6b7 Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Tue, 16 Nov 2021 18:47:02 +0200 Subject: [PATCH 067/145] fix typo --- content/concepts/did-ddo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index ae59635d..9a11bfae 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -411,7 +411,7 @@ Example: ```json { "nft": { - "adddress": "0x000000", + "address": "0x000000", "name": "Ocean Protocol Asset v4", "symbol": "OCEAN-A-v4", "owner": "0x0000000", From 68f0d2546bbd842f8286a4cea5de523870208df8 Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Tue, 16 Nov 2021 18:47:29 +0200 Subject: [PATCH 068/145] fix typo --- content/concepts/did-ddo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 9a11bfae..a692ddde 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -438,7 +438,7 @@ Example: { "datatokens": [ { - "adddress": "0x000000", + "address": "0x000000", "name": "Datatoken 1", "symbol": "DT-1", "serviceId": "1" From ef87473b3b858339370bfc8ead502302a886d61d Mon Sep 17 00:00:00 2001 From: mariacarmina <50501033+mariacarmina@users.noreply.github.com> Date: Tue, 16 Nov 2021 23:07:47 +0200 Subject: [PATCH 069/145] fix typos (#823) Fix some typos for `address` key. --- content/concepts/did-ddo.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index a692ddde..8be9d125 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -444,7 +444,7 @@ Example: "serviceId": "1" }, { - "adddress": "0x000001", + "address": "0x000001", "name": "Datatoken 2", "symbol": "DT-2", "serviceId": "2" @@ -568,7 +568,7 @@ Example: // Enhanced Aquarius response begins here "nft": { - "adddress": "0x000000", + "address": "0x000000", "name": "Ocean Protocol Asset v4", "symbol": "OCEAN-A-v4", "owner": "0x0000000", @@ -578,13 +578,13 @@ Example: "datatokens": [ { - "adddress": "0x000000", + "address": "0x000000", "name": "Datatoken 1", "symbol": "DT-1", "serviceId": "1" }, { - "adddress": "0x000001", + "address": "0x000001", "name": "Datatoken 2", "symbol": "DT-2", "serviceId": "2" From e3f42163a72d96ac7451bdf21dccc8e65474dde6 Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Wed, 17 Nov 2021 15:20:07 +0200 Subject: [PATCH 070/145] make sure that chainId is in decimal form --- content/concepts/did-ddo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 8be9d125..e7a2ff76 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -62,7 +62,7 @@ In Ocean, a DID is a string that looks like this: did:op:0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea ``` -The part after `did:op:` is the checksum of the ERC721 contract address and the chain the asset has been published to: +The part after `did:op:` is the checksum of the ERC721 contract address and the chainId (expressed as decimal) the asset has been published to: ```js const checksum = sha256(ERC721 contract address + chainId) From d171ef7f28ada9f3116b82a8668adb6038ad66ab Mon Sep 17 00:00:00 2001 From: Akshay Date: Sun, 28 Nov 2021 17:05:54 +0100 Subject: [PATCH 071/145] Issue-#701: V4 architecture diagram --- content/concepts/architecture.md | 22 ++++++++++++++++------ content/concepts/images/architecture.PNG | Bin 24047 -> 0 bytes content/concepts/images/architecture.png | Bin 0 -> 62956 bytes 3 files changed, 16 insertions(+), 6 deletions(-) delete mode 100644 content/concepts/images/architecture.PNG create mode 100644 content/concepts/images/architecture.png diff --git a/content/concepts/architecture.md b/content/concepts/architecture.md index 56f250f7..7a3e3697 100644 --- a/content/concepts/architecture.md +++ b/content/concepts/architecture.md @@ -1,24 +1,34 @@ --- title: Architecture Overview -description: Simplicity and Interoperability via a Datatokens Core +description: Simplicity and Interoperability via a DataNFT Core --- ## Overview Here is the Ocean architecture. -![Ocean Protocol tools architecture](images/architecture.PNG) +![Ocean Protocol tools architecture](images/architecture.png) Here’s an overview of the figure. -- The top layer is **applications** like Ocean Market. With these apps, users can onboard data services into crypto (publish and mint datatokens), hold datatokens as assets (data wallets), discover data assets and buy / sell datatokens for fixed or auto-determined price (data marketplaces), and consume data services (consume datatokens). -- Below that are **libraries** used by the applications: Ocean React hooks, JavaScript library, and Python library. This also includes middleware to assist discovery: Aquarius and (3rd party tool) TheGraph. -- The lowest level has the **smart contracts** used by the libraries. They’re deployed on Ethereum mainnet to start, and other networks later. +- The top layer is **applications** like Ocean Market. With these apps, users can onboard services like data, alogrithm, compute-to-data into crypto (publish and mint DataNFTs and Datatokens), hold datatokens as assets (data wallets), discover assets and buy / sell datatokens for fixed or auto-determined price (data marketplaces), and consume data services (consume datatokens). +- Below that are **libraries** used by the applications: Ocean.js (JavaScript library) and Ocean.py (Python library). This also includes middleware to assist discovery: + - **Aquarius**: Provides metadata cache for faster serach by caching on-chain data into elasticsearch + - **Provider**: Facilitates downloading assets, DDO encryption and communicating with `operater-service` for Compute-to-Data jobs. + - **TheGraph**: 3rd party tool +Developers can utilize the libraries to built thier custom applications and marketplaces. +- The lowest level has the **smart contracts** used by the libraries. They’re deployed on Ethereum mainnet, and other compatible networks. To see the list of supported networks click [here](/concepts/networks/). -Left to right are groupings of functionality: tools for datatokens, tools for markets (including pools), tools to consume data services and for metadata, and external ERC20 tools. +Left to right are groupings of functionality: tools for datatokens, tools for markets (including pools), tools to consume data services and for metadata, and external ERC20, ERC721 tools. The rest of this page elaborates. +## DataNFT + +DataNFTs are based on [ERC721](https://eips.ethereum.org/EIPS/eip-721) standard. The publisher can use Marketplace or client libraries to deploy a new DataNFT contract. To save gas fees, it uses [ERC1167](https://eips.ethereum.org/EIPS/eip-1167) proxy approach on the **ERC721 template**. Each DataNFT has a unique identifier. Publisher can then assign manager role to other ethereum addresses who can deploy new Datatoken contracts and even mint them. Each Datatoken contract is associated with one DataNFT contract. +Click [here](/concepts/nft/) to further read about DataNFTs and Datatokens. + + ## Datatokens & Access Control Tools The publisher actor holds the dataset in Google Drive, Dropbox, AWS S3, on their phone, on their home server, etc. The dataset has a URL. The publisher can optionally use IPFS for a content-addressable URL. Or instead of a file, the publisher may run a compute-to-data service. diff --git a/content/concepts/images/architecture.PNG b/content/concepts/images/architecture.PNG deleted file mode 100644 index d5a5d0850935778eb6de7adef13d335e3bb847d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24047 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 KxLVCN{J#K Date: Sun, 28 Nov 2021 17:34:38 +0100 Subject: [PATCH 072/145] Issue-#701: Rename file --- .../images/{architechture.png => architecture.png} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename content/concepts/images/{architechture.png => architecture.png} (100%) diff --git a/content/concepts/images/architechture.png b/content/concepts/images/architecture.png similarity index 100% rename from content/concepts/images/architechture.png rename to content/concepts/images/architecture.png From c8716ce8ae75a2d84293253cfba43a2bed614fb1 Mon Sep 17 00:00:00 2001 From: Akshay Date: Sun, 28 Nov 2021 17:56:40 +0100 Subject: [PATCH 073/145] Issue-#701: Architecture --- content/concepts/architecture.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/content/concepts/architecture.md b/content/concepts/architecture.md index 7a3e3697..e5fb14bb 100644 --- a/content/concepts/architecture.md +++ b/content/concepts/architecture.md @@ -25,17 +25,17 @@ The rest of this page elaborates. ## DataNFT -DataNFTs are based on [ERC721](https://eips.ethereum.org/EIPS/eip-721) standard. The publisher can use Marketplace or client libraries to deploy a new DataNFT contract. To save gas fees, it uses [ERC1167](https://eips.ethereum.org/EIPS/eip-1167) proxy approach on the **ERC721 template**. Each DataNFT has a unique identifier. Publisher can then assign manager role to other ethereum addresses who can deploy new Datatoken contracts and even mint them. Each Datatoken contract is associated with one DataNFT contract. +DataNFTs are based on [ERC721](https://eips.ethereum.org/EIPS/eip-721) standard. The publisher can use Marketplace or client libraries to deploy a new DataNFT contract. To save gas fees, it uses [ERC1167](https://eips.ethereum.org/EIPS/eip-1167) proxy approach on the **ERC721 template**. Publisher can then assign manager role to other ethereum addresses who can deploy new Datatoken contracts and even mint them. Each Datatoken contract is associated with one DataNFT contract. Click [here](/concepts/nft/) to further read about DataNFTs and Datatokens. ## Datatokens & Access Control Tools -The publisher actor holds the dataset in Google Drive, Dropbox, AWS S3, on their phone, on their home server, etc. The dataset has a URL. The publisher can optionally use IPFS for a content-addressable URL. Or instead of a file, the publisher may run a compute-to-data service. +The asset can be a dataset or an algorithm. The publisher actor holds the asset in Google Drive, Dropbox, AWS S3, on their phone, on their home server, etc. The publisher can optionally use IPFS for a content-addressable URL. Or instead of a file, the publisher may run a compute-to-data service. In the **publish** step, the publisher invokes **Ocean Datatoken Factory** to deploy a new datatoken to the chain. To save gas fees, it uses [ERC1167](https://eips.ethereum.org/EIPS/eip-1167) proxy approach on the **ERC20 datatoken template**. The publisher then mints datatokens. -The publisher runs **Ocean Provider**. In the **consume** step, Provider software needs to retrieve the data service URL given a datatoken address. One approach would be for the publisher to run a database; however this adds another dependency. To avoid this, it stores the URL on-chain. So that others don’t see that URL, it encrypts it. +The publisher runs their own **Ocean Provider** or can use one deployed by Ocean Protocol. In the **consume** step, Provider software needs to retrieve the data service URL given a datatoken address. One approach would be for the publisher to run a database; however this adds another dependency. To avoid this, Provider encrypts the URL and it URL on-chain. To initiate the **consume** step, the data consumer sends 1.0 datatokens to the Provider wallet. Then they make a service request to the Provider. The Provider loads the encrypted URL, decrypts it, and provisions the requested service (send static data, or enable a compute-to-data job). @@ -69,9 +69,9 @@ Complementary to Ocean Market, Ocean has reference code to ease building **third Metadata (name of dataset, date created etc.) is used by marketplaces for data asset discovery. Each data asset can have a [decentralized identifier](https://w3c-ccg.github.io/did-spec/) (DID) that resolves to a DID document (DDO) for associated metadata. The DDO is essentially [JSON](https://www.json.org/) filling in metadata fields. For more details on working with OCEAN DIDs check out the [DID concept documentation](https://docs.oceanprotocol.com/concepts/did-ddo/). The [DDO Metadata documentation](https://docs.oceanprotocol.com/concepts/ddo-metadata/) goes into more depth regarding metadata structure. -[OEP8](https://github.com/oceanprotocol/OEPs/tree/master/8) specifies Ocean metadata schema, including fields that must be filled. It’s based on the public [DataSet schema from schema.org](https://schema.org/Dataset). +[OEP8](/concepts/did-ddo/) specifies Ocean metadata schema, including fields that must be filled. It’s based on the public [DataSet schema from schema.org](https://schema.org/Dataset). -Ocean uses the Ethereum mainnet as an **on-chain metadata store**, i.e. to store both DID and DDO. This means that once the write fee is paid, there are no further expenses or dev-ops work needed to ensure metadata availability into the future, aiding in the discoverability of data assets. It also simplifies integration with the rest of the Ocean system, which is Ethereum-based. Storage cost on Ethereum mainnet is not negligible, but not prohibitive and the other benefits are currently worth the tradeoff compared to alternatives. +Ocean uses the Ethereum mainnet and other compatible networks as an **on-chain metadata store**, i.e. to store both DID and DDO. This means that once the write fee is paid, there are no further expenses or dev-ops work needed to ensure metadata availability into the future, aiding in the discoverability of data assets. It also simplifies integration with the rest of the Ocean system, which is Ethereum-based. Storage cost on Ethereum mainnet is not negligible, but not prohibitive and the other benefits are currently worth the tradeoff compared to alternatives. Due to the permissionless, decentralized nature of data on Ethereum mainnet, any last-mile tool can access metadata. **Ocean Aquarius** supports different metadata fields for each different Ocean-based marketplace. Developers could also use [TheGraph](https://www.thegraph.com) to see metadata fields that are common across all marketplaces. From 3669df9177c471b28a7e890bb6d863d75bf43719 Mon Sep 17 00:00:00 2001 From: Akshay Date: Sun, 28 Nov 2021 18:10:15 +0100 Subject: [PATCH 074/145] Issue-701: Update links --- content/concepts/architecture.md | 2 +- content/concepts/{nft.md => data-nft.md} | 9 ++++----- data/sidebars/concepts.yml | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) rename content/concepts/{nft.md => data-nft.md} (88%) diff --git a/content/concepts/architecture.md b/content/concepts/architecture.md index e5fb14bb..c6914277 100644 --- a/content/concepts/architecture.md +++ b/content/concepts/architecture.md @@ -26,7 +26,7 @@ The rest of this page elaborates. ## DataNFT DataNFTs are based on [ERC721](https://eips.ethereum.org/EIPS/eip-721) standard. The publisher can use Marketplace or client libraries to deploy a new DataNFT contract. To save gas fees, it uses [ERC1167](https://eips.ethereum.org/EIPS/eip-1167) proxy approach on the **ERC721 template**. Publisher can then assign manager role to other ethereum addresses who can deploy new Datatoken contracts and even mint them. Each Datatoken contract is associated with one DataNFT contract. -Click [here](/concepts/nft/) to further read about DataNFTs and Datatokens. +Click [here](/concepts/data-nft/) to further read about DataNFTs and Datatokens. ## Datatokens & Access Control Tools diff --git a/content/concepts/nft.md b/content/concepts/data-nft.md similarity index 88% rename from content/concepts/nft.md rename to content/concepts/data-nft.md index 0cea874a..394bf4d2 100644 --- a/content/concepts/nft.md +++ b/content/concepts/data-nft.md @@ -52,8 +52,7 @@ Alice is the author of a book. Alice wants to hold the copyright of her work but ## Other References -- https://en.wikipedia.org/wiki/Non-fungible_token -- https://blog.oceanprotocol.com/nfts-ip-1-practical-connections-of-erc721-with-intellectual-property-dc216aaf005d -- https://blog.oceanprotocol.com/nfts-ip-2-leveraging-erc20-fungibility-bcee162290e3 -- https://blog.oceanprotocol.com/nfts-ip-3-combining-erc721-erc20-b69ea659115e -- https://blog.oceanprotocol.com/on-difficult-to-explain-fungibility-sightings-in-nfts-26bc18620f70 +- [Practical Connections of ERC721 with Intellectual Property](https://blog.oceanprotocol.com/nfts-ip-1-practical-connections-of-erc721-with-intellectual-property-dc216aaf005d) +- [Leveraging ERC20 Fungibility](https://blog.oceanprotocol.com/nfts-ip-2-leveraging-erc20-fungibility-bcee162290e3) +- [Combining ERC721 & ERC20](https://blog.oceanprotocol.com/nfts-ip-3-combining-erc721-erc20-b69ea659115e) +- [Fungibility sightings in NFTs](https://blog.oceanprotocol.com/on-difficult-to-explain-fungibility-sightings-in-nfts-26bc18620f70) diff --git a/data/sidebars/concepts.yml b/data/sidebars/concepts.yml index c90edef4..b9d5a48d 100644 --- a/data/sidebars/concepts.yml +++ b/data/sidebars/concepts.yml @@ -7,7 +7,7 @@ - title: Architecture Overview link: /concepts/architecture/ - title: Data NFTs - link: /concepts/nft/ + link: /concepts/data-nft/ - title: Supported Networks link: /concepts/networks/ - title: Deployments From e14ee28b05253ac86af9eea9d11d31f5a266fe6f Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Mon, 29 Nov 2021 16:13:42 +0000 Subject: [PATCH 075/145] move purgatory, add NFT tokenURI, service ID --- content/concepts/did-ddo.md | 46 ++++++++++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index e7a2ff76..b2ab357e 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -262,6 +262,7 @@ Example: { "services": [ { + "id": "1", "type": "access", "files": "0x044736da6dae39889ff570c34540f24e5e084f...", "name": "Download service", @@ -271,6 +272,7 @@ Example: "timeout": 0 }, { + "id": "2", "type": "compute", "files": "0x6dd05e0edb460623c843a263291ebe757c1eb3...", "name": "Compute service", @@ -471,6 +473,34 @@ Example: } ``` +### Purgatory + +Contains information about an asset's purgatory status defined in [`list-purgatory`](https://github.com/oceanprotocol/list-purgatory). Marketplace interfaces are encouraged to prevent certain user actions like adding liquidity on assets in purgatory. + +| Attribute | Type | Description | +| ------------ | --------- | --------------------------------------------------------------------------------------------- | +| **`state`** | `boolean` | If `true`, asset is in purgatory. | +| **`reason`** | `string` | If asset is in purgatory, contains the reason for being there as defined in `list-purgatory`. | + +Example: + +```json +{ + "purgatory": { + "state": true, + "reason": "Copyright violation" + } +} +``` + +```json +{ + "purgatory": { + "state": false + } +} +``` + ### Statistics The `stats` section contains different statistics fields. @@ -478,15 +508,13 @@ The `stats` section contains different statistics fields. | Attribute | Type | Description | | -------------- | -------- | ------------------------------------------------------------------------------------------------------------- | | **`consumes`** | `number` | How often an asset was consumed, meaning how often it was either downloaded or used as part of a compute job. | -| **`isInPurgatory`** | `string` | If asset is listed in purgatory and reason | Example: ```json { "stats": { - "consumes": 4, - "isInPurgatory": "false" + "consumes": 4 } } ``` @@ -510,6 +538,7 @@ Example: }, "services": [ { + "id": "1", "type": "access", "files": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", "name": "Download service", @@ -519,6 +548,7 @@ Example: "timeout": 0 }, { + "id": "2", "type": "compute", "files": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", "name": "Compute service", @@ -573,7 +603,8 @@ Example: "symbol": "OCEAN-A-v4", "owner": "0x0000000", "state": 0, - "created": "2000-10-31T01:30:00" + "created": "2000-10-31T01:30:00", + "tokenURI": "xxx" }, "datatokens": [ @@ -599,9 +630,12 @@ Example: "datetime": "2000-10-31T01:30:00" }, + "purgatory": { + "state": false + }, + "stats": { - "consumes": 4, - "isInPurgatory": "false" + "consumes": 4 } } ``` From e0111575df9e93e96b3b54362078ea14c7fed7a7 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Fri, 3 Dec 2021 00:30:27 -0800 Subject: [PATCH 076/145] add multiple storage types --- content/concepts/did-ddo.md | 60 +++++++++++++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index b2ab357e..d81294c6 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -196,12 +196,68 @@ Example: } ``` -During the publish process, file URLs must be encrypted with a respective _Provider_ API call before storing the DDO on-chain. For this an array of strings with one or multiple URLs is what gets encrypted and send to _Provider_: +During the publish process, file URLs must be encrypted with a respective _Provider_ API call before storing the DDO on-chain. For this an array of objects defining the storage access details are sent. +Type of objects supported : + + + + + + + + + + +
KeyDescriptionExample
'url'Static URL. Contains url and HTTP method ```json -["https://url.com/file1.csv", "https://url.com/file2.csv"] +[ + { + "url":{ + "url":"https://url.com/file1.csv", + "method":"GET" + } + }, + { + "url":{ + "url":"https://url.com/file2.csv", + "method":"POST" + } + } +] ``` +
+ +First class integrations supported in the future : + + + + + + + + + + + + + + + +
KeyDescriptionExample
"ipfs"IPFS files + + ```json +[ + { "ipfs": { "hash":"XXX"}} +] +``` +
"filecoin"Filecoin storage 
"arwave"Arwave 
"storj"Storj 
"sql"Sql connection, dataset is generated by a query 
+ + +A service can contain multiple files, using multiple storage types. + + To get information about the files after encryption, the `/fileinfo` endpoint of _Provider_ returns based on a passed DID an array of file metadata: ```json From 523a2875dd36655e429a0aeb7d44b695427bb036 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Fri, 3 Dec 2021 00:32:15 -0800 Subject: [PATCH 077/145] add multi type example --- content/concepts/did-ddo.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index d81294c6..1d59608f 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -257,6 +257,22 @@ First class integrations supported in the future : A service can contain multiple files, using multiple storage types. +Example: +```json +[ + { + "url":{ + "url":"https://url.com/file1.csv", + "method":"GET" + } + }, + { + "ipfs":{ + "hash":"XXXX" + } + } +] +``` To get information about the files after encryption, the `/fileinfo` endpoint of _Provider_ returns based on a passed DID an array of file metadata: From 1e2c782e13dd836842d349c54ba52c82b28eda65 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Fri, 3 Dec 2021 00:35:20 -0800 Subject: [PATCH 078/145] fix lint --- content/concepts/did-ddo.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 1d59608f..74960eb8 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -246,6 +246,7 @@ First class integrations supported in the future : { "ipfs": { "hash":"XXX"}} ] ``` + "filecoin"Filecoin storage  @@ -258,6 +259,7 @@ First class integrations supported in the future : A service can contain multiple files, using multiple storage types. Example: + ```json [ { From 4cb2d017d3a309b287bb822a4f8fb1e483676bfe Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Fri, 3 Dec 2021 00:37:28 -0800 Subject: [PATCH 079/145] formatting --- content/concepts/did-ddo.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 74960eb8..8ccee86a 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -197,6 +197,8 @@ Example: ``` During the publish process, file URLs must be encrypted with a respective _Provider_ API call before storing the DDO on-chain. For this an array of objects defining the storage access details are sent. + + Type of objects supported : From 0bfb12c403334131e8c8037de59bc8f3cd42c2b8 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Fri, 3 Dec 2021 00:39:46 -0800 Subject: [PATCH 080/145] add details to fileinfo --- content/concepts/did-ddo.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 8ccee86a..aff47921 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -278,15 +278,17 @@ Example: ] ``` -To get information about the files after encryption, the `/fileinfo` endpoint of _Provider_ returns based on a passed DID an array of file metadata: +To get information about the files after encryption, the `/fileinfo` endpoint of _Provider_ returns based on a passed DID an array of file metadata (based on the file type): ```json [ { + "type":"url", "contentLength": 100, "contentType": "application/json" }, { + "type":"url", "contentLength": 130, "contentType": "application/text" } From 93abc7db1a7a4d9b8ad6ba69a5f0598ad990424b Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Fri, 3 Dec 2021 00:41:06 -0800 Subject: [PATCH 081/145] formatting --- content/concepts/did-ddo.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index aff47921..58d660c6 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -214,15 +214,15 @@ Type of objects supported : ```json [ { - "url":{ - "url":"https://url.com/file1.csv", - "method":"GET" + "url": { + "url": "https://url.com/file1.csv", + "method": "GET" } }, { - "url":{ - "url":"https://url.com/file2.csv", - "method":"POST" + "url": { + "url": "https://url.com/file2.csv", + "method": "POST" } } ] @@ -245,7 +245,7 @@ First class integrations supported in the future : ```json [ - { "ipfs": { "hash":"XXX"}} + { "ipfs": { "hash": "XXX"}} ] ``` @@ -266,13 +266,13 @@ Example: [ { "url":{ - "url":"https://url.com/file1.csv", - "method":"GET" + "url": "https://url.com/file1.csv", + "method": "GET" } }, { - "ipfs":{ - "hash":"XXXX" + "ipfs": { + "hash": "XXXX" } } ] @@ -283,12 +283,12 @@ To get information about the files after encryption, the `/fileinfo` endpoint of ```json [ { - "type":"url", + "type": "url", "contentLength": 100, "contentType": "application/json" }, { - "type":"url", + "type": "url", "contentLength": 130, "contentType": "application/text" } From 9b9fc01192cc42682fa3415b447910abe7501517 Mon Sep 17 00:00:00 2001 From: Akshay Date: Fri, 3 Dec 2021 15:51:52 +0100 Subject: [PATCH 082/145] Issue-#701: Data NFT and datatoken --- content/concepts/architecture.md | 19 ++++++++----------- .../{data-nft.md => datanft-and-datatoken.md} | 0 data/sidebars/concepts.yml | 4 ++-- 3 files changed, 10 insertions(+), 13 deletions(-) rename content/concepts/{data-nft.md => datanft-and-datatoken.md} (100%) diff --git a/content/concepts/architecture.md b/content/concepts/architecture.md index c6914277..8d483294 100644 --- a/content/concepts/architecture.md +++ b/content/concepts/architecture.md @@ -1,6 +1,6 @@ --- title: Architecture Overview -description: Simplicity and Interoperability via a DataNFT Core +description: Data NFTs and Datatokens architecture --- ## Overview @@ -11,27 +11,24 @@ Here is the Ocean architecture. Here’s an overview of the figure. -- The top layer is **applications** like Ocean Market. With these apps, users can onboard services like data, alogrithm, compute-to-data into crypto (publish and mint DataNFTs and Datatokens), hold datatokens as assets (data wallets), discover assets and buy / sell datatokens for fixed or auto-determined price (data marketplaces), and consume data services (consume datatokens). +- The top layer is **applications** like Ocean Market. With these apps, users can onboard services like data, alogrithm, compute-to-data into crypto (publish and mint data NFTs and datatokens), hold datatokens as assets (data wallets), discover assets and buy / sell datatokens for fixed or auto-determined price (data marketplaces), and consume data services (consume datatokens). - Below that are **libraries** used by the applications: Ocean.js (JavaScript library) and Ocean.py (Python library). This also includes middleware to assist discovery: - - **Aquarius**: Provides metadata cache for faster serach by caching on-chain data into elasticsearch + - **Aquarius**: Provides metadata cache for faster search by caching on-chain data into elasticsearch - **Provider**: Facilitates downloading assets, DDO encryption and communicating with `operater-service` for Compute-to-Data jobs. - **TheGraph**: 3rd party tool Developers can utilize the libraries to built thier custom applications and marketplaces. - The lowest level has the **smart contracts** used by the libraries. They’re deployed on Ethereum mainnet, and other compatible networks. To see the list of supported networks click [here](/concepts/networks/). -Left to right are groupings of functionality: tools for datatokens, tools for markets (including pools), tools to consume data services and for metadata, and external ERC20, ERC721 tools. - The rest of this page elaborates. -## DataNFT +## Data NFTs, Datatokens and Access Control Tools -DataNFTs are based on [ERC721](https://eips.ethereum.org/EIPS/eip-721) standard. The publisher can use Marketplace or client libraries to deploy a new DataNFT contract. To save gas fees, it uses [ERC1167](https://eips.ethereum.org/EIPS/eip-1167) proxy approach on the **ERC721 template**. Publisher can then assign manager role to other ethereum addresses who can deploy new Datatoken contracts and even mint them. Each Datatoken contract is associated with one DataNFT contract. -Click [here](/concepts/data-nft/) to further read about DataNFTs and Datatokens. +Data NFTs are based on [ERC721](https://eips.ethereum.org/EIPS/eip-721) standard. The publisher can use Marketplace or client libraries to deploy a new data NFT contract. To save gas fees, it uses [ERC1167](https://eips.ethereum.org/EIPS/eip-1167) proxy approach on the **ERC721 template**. Publisher can then assign manager role to other ethereum addresses who can deploy new datatoken contracts and even mint them. Each Datatoken contract is associated with one data NFT contract. +Click [here](/concepts/datanft-and-datatoken/) to further read about data NFTs and datatokens. +ERC721 data NFTs represent holding copyright / base IP of a data asset, and ERC20 datatokens represent licenses to consume the data asset. -## Datatokens & Access Control Tools - -The asset can be a dataset or an algorithm. The publisher actor holds the asset in Google Drive, Dropbox, AWS S3, on their phone, on their home server, etc. The publisher can optionally use IPFS for a content-addressable URL. Or instead of a file, the publisher may run a compute-to-data service. +Datatoken represents the asset which the publisher want to monetize. The asset can be a dataset or an algorithm. The publisher actor holds the asset in Google Drive, Dropbox, AWS S3, on their phone, on their home server, etc. The publisher can optionally use IPFS for a content-addressable URL. Or instead of a file, the publisher may run a compute-to-data service. In the **publish** step, the publisher invokes **Ocean Datatoken Factory** to deploy a new datatoken to the chain. To save gas fees, it uses [ERC1167](https://eips.ethereum.org/EIPS/eip-1167) proxy approach on the **ERC20 datatoken template**. The publisher then mints datatokens. diff --git a/content/concepts/data-nft.md b/content/concepts/datanft-and-datatoken.md similarity index 100% rename from content/concepts/data-nft.md rename to content/concepts/datanft-and-datatoken.md diff --git a/data/sidebars/concepts.yml b/data/sidebars/concepts.yml index b9d5a48d..ce6ecf98 100644 --- a/data/sidebars/concepts.yml +++ b/data/sidebars/concepts.yml @@ -6,8 +6,8 @@ link: /concepts/quickstart/ - title: Architecture Overview link: /concepts/architecture/ - - title: Data NFTs - link: /concepts/data-nft/ + - title: Data NFT and Datatoken + link: /concepts/datanft-and-datatoken/ - title: Supported Networks link: /concepts/networks/ - title: Deployments From 0160fddb49c4c6d78918c2c3ff977593a754ec0b Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Tue, 7 Dec 2021 02:06:32 -0800 Subject: [PATCH 083/145] update --- content/concepts/did-ddo.md | 37 ++++++++++++++++--------------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 58d660c6..d4c41f55 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -203,7 +203,7 @@ Type of objects supported :
- + @@ -214,16 +214,9 @@ Type of objects supported : ```json [ { - "url": { - "url": "https://url.com/file1.csv", - "method": "GET" - } - }, - { - "url": { - "url": "https://url.com/file2.csv", - "method": "POST" - } + "type": "url", + "url": "https://url.com/file1.csv", + "method": "GET" } ] ``` @@ -235,7 +228,7 @@ First class integrations supported in the future :
KeyType Description Example
- + @@ -245,7 +238,10 @@ First class integrations supported in the future : ```json [ - { "ipfs": { "hash": "XXX"}} + { + "type":"ipfs", + "hash": "XXX" + } ] ``` @@ -265,15 +261,14 @@ Example: ```json [ { - "url":{ - "url": "https://url.com/file1.csv", - "method": "GET" - } + "type": "url", + "url": "https://url.com/file1.csv", + "method": "GET" + }, { - "ipfs": { - "hash": "XXXX" - } + "type": "ipfs", + "hash": "XXXX" } ] ``` @@ -288,7 +283,7 @@ To get information about the files after encryption, the `/fileinfo` endpoint of "contentType": "application/json" }, { - "type": "url", + "type": "ipfs", "contentLength": 130, "contentType": "application/text" } From ad25e34aac20624cc83a404780d81a6cc4cc1c71 Mon Sep 17 00:00:00 2001 From: Akshay Date: Tue, 7 Dec 2021 11:26:05 +0100 Subject: [PATCH 084/145] ISsue-#701: Data NFT and datatoken docs --- content/concepts/datanft-and-datatoken.md | 44 ++++++++++-------- .../concepts/images/datanft-and-datatoken.png | Bin 0 -> 44985 bytes 2 files changed, 25 insertions(+), 19 deletions(-) create mode 100644 content/concepts/images/datanft-and-datatoken.png diff --git a/content/concepts/datanft-and-datatoken.md b/content/concepts/datanft-and-datatoken.md index 394bf4d2..fb53f149 100644 --- a/content/concepts/datanft-and-datatoken.md +++ b/content/concepts/datanft-and-datatoken.md @@ -1,9 +1,23 @@ --- -title: Data NFTs -description: Ocean Protocol uses ERC721 NFTs to represent the intellectual property (IP) of published datasets or algorithms, and to further sub-license access to it with user roles or ERC20 data tokens. +title: Data NFTs and Datatokens +description: In Ocean Protocol, ERC721 Data NFTs represent holding copyright / base IP of a data asset, and ERC20 datatokens represent licenses to consume the data asset. --- -A non-fungible token stored on the blockchain represents a unique asset. NFTs can represent images, videos, digital art, or any piece of information. NFTs can be traded and allow transfer of ownership and copyright. [EIP-721](https://eips.ethereum.org/EIPS/eip-721) defines an interface for handling NFTs on Ethereum blockchain. The creator of the NFT can deploy a new contract on Ethereum or any Blockchain supporting NFT related interface and also, transfer the ownership through transfer transactions. +A non-fungible token stored on the blockchain represents a unique asset. NFTs can represent images, videos, digital art, or any piece of information. NFTs can be traded, and allow transfer of copyright / base IP. [EIP-721](https://eips.ethereum.org/EIPS/eip-721) defines an interface for handling NFTs on EVM-compatible blockchains. The creator of the NFT can deploy a new contract on Ethereum or any Blockchain supporting NFT related interface and also, transfer the ownership of copyright / base IP through transfer transactions. + +Fungible tokens represent fungible assets. If you have 5 ETH and Alice has 5 ETH, you and Alice could swap your ETH and your final holdings remain the same. They're apples-to-apples. Licenses (contracts) to consume a copyrighted asset are naturally fungible - they can be swapped with each other. + +![Data NFT and Datatoken](images/datanft-and-datatoken.png) + + +## High-Level Architecture + +The image above describes how ERC721 DataNFTs, ERC20 datatokens, and AMMs relate. + +- Bottom: The publisher deploys an ERC721 dataNFT contract representing base IP for the data asset. They are now the manager of the dataNFT. +- Middle: The manager then deploys an ERC20 datatoken contract against the dataNFT. The ERC20 represents a license with specific terms like "can consume for the next 3 days". They could even publish further ERC20 datatoken contracts, to represent different license terms or for compute-to-data. +- Top: The manager then deploys a pool of the datatoken and OCEAN (or H2O), adds initial liquidity, and receives ERC20 pool tokens in return. Others may also add liquidity for receive pool tokens, i.e. become liquidity providers (LPs). + ## Terminology @@ -13,12 +27,10 @@ A non-fungible token stored on the blockchain represents a unique asset. NFTs ca - **To Publish**: Claim copyright or exclusive base license - **To Sub-license**:Transfer one (of many) sub-licenses to new licensee: ERC20.transfer(to=licensee, value=1.0) -## Supporting NFTs using Ocean Protocol +## Implementation in Ocean Protocol Ocean Protocol defines the [ERC721Factory](https://github.com/oceanprotocol/contracts/blob/v4main/contracts/ERC721Factory.sol) contract, allowing **Base IP holders** to create their ERC721 contract instances on any supported networks. The deployed contract stores Metadata, ownership, sub-license information, permissions. The creator of the contract can also create and mint ERC20 token instances for sub-licensing the **Base IP**. -## Sub-licensing the Base IP - ERC721 tokens are non-fungible, thus cannot be used for automatic price discovery like ERC20 tokens. ERC721 and ERC20 combined together can be used for sub-licensing. Ocean Protocol's [ERC721Template](https://github.com/oceanprotocol/contracts/blob/v4main/contracts/templates/ERC721Template.sol) solves this problem by using ERC721 for tokenizing the **Base IP** and tokenizing sub-licenses by using ERC20. Thus, sub-licenses can be traded on any AMM as the underlying contract is ERC20 compliant. ## Roles @@ -35,24 +47,18 @@ ERC721 tokens are non-fungible, thus cannot be used for automatic price discover ### Manager -- A public address with a `Magner` role can update the metadata +- A public address with a `Maganer` role can update the metadata - Can deploy new ERC20 contract which is associtated with the `ERC721` contract. -## Use case 1 - -Alice is the creator of a painting and wants to make sure that the ownership of her artwork is uniquely determined. She performs the **Publish** action. She creates an ERC721 token which represents the ownership of the physical asset. Here, **Base IP** is Alice's artwork. **Base IP holder** is Alice. Now, Alice wants to transfer the ownership of her Artwork to Bob. So, Alice makes Bob's address as owner of the token in the discussion by sending a Blockchain transaction. - -![Image 1](images/use-case-1.PNG) - -## Use case 2 - -Alice is the author of a book. Alice wants to hold the copyright of her work but, allows others to read her book. So, She creates 2 versions of her book namely: digital copy, physical copy. She assigns Bob as one of the holder of digital edition of the book. Here, **Base IP** is the book. **Base IP holder** is Alice and Bob is **Sub-licensee** for a digital edition of the book. Alice tokenizes her work by performing **Publish** action i.e _ERC721.safeMint(to=aliceWalletAddress, tokenid=1)_. Alice also creates sub-licenses of her book by creating two ERC20 tokens and transfers the digital copy token to Bob's wallet. +## High-Level Behavior ![Image 2](images/use-case-2.PNG) +Here's an example. Alice has created a dataset. In step 1, she publishes her dataset with Ocean: this means deploying an ERC721 data NFT contract (claiming copyright / base IP), then an ERC20 datatoken contract (license against base IP). Then in step 2, she mints some ERC20 datatokens and transfers 1.0 of them to Bob's wallet; now he has a license to be able to consume that dataset. + ## Other References -- [Practical Connections of ERC721 with Intellectual Property](https://blog.oceanprotocol.com/nfts-ip-1-practical-connections-of-erc721-with-intellectual-property-dc216aaf005d) -- [Leveraging ERC20 Fungibility](https://blog.oceanprotocol.com/nfts-ip-2-leveraging-erc20-fungibility-bcee162290e3) -- [Combining ERC721 & ERC20](https://blog.oceanprotocol.com/nfts-ip-3-combining-erc721-erc20-b69ea659115e) +- [Data & NFTs 1: Practical Connections of ERC721 with Intellectual Property](https://blog.oceanprotocol.com/nfts-ip-1-practical-connections-of-erc721-with-intellectual-property-dc216aaf005d) +- [Data & NFTs 2: Leveraging ERC20 Fungibility](https://blog.oceanprotocol.com/nfts-ip-2-leveraging-erc20-fungibility-bcee162290e3) +- [Data & NFTs 3: Combining ERC721 & ERC20](https://blog.oceanprotocol.com/nfts-ip-3-combining-erc721-erc20-b69ea659115e) - [Fungibility sightings in NFTs](https://blog.oceanprotocol.com/on-difficult-to-explain-fungibility-sightings-in-nfts-26bc18620f70) diff --git a/content/concepts/images/datanft-and-datatoken.png b/content/concepts/images/datanft-and-datatoken.png new file mode 100644 index 0000000000000000000000000000000000000000..e6034d7c5d03f0bbb044f91250cbd550a477009f GIT binary patch literal 44985 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 a=aMM;BTi||Ktd1yTgp$LD^$u^y!$_52HW=l literal 0 HcmV?d00001 From 913d117a301f6b7ec49035ecee7e865cf7437552 Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Tue, 28 Dec 2021 10:24:33 +0200 Subject: [PATCH 085/145] Add required nftAddress --- content/concepts/did-ddo.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index d4c41f55..aab0713c 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -62,7 +62,7 @@ In Ocean, a DID is a string that looks like this: did:op:0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea ``` -The part after `did:op:` is the checksum of the ERC721 contract address and the chainId (expressed as decimal) the asset has been published to: +The part after `did:op:` is the the ERC721 contract address(in checksum format) and the chainId (expressed as decimal) the asset has been published to: ```js const checksum = sha256(ERC721 contract address + chainId) @@ -82,6 +82,7 @@ A DDO in Ocean has these required attributes: | **`id`** | `string` | Computed as `sha256(address of ERC721 contract + chainId)`. | | **`version`** | `string` | Version information in [SemVer](https://semver.org) notation referring to this DDO spec version, like `4.0.0`. | | **`chainId`** | `number` | Stores chainId of the network the DDO was published to. | +| **`nftAddress`** | `string` | NFT contract linked to this asset | | **`metadata`** | [Metadata](#metadata) | Stores an object describing the asset. | | **`services`** | [Services](#services) | Stores an array of services defining access to the asset. | | **`credentials`** | [Credentials](#credentials) | Describes the credentials needed to access a dataset in addition to the `services` definition. | @@ -600,6 +601,7 @@ Example: "id": "did:op:ACce67694eD2848dd683c651Dab7Af823b7dd123", "version": "4.0.0", "chainId": 1, + "nftAddress": "0x123", "metadata": { "created": "2020-11-15T12:27:48Z", "updated": "2021-05-17T21:58:02Z", @@ -671,7 +673,7 @@ Example: // Enhanced Aquarius response begins here "nft": { - "address": "0x000000", + "address": "0x123", "name": "Ocean Protocol Asset v4", "symbol": "OCEAN-A-v4", "owner": "0x0000000", From b137fa718d19ec5e64059aefb246959c9fa9808b Mon Sep 17 00:00:00 2001 From: Akshay Date: Tue, 28 Dec 2021 11:09:16 +0100 Subject: [PATCH 086/145] ISsue-701-Create roles page --- content/concepts/roles.md | 21 +++++++++++++++++++++ data/sidebars/concepts.yml | 2 ++ 2 files changed, 23 insertions(+) create mode 100644 content/concepts/roles.md diff --git a/content/concepts/roles.md b/content/concepts/roles.md new file mode 100644 index 00000000..166567c2 --- /dev/null +++ b/content/concepts/roles.md @@ -0,0 +1,21 @@ +--- +title: Data NFTs and datatoken roles +description: Access to the data NFT and datatoken smart contract functions is controlled by the permssions stored on chain in the contracts. +--- + +## Roles in data NFT smart contract + +| Action ↓ / Role → | NFT Owner | Manager | ERC20 Deployer | Store Updater | Metadata Updater | +|-----------------------------------|--------------------|--------------------|--------------------|--------------------|--------------------| +| Set token URI |
| | | | | +| Add manager |
| | | | | +| Remove manager |
| | | | | +| Clean permissions |
| | | | | +| Set base URI |
| | | | | +| Set MetaData state | | | | |
| +| Set MetaData | | | | |
| +| Create new Datatoken | | |
| | | +| Executes any other smart contract | |
| | | | +| Set new key-value in store | | | |
| | + +## Roles in datatoken smart contract \ No newline at end of file diff --git a/data/sidebars/concepts.yml b/data/sidebars/concepts.yml index ce6ecf98..9bbd3f2e 100644 --- a/data/sidebars/concepts.yml +++ b/data/sidebars/concepts.yml @@ -8,6 +8,8 @@ link: /concepts/architecture/ - title: Data NFT and Datatoken link: /concepts/datanft-and-datatoken/ + - title: Roles + link: /concepts/roles/ - title: Supported Networks link: /concepts/networks/ - title: Deployments From d9e9164851b914a96c5ec736b117ea66d3013734 Mon Sep 17 00:00:00 2001 From: Akshay Date: Tue, 28 Dec 2021 12:27:34 +0100 Subject: [PATCH 087/145] Issue-#701: Fix lint issue --- content/concepts/roles.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/concepts/roles.md b/content/concepts/roles.md index 166567c2..ad31379d 100644 --- a/content/concepts/roles.md +++ b/content/concepts/roles.md @@ -18,4 +18,4 @@ description: Access to the data NFT and datatoken smart contract functions is co | Executes any other smart contract | |
| | | | | Set new key-value in store | | | |
| | -## Roles in datatoken smart contract \ No newline at end of file +## Roles in datatoken smart contract From e4abe7ae3e0a5948edf5b808d7029654a099286b Mon Sep 17 00:00:00 2001 From: Akshay Date: Tue, 4 Jan 2022 08:29:16 +0100 Subject: [PATCH 088/145] Issue-#721: Create ERC20 roles table --- content/concepts/roles.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/content/concepts/roles.md b/content/concepts/roles.md index ad31379d..317036a6 100644 --- a/content/concepts/roles.md +++ b/content/concepts/roles.md @@ -7,7 +7,7 @@ description: Access to the data NFT and datatoken smart contract functions is co | Action ↓ / Role → | NFT Owner | Manager | ERC20 Deployer | Store Updater | Metadata Updater | |-----------------------------------|--------------------|--------------------|--------------------|--------------------|--------------------| -| Set token URI |
| | | | | +| Set token URI | | | | | | | Add manager |
| | | | | | Remove manager |
| | | | | | Clean permissions |
| | | | | @@ -19,3 +19,17 @@ description: Access to the data NFT and datatoken smart contract functions is co | Set new key-value in store | | | |
| | ## Roles in datatoken smart contract + +| Action ↓ / Role → | ERC20 Deployer | Minter | NFT owner | Fee manager | +|--------------------------------|--------------------------|--------------------------|--------------------------|--------------------------| +| Deploy pool |
| | | | +| Create Fixed Rate exchange |
| | | | +| Create Dispenser |
| | | | +| Add minter |
| | | | +| Remove minter |
| | | | +| Add fee manager |
| | | | +| Remove fee manager |
| | | | +| Set data |
| | | | +| Clean permissions | | |
| | +| Mint | |
| | | +| Set fee collector | | | |
| From f219f2ac4fd2545a18b858dd820d3ea835a35c4f Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Thu, 6 Jan 2022 18:10:46 +0200 Subject: [PATCH 089/145] remove unnecessary compute service params --- content/concepts/did-ddo.md | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index aab0713c..0e7adfb6 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -299,12 +299,6 @@ An asset with a service of `type` `compute` has the following additional attribu | Attribute | Type | Required | Description | | ------------------------------------------ | ------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| **`namespace`** | `string` | **✓** | Namespace used for the compute job. Defaults to 'ocean-compute'. | -| **`cpus`** | `number` | | Maximum number of CPUs allocated for a job. | -| **`gpus`** | `number` | | Maximum number of GPUs allocated for a job. | -| **`gpuType`** | `string` | | Type of GPU (if any). | -| **`memory`** | `string` | | Maximum amount of memory allocated for a job. You can express memory as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. For example, the following represent roughly the same value: 128974848, 129e6, 129M, 123Mi. | -| **`volumeSize`** | `string` | | Amount of disk space allocated. You can express it as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. | | **`allowRawAlgorithm`** | `boolean` | **✓** | If `true`, any passed raw text will be allowed to run. Useful for an algorithm drag & drop use case, but increases risk of data escape through malicious user input. Should be `false` by default in all implementations. | | **`allowNetworkAccess`** | `boolean` | **✓** | If `true`, the algorithm job will have network access. | | **`publisherTrustedAlgorithmPublishers `** | Array of `string` | **✓** | If empty, then any published algorithm is allowed. Otherwise, only published algorithms by some publishers are allowed. | @@ -355,12 +349,6 @@ Example: "serviceEndpoint": "https://myprovider.com", "timeout": 0, "compute": { - "namespace": "ocean-compute", - "cpus": 2, - "gpus": 4, - "gpuType": "NVIDIA Tesla V100 GPU", - "memory": "128M", - "volumeSize": "2G", "allowRawAlgorithm": false, "allowNetworkAccess": true, "publisherTrustedAlgorithmPublishers": ["0x234", "0x235"], @@ -632,12 +620,6 @@ Example: "serviceEndpoint": "https://myprovider.com", "timeout": 3600, "compute": { - "namespace": "ocean-compute", - "cpus": 2, - "gpus": 4, - "gpuType": "NVIDIA Tesla V100 GPU", - "memory": "128M", - "volumeSize": "2G", "allowRawAlgorithm": false, "allowNetworkAccess": true, "publisherTrustedAlgorithmPublishers": ["0x234", "0x235"], From c2d377585505751df73db2842fa1385c28e00cec Mon Sep 17 00:00:00 2001 From: Akshay Date: Mon, 10 Jan 2022 07:39:17 +0100 Subject: [PATCH 090/145] Issue-#852: Add 2 registry services, nginx conf --- .../compute-to-data-docker-registry.md | 91 +++++++++++++++++-- 1 file changed, 82 insertions(+), 9 deletions(-) diff --git a/content/tutorials/compute-to-data-docker-registry.md b/content/tutorials/compute-to-data-docker-registry.md index 03cd864d..c6c17584 100644 --- a/content/tutorials/compute-to-data-docker-registry.md +++ b/content/tutorials/compute-to-data-docker-registry.md @@ -1,6 +1,6 @@ --- title: Setting up private docker registry for Compute-to-Data environment -description: Learn how to setup own docker registry and push images for running algorithms in C2D environment. +description: Learn how to setup your own docker registry and push images for running algorithms in a C2D environment. --- ## Prerequisites @@ -9,6 +9,14 @@ description: Learn how to setup own docker registry and push images for running 2. Domain name is mapped to the server IP address. 3. SSL certificate +## Generate certificates + +```bash +# install certbot: https://certbot.eff.org/ +sudo certbot certonly --standalone --cert-name example.com -d example.com +sudo certbot certonly --standalone --cert-name admin.example.com -d admin.example.com +``` + ## Generate password file Replace content in `<>` with appropriate content. @@ -22,6 +30,7 @@ docker run \ ## Docker compose template file for registry Copy the below yml content to `docker-compose.yml` file and replace content in `<>`. +Here, we will be creating two services of the docker registry so that anyone can `pull` the images from the registry but, only authenticated users can `push` the images. ```yml version: '3' @@ -34,8 +43,6 @@ services: ports: - 5050:5000 environment: - REGISTRY_HTTP_TLS_CERTIFICATE: /certs/domain.crt - REGISTRY_HTTP_TLS_KEY: /certs/domain.key REGISTRY_AUTH: htpasswd REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm @@ -43,7 +50,74 @@ services: volumes: - /data:/var/lib/registry - /auth:/auth - - /certs:/certs + registry-read-only: + restart: always + container_name: my-registry-read-only + image: registry:2 + read_only: true + ports: + - 5051:5000 + environment: + REGISTRY_HTTP_SECRET: ${REGISTRY_HTTP_SECRET} + volumes: + - /docker-registry/data:/var/lib/registry:ro + depends_on: + - registry + nginx: + image: nginx:latest + container_name: nginx + volumes: + - /nginx/logs:/app/logs/ + - nginx.conf:/etc/nginx/nginx.conf + - /etc/letsencrypt/:/etc/letsencrypt/ + ports: + - 80:80 + - 443:443 + depends_on: + - registry-read-only +``` + +## Nginx configuration + +``` +events {} +http { + access_log /app/logs/access.log; + error_log /app/logs/error.log; + + server { + client_max_body_size 4096M; + listen 80 default_server; + server_name _; + return 301 https://$host$request_uri; + } + + server { + # Allowed request size should be large enough to allow push operations + client_max_body_size 4096M; + listen 443 ssl; + server_name admin.example.com; + ssl_certificate /etc/letsencrypt/live/admin.example.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/admin.example.com/privkey.pem; + location / { + proxy_connect_timeout 75s; + proxy_pass http://registry:5000; + } + } + + server { + # Allowed request size should be large enough to allow pull operations + client_max_body_size 4096M; + listen 443 ssl; + server_name example.com; + ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; + location / { + proxy_connect_timeout 75s; + proxy_pass http://registry-read-only:5000; + } + } +} ``` @@ -61,16 +135,15 @@ curl -X GET -u : https://example.com/v2/_catalog ## Other useful commands - -## Login to registry +### Login to registry ```bash docker login example.com -u -p ``` -## Build and push image to registry +### Build and push an image to the registry -Use the commands below to build an image from a `Dockerfile` and push to your own private registry. +Use the commands below to build an image from a `Dockerfile` and push it to your private registry. ```bash docker build . -t example.com/my-algo:latest @@ -80,4 +153,4 @@ docker image tag example.com/my-algo:latest ## Next step -You can publish an algorithm asset with the metadata containing registry url, image, and tag information to enable users to run C2D jobs. +You can publish an algorithm asset with the metadata containing registry URL, image, and tag information to enable users to run C2D jobs. From 4654641afe9c76de69c75b1c63cf912c091df96f Mon Sep 17 00:00:00 2001 From: Akshay Date: Mon, 10 Jan 2022 07:46:00 +0100 Subject: [PATCH 091/145] Issue-#852: Fix lint issue --- content/tutorials/compute-to-data-docker-registry.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/tutorials/compute-to-data-docker-registry.md b/content/tutorials/compute-to-data-docker-registry.md index c6c17584..8bb48560 100644 --- a/content/tutorials/compute-to-data-docker-registry.md +++ b/content/tutorials/compute-to-data-docker-registry.md @@ -79,7 +79,7 @@ services: ## Nginx configuration -``` +```conf events {} http { access_log /app/logs/access.log; From e999b4b723416de0041801216bfe833c132619a4 Mon Sep 17 00:00:00 2001 From: Akshay Date: Mon, 10 Jan 2022 08:13:33 +0100 Subject: [PATCH 092/145] Issue-#852: Add content and further references --- .../compute-to-data-docker-registry.md | 49 +++++++++++++------ 1 file changed, 35 insertions(+), 14 deletions(-) diff --git a/content/tutorials/compute-to-data-docker-registry.md b/content/tutorials/compute-to-data-docker-registry.md index 8bb48560..a8fb2df3 100644 --- a/content/tutorials/compute-to-data-docker-registry.md +++ b/content/tutorials/compute-to-data-docker-registry.md @@ -3,14 +3,24 @@ title: Setting up private docker registry for Compute-to-Data environment description: Learn how to setup your own docker registry and push images for running algorithms in a C2D environment. --- +The tutorial provides the steps to setup a private docker registry on the server. The document is intended for a production setup where anyone can pull the image from the registry but, only authenticated users will push images to the registry. + +To implement this use case, 2 domains will be required: + +- example.com: This domain will allow only image pull operations +- admin.example.com: This domain will allow image push/pull operations only to the authenticated users. + +_Note: Please change the domain names to your application-specific domain names._ + ## Prerequisites 1. Running docker environment on the server. -2. Domain name is mapped to the server IP address. +2. 2 domain names is mapped to the same server IP address. 3. SSL certificate ## Generate certificates + ```bash # install certbot: https://certbot.eff.org/ sudo certbot certonly --standalone --cert-name example.com -d example.com @@ -127,30 +137,41 @@ http { docker-compose -f docker-compose.yml up ``` +## Login to registry + +```bash +docker login admin.example.com -u -p +``` + +### Build and push an image to the registry + +Use the commands below to build an image from a `Dockerfile` and push it to your private registry. + +```bash +docker build . -t admin.example.com/my-algo:latest +docker image push admin.example.com/my-algo:latest +``` + ## List images in the registry ```bash curl -X GET -u : https://example.com/v2/_catalog ``` -## Other useful commands +## Pull an image from the registry -### Login to registry +Use the commands below to build an image from a `Dockerfile` and push it to your private registry. ```bash -docker login example.com -u -p -``` - -### Build and push an image to the registry - -Use the commands below to build an image from a `Dockerfile` and push it to your private registry. - -```bash -docker build . -t example.com/my-algo:latest - -docker image tag example.com/my-algo:latest +docker image pull example.com/my-algo:latest ``` ## Next step You can publish an algorithm asset with the metadata containing registry URL, image, and tag information to enable users to run C2D jobs. + +## Further references + +[Setup Compute-to-Data environment](/tutorials/compute-to-data-minikube/) +[Writing algorithms](/tutorials/compute-to-data-algorithms/) +[C2D example](/references/read-the-docs/ocean-py/READMEs/c2d-flow.md) From 2c0e36d3f061b1e2abc34a8280626c44f1271ba7 Mon Sep 17 00:00:00 2001 From: Akshay Date: Mon, 10 Jan 2022 08:21:04 +0100 Subject: [PATCH 093/145] Issue-#852: Add content and further references --- .../tutorials/compute-to-data-docker-registry.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/content/tutorials/compute-to-data-docker-registry.md b/content/tutorials/compute-to-data-docker-registry.md index a8fb2df3..290c1282 100644 --- a/content/tutorials/compute-to-data-docker-registry.md +++ b/content/tutorials/compute-to-data-docker-registry.md @@ -137,7 +137,9 @@ http { docker-compose -f docker-compose.yml up ``` -## Login to registry +## Working with registry + +### Login to registry ```bash docker login admin.example.com -u -p @@ -152,13 +154,13 @@ docker build . -t admin.example.com/my-algo:latest docker image push admin.example.com/my-algo:latest ``` -## List images in the registry +### List images in the registry ```bash curl -X GET -u : https://example.com/v2/_catalog ``` -## Pull an image from the registry +### Pull an image from the registry Use the commands below to build an image from a `Dockerfile` and push it to your private registry. @@ -172,6 +174,6 @@ You can publish an algorithm asset with the metadata containing registry URL, im ## Further references -[Setup Compute-to-Data environment](/tutorials/compute-to-data-minikube/) -[Writing algorithms](/tutorials/compute-to-data-algorithms/) -[C2D example](/references/read-the-docs/ocean-py/READMEs/c2d-flow.md) +- [Setup Compute-to-Data environment](/tutorials/compute-to-data-minikube/) +- [Writing algorithms](/tutorials/compute-to-data-algorithms/) +- [C2D example](/references/read-the-docs/ocean-py/READMEs/c2d-flow.md) From 2bd36e15a2e27cd2dd0d7a936a5fe8684d8624ef Mon Sep 17 00:00:00 2001 From: Akshay Date: Mon, 10 Jan 2022 08:31:11 +0100 Subject: [PATCH 094/145] Issue-#852: Add content --- content/tutorials/compute-to-data-docker-registry.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/content/tutorials/compute-to-data-docker-registry.md b/content/tutorials/compute-to-data-docker-registry.md index 290c1282..951ffd70 100644 --- a/content/tutorials/compute-to-data-docker-registry.md +++ b/content/tutorials/compute-to-data-docker-registry.md @@ -7,26 +7,27 @@ The tutorial provides the steps to setup a private docker registry on the server To implement this use case, 2 domains will be required: -- example.com: This domain will allow only image pull operations -- admin.example.com: This domain will allow image push/pull operations only to the authenticated users. +- **example.com**: This domain will allow only image pull operations +- **admin.example.com**: This domain will allow image push/pull operations only to the authenticated users. _Note: Please change the domain names to your application-specific domain names._ ## Prerequisites -1. Running docker environment on the server. +1. Running docker environment on the linux server. 2. 2 domain names is mapped to the same server IP address. 3. SSL certificate ## Generate certificates - ```bash # install certbot: https://certbot.eff.org/ sudo certbot certonly --standalone --cert-name example.com -d example.com sudo certbot certonly --standalone --cert-name admin.example.com -d admin.example.com ``` +_Note: Do check the access right of the files/directories where certificates are stored. Usually, they are at `/etc/letsencrypt/`._ + ## Generate password file Replace content in `<>` with appropriate content. From dddfe6cf709ccb2aa85533aae183caebafc1c521 Mon Sep 17 00:00:00 2001 From: Akshay Date: Mon, 10 Jan 2022 08:38:02 +0100 Subject: [PATCH 095/145] Issue-#852: Add content --- content/tutorials/compute-to-data-docker-registry.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/content/tutorials/compute-to-data-docker-registry.md b/content/tutorials/compute-to-data-docker-registry.md index 951ffd70..8a1e3ac5 100644 --- a/content/tutorials/compute-to-data-docker-registry.md +++ b/content/tutorials/compute-to-data-docker-registry.md @@ -7,16 +7,16 @@ The tutorial provides the steps to setup a private docker registry on the server To implement this use case, 2 domains will be required: -- **example.com**: This domain will allow only image pull operations +- **example.com**: This domain will allow only image pull operations - **admin.example.com**: This domain will allow image push/pull operations only to the authenticated users. _Note: Please change the domain names to your application-specific domain names._ ## Prerequisites -1. Running docker environment on the linux server. -2. 2 domain names is mapped to the same server IP address. -3. SSL certificate +- Running docker environment on the linux server. +- Docker compose is installed. +- 2 domain names is mapped to the same server IP address. ## Generate certificates @@ -90,6 +90,8 @@ services: ## Nginx configuration +Copy the below nginx configuration to a `nginx.conf` file. + ```conf events {} http { From 1331ed1d7af84a229766dc5734136c3ed3c041e7 Mon Sep 17 00:00:00 2001 From: Akshay Date: Mon, 10 Jan 2022 08:49:57 +0100 Subject: [PATCH 096/145] Issue-#852: Add content on alternatives --- content/tutorials/compute-to-data-docker-registry.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/content/tutorials/compute-to-data-docker-registry.md b/content/tutorials/compute-to-data-docker-registry.md index 8a1e3ac5..8224f544 100644 --- a/content/tutorials/compute-to-data-docker-registry.md +++ b/content/tutorials/compute-to-data-docker-registry.md @@ -173,7 +173,12 @@ docker image pull example.com/my-algo:latest ## Next step -You can publish an algorithm asset with the metadata containing registry URL, image, and tag information to enable users to run C2D jobs. +You can publish an algorithm asset with the metadata containing registry URL, image, and tag information to enable users to run C2D jobs. + +## Other alternatives + +Some use cases might require that image `pull` operations are also restricted to authenticated servers/users. To allow the compute-to-data environment to pull images from the private registry, add `imagePullSecrets` to the compute job template file [here](https://github.com/oceanprotocol/operator-engine/blob/main/operator_engine/templates/configure-job-template.yaml). +You can generate the registry secret in the compute environment namespace by following these [steps](https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/). ## Further references From e1f6649d4a407939efb365529c4650ce08566ad0 Mon Sep 17 00:00:00 2001 From: Akshay Date: Tue, 11 Jan 2022 06:59:21 +0100 Subject: [PATCH 097/145] Issue-#781: Update roles page --- content/concepts/datanft-and-datatoken.md | 2 +- content/concepts/images/use-case-1.PNG | Bin 34049 -> 0 bytes .../images/{use-case-2.PNG => use-case.png} | Bin content/concepts/roles.md | 40 +++++++++--------- 4 files changed, 21 insertions(+), 21 deletions(-) delete mode 100644 content/concepts/images/use-case-1.PNG rename content/concepts/images/{use-case-2.PNG => use-case.png} (100%) diff --git a/content/concepts/datanft-and-datatoken.md b/content/concepts/datanft-and-datatoken.md index fb53f149..e7827d72 100644 --- a/content/concepts/datanft-and-datatoken.md +++ b/content/concepts/datanft-and-datatoken.md @@ -52,7 +52,7 @@ ERC721 tokens are non-fungible, thus cannot be used for automatic price discover ## High-Level Behavior -![Image 2](images/use-case-2.PNG) +![Image 2](images/use-case.png) Here's an example. Alice has created a dataset. In step 1, she publishes her dataset with Ocean: this means deploying an ERC721 data NFT contract (claiming copyright / base IP), then an ERC20 datatoken contract (license against base IP). Then in step 2, she mints some ERC20 datatokens and transfers 1.0 of them to Bob's wallet; now he has a license to be able to consume that dataset. diff --git a/content/concepts/images/use-case-1.PNG b/content/concepts/images/use-case-1.PNG deleted file mode 100644 index 2703a81d5594eb76f93bab34a2868ace2b36bab5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34049 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%0DUnx(jaRdx&GtYM@(c^pH~sT-cYXdW5RKiR9^G+ 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 diff --git a/content/concepts/images/use-case-2.PNG b/content/concepts/images/use-case.png similarity index 100% rename from content/concepts/images/use-case-2.PNG rename to content/concepts/images/use-case.png diff --git a/content/concepts/roles.md b/content/concepts/roles.md index 317036a6..35bc354c 100644 --- a/content/concepts/roles.md +++ b/content/concepts/roles.md @@ -8,28 +8,28 @@ description: Access to the data NFT and datatoken smart contract functions is co | Action ↓ / Role → | NFT Owner | Manager | ERC20 Deployer | Store Updater | Metadata Updater | |-----------------------------------|--------------------|--------------------|--------------------|--------------------|--------------------| | Set token URI | | | | | | -| Add manager |
| | | | | -| Remove manager |
| | | | | -| Clean permissions |
| | | | | -| Set base URI |
| | | | | -| Set MetaData state | | | | |
| -| Set MetaData | | | | |
| -| Create new Datatoken | | |
| | | -| Executes any other smart contract | |
| | | | -| Set new key-value in store | | | |
| | +| Add manager |
🗸
| | | | | +| Remove manager |
🗸
| | | | | +| Clean permissions |
🗸
| | | | | +| Set base URI |
🗸
| | | | | +| Set MetaData state | | | | |
🗸
| +| Set MetaData | | | | |
🗸
| +| Create new Datatoken | | |
🗸
| | | +| Executes any other smart contract | |
🗸
| | | | +| Set new key-value in store | | | |
🗸
| | ## Roles in datatoken smart contract | Action ↓ / Role → | ERC20 Deployer | Minter | NFT owner | Fee manager | |--------------------------------|--------------------------|--------------------------|--------------------------|--------------------------| -| Deploy pool |
| | | | -| Create Fixed Rate exchange |
| | | | -| Create Dispenser |
| | | | -| Add minter |
| | | | -| Remove minter |
| | | | -| Add fee manager |
| | | | -| Remove fee manager |
| | | | -| Set data |
| | | | -| Clean permissions | | |
| | -| Mint | |
| | | -| Set fee collector | | | |
| +| Deploy pool |
🗸
| | | | +| Create Fixed Rate exchange |
🗸
| | | | +| Create Dispenser |
🗸
| | | | +| Add minter |
🗸
| | | | +| Remove minter |
🗸
| | | | +| Add fee manager |
🗸
| | | | +| Remove fee manager |
🗸
| | | | +| Set data |
🗸
| | | | +| Clean permissions | | |
🗸
| | +| Mint | |
🗸
| | | +| Set fee collector | | | |
🗸
| From bff0c0055aea92bd43b96277ce2d53ee03241c51 Mon Sep 17 00:00:00 2001 From: Akshay Date: Tue, 11 Jan 2022 07:11:28 +0100 Subject: [PATCH 098/145] Issue-#781: Roles page --- content/concepts/roles.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/content/concepts/roles.md b/content/concepts/roles.md index 35bc354c..00bad007 100644 --- a/content/concepts/roles.md +++ b/content/concepts/roles.md @@ -1,9 +1,11 @@ --- title: Data NFTs and datatoken roles -description: Access to the data NFT and datatoken smart contract functions is controlled by the permssions stored on chain in the contracts. +description: The permssions stored on chain in the contracts control the access to the data NFT (ERC721) and datatoken (ERC20) smart contract functions. --- -## Roles in data NFT smart contract +The permissions are stored in the data NFT (ERC721) smart contract. The data NFT (ERC721) and datatoken (ERC20) smart contracts both use this information to restrict access to the smart contract functions. The tables below list restricted actions that are accessible only to the allowed users. + +## Roles in data NFT (ERC721) smart contract | Action ↓ / Role → | NFT Owner | Manager | ERC20 Deployer | Store Updater | Metadata Updater | |-----------------------------------|--------------------|--------------------|--------------------|--------------------|--------------------| @@ -18,7 +20,7 @@ description: Access to the data NFT and datatoken smart contract functions is co | Executes any other smart contract | |
🗸
| | | | | Set new key-value in store | | | |
🗸
| | -## Roles in datatoken smart contract +## Roles in datatoken (ERC20) smart contract | Action ↓ / Role → | ERC20 Deployer | Minter | NFT owner | Fee manager | |--------------------------------|--------------------------|--------------------------|--------------------------|--------------------------| From 28cf10738fe6fac8fd7e9ce260739d06bc25516b Mon Sep 17 00:00:00 2001 From: Akshay Date: Tue, 11 Jan 2022 11:28:09 +0100 Subject: [PATCH 099/145] Issue-#781: Fix spelling error --- content/concepts/roles.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/concepts/roles.md b/content/concepts/roles.md index 00bad007..69a58a33 100644 --- a/content/concepts/roles.md +++ b/content/concepts/roles.md @@ -1,6 +1,6 @@ --- title: Data NFTs and datatoken roles -description: The permssions stored on chain in the contracts control the access to the data NFT (ERC721) and datatoken (ERC20) smart contract functions. +description: The permissions stored on chain in the contracts control the access to the data NFT (ERC721) and datatoken (ERC20) smart contract functions. --- The permissions are stored in the data NFT (ERC721) smart contract. The data NFT (ERC721) and datatoken (ERC20) smart contracts both use this information to restrict access to the smart contract functions. The tables below list restricted actions that are accessible only to the allowed users. From a030e3cfa749c25594368f19cc6040d2ff5a4f4d Mon Sep 17 00:00:00 2001 From: Akshay Date: Tue, 18 Jan 2022 11:34:36 +0100 Subject: [PATCH 100/145] Issue-#852: Add private docker registry setup information --- .../compute-to-data-docker-registry.md | 173 +++++++++++++++--- 1 file changed, 152 insertions(+), 21 deletions(-) diff --git a/content/tutorials/compute-to-data-docker-registry.md b/content/tutorials/compute-to-data-docker-registry.md index 8224f544..2a296a24 100644 --- a/content/tutorials/compute-to-data-docker-registry.md +++ b/content/tutorials/compute-to-data-docker-registry.md @@ -3,32 +3,37 @@ title: Setting up private docker registry for Compute-to-Data environment description: Learn how to setup your own docker registry and push images for running algorithms in a C2D environment. --- -The tutorial provides the steps to setup a private docker registry on the server. The document is intended for a production setup where anyone can pull the image from the registry but, only authenticated users will push images to the registry. +The document is intended for a production setup. The tutorial provides the steps to setup a private docker registry on the server for the following scenarios: -To implement this use case, 2 domains will be required: +- Allow registry access only to the C2D environment. +- Anyone can pull the image from the registry but, only authenticated users will push images to the registry. + +## Setup 1: Allow registry access only to the C2D environment + + +To implement this use case, 1 domain will be required: - **example.com**: This domain will allow only image pull operations -- **admin.example.com**: This domain will allow image push/pull operations only to the authenticated users. _Note: Please change the domain names to your application-specific domain names._ -## Prerequisites +### 1.1 Prerequisites - Running docker environment on the linux server. - Docker compose is installed. -- 2 domain names is mapped to the same server IP address. +- C2D environment is running. +- The domain names is mapped to the server hosting the registry. -## Generate certificates +### 1.2 Generate certificates ```bash # install certbot: https://certbot.eff.org/ sudo certbot certonly --standalone --cert-name example.com -d example.com -sudo certbot certonly --standalone --cert-name admin.example.com -d admin.example.com ``` _Note: Do check the access right of the files/directories where certificates are stored. Usually, they are at `/etc/letsencrypt/`._ -## Generate password file +### 1.3 Generate password file Replace content in `<>` with appropriate content. @@ -38,7 +43,131 @@ docker run \ httpd:2 -Bbn > /auth/htpasswd ``` -## Docker compose template file for registry +### 1.4 Docker compose template file for registry + +Copy the below yml content to `docker-compose.yml` file and replace content in `<>`. + +```yml +version: '3' + +services: + registry: + restart: always + container_name: my-docker-registry + image: registry:2 + ports: + - 5050:5000 + environment: + REGISTRY_AUTH: htpasswd + REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd + REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm + REGISTRY_HTTP_SECRET: + volumes: + - /data:/var/lib/registry + - /auth:/auth + nginx: + image: nginx:latest + container_name: nginx + volumes: + - /nginx/logs:/app/logs/ + - nginx.conf:/etc/nginx/nginx.conf + - /etc/letsencrypt/:/etc/letsencrypt/ + ports: + - 80:80 + - 443:443 + depends_on: + - registry +``` + +### 1.5 Nginx configuration + +Copy the below nginx configuration to a `nginx.conf` file. + +```conf +events {} +http { + access_log /app/logs/access.log; + error_log /app/logs/error.log; + + server { + client_max_body_size 4096M; + listen 80 default_server; + server_name _; + return 301 https://$host$request_uri; + } + + server { + # Allowed request size should be large enough to allow pull operations + client_max_body_size 4096M; + listen 443 ssl; + server_name example.com; + ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; + location / { + proxy_connect_timeout 75s; + proxy_pass http://registry-read-only:5000; + } + } +} + +``` + +### 1.6 Create kubernetes secret in C2D server + +Login into Compute-to-data enviroment and run the following command with appropriate credentials: + +```bash +kubectl create secret docker-registry regcred --docker-server=example.com --docker-username= --docker-password= --docker-email= -n ocean-compute +``` + +### 1.7 Update operator-engine configuration + +Add `PULL_SECRET` property with value `regcred` in the [operator.yml](https://github.com/oceanprotocol/operator-engine/blob/main/kubernetes/operator.yml) file of operator-engine configuration. +For more detials on operator-engine properties refer this [link](https://github.com/oceanprotocol/operator-engine/blob/177ca7185c34aa2a503afbe026abb19c62c69e6d/README.md?plain=1#L106) + +Apply updated operator-engine configuration. + +```bash +kubectl config set-context --current --namespace ocean-compute +kubectl apply -f operator-engine/kubernetes/operator.yml +``` + +## Steup 2: Allow anyonymous `pull` operations + +To implement this use case, 2 domains will be required: + +- **example.com**: This domain will allow image push/pull operations only to the authenticated users. +- **readonly.example.com**: This domain will allow only image pull operations + +_Note: Please change the domain names to your application-specific domain names._ + +### 2.1 Prerequisites + +- Running docker environment on the linux server. +- Docker compose is installed. +- 2 domain names is mapped to the same server IP address. + +### 2.2 Generate certificates + +```bash +# install certbot: https://certbot.eff.org/ +sudo certbot certonly --standalone --cert-name example.com -d example.com +sudo certbot certonly --standalone --cert-name readonly.example.com -d readonly.example.com +``` + +_Note: Do check the access right of the files/directories where certificates are stored. Usually, they are at `/etc/letsencrypt/`._ + +### 2.3 Generate password file + +Replace content in `<>` with appropriate content. + +```bash +docker run \ + --entrypoint htpasswd \ + httpd:2 -Bbn > /auth/htpasswd +``` + +### 2.4 Docker compose template file for registry Copy the below yml content to `docker-compose.yml` file and replace content in `<>`. Here, we will be creating two services of the docker registry so that anyone can `pull` the images from the registry but, only authenticated users can `push` the images. @@ -88,7 +217,7 @@ services: - registry-read-only ``` -## Nginx configuration +### 2.5 Nginx configuration Copy the below nginx configuration to a `nginx.conf` file. @@ -109,9 +238,9 @@ http { # Allowed request size should be large enough to allow push operations client_max_body_size 4096M; listen 443 ssl; - server_name admin.example.com; - ssl_certificate /etc/letsencrypt/live/admin.example.com/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live/admin.example.com/privkey.pem; + server_name readonly.example.com; + ssl_certificate /etc/letsencrypt/live/readonly.example.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/readonly.example.com/privkey.pem; location / { proxy_connect_timeout 75s; proxy_pass http://registry:5000; @@ -145,7 +274,7 @@ docker-compose -f docker-compose.yml up ### Login to registry ```bash -docker login admin.example.com -u -p +docker login example.com -u -p ``` ### Build and push an image to the registry @@ -153,8 +282,8 @@ docker login admin.example.com -u -p Use the commands below to build an image from a `Dockerfile` and push it to your private registry. ```bash -docker build . -t admin.example.com/my-algo:latest -docker image push admin.example.com/my-algo:latest +docker build . -t example.com/my-algo:latest +docker image push example.com/my-algo:latest ``` ### List images in the registry @@ -168,17 +297,19 @@ curl -X GET -u : https://example.com/v2/_catalog Use the commands below to build an image from a `Dockerfile` and push it to your private registry. ```bash +# requires login docker image pull example.com/my-algo:latest + +# allows anonymous pull if 2nd setup scenario is implemented +docker image pull readonly.example.com/my-algo:latest + + ``` -## Next step +### Next step You can publish an algorithm asset with the metadata containing registry URL, image, and tag information to enable users to run C2D jobs. -## Other alternatives - -Some use cases might require that image `pull` operations are also restricted to authenticated servers/users. To allow the compute-to-data environment to pull images from the private registry, add `imagePullSecrets` to the compute job template file [here](https://github.com/oceanprotocol/operator-engine/blob/main/operator_engine/templates/configure-job-template.yaml). -You can generate the registry secret in the compute environment namespace by following these [steps](https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/). ## Further references From aa8402be7de4df0ab36d0878cb6395408992a4e8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Jan 2022 10:19:34 +0000 Subject: [PATCH 101/145] Bump swagger-client from 3.18.0 to 3.18.2 (#867) Bumps [swagger-client](https://github.com/swagger-api/swagger-js) from 3.18.0 to 3.18.2. - [Release notes](https://github.com/swagger-api/swagger-js/releases) - [Changelog](https://github.com/swagger-api/swagger-js/blob/master/.releaserc) - [Commits](https://github.com/swagger-api/swagger-js/compare/v3.18.0...v3.18.2) --- updated-dependencies: - dependency-name: swagger-client dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 63 +++++++++++++++++++++++++++++++++-------------- package.json | 2 +- 2 files changed, 46 insertions(+), 19 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9a7cbc23..6ddd347c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24025,15 +24025,15 @@ } }, "swagger-client": { - "version": "3.18.0", - "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.18.0.tgz", - "integrity": "sha512-lNfwTXHim0QiCNuZ4BKgWle7N7+9WlFLtcP02n0xSchFtdzsKJb2kWsOlwplRU3appVFjnHRy+1eVabRc3ZhbA==", + "version": "3.18.2", + "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.18.2.tgz", + "integrity": "sha512-AQNmK9QmWsRBFvSmuyI4v0ee3hpBzpaGVF+wb5t/iAQPigsQktcJzR36DXp1sNGxgkXdbW1+G74h+UZuVxD6Mg==", "requires": { "@babel/runtime-corejs3": "^7.11.2", "btoa": "^1.2.1", "cookie": "~0.4.1", "cross-fetch": "^3.1.4", - "deep-extend": "~0.6.0", + "deepmerge": "~4.2.2", "fast-json-patch": "^3.0.0-1", "form-data-encoder": "^1.4.3", "formdata-node": "^4.0.0", @@ -24046,11 +24046,11 @@ }, "dependencies": { "@babel/runtime-corejs3": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.16.7.tgz", - "integrity": "sha512-MiYR1yk8+TW/CpOD0CyX7ve9ffWTKqLk/L6pk8TPl0R8pNi+1pFY8fH9yET55KlvukQ4PAWfXsGr2YHVjcI4Pw==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.16.8.tgz", + "integrity": "sha512-3fKhuICS1lMz0plI5ktOE/yEtBRMVxplzRkdn6mJQ197XiY0JnrzYV0+Mxozq3JZ8SBV9Ecurmw1XsGbwOf+Sg==", "requires": { - "core-js-pure": "^3.19.0", + "core-js-pure": "^3.20.2", "regenerator-runtime": "^0.13.4" } }, @@ -24065,16 +24065,16 @@ "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" }, "core-js-pure": { - "version": "3.20.2", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.20.2.tgz", - "integrity": "sha512-CmWHvSKn2vNL6p6StNp1EmMIfVY/pqn3JLAjfZQ8WZGPOlGoO92EkX9/Mk81i6GxvoPXjUqEQnpM3rJ5QxxIOg==" + "version": "3.20.3", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.20.3.tgz", + "integrity": "sha512-Q2H6tQ5MtPtcC7f3HxJ48i4Q7T9ybPKgvWyuH7JXIoNa2pm0KuBnycsET/qw1SLLZYfbsbrZQNMeIOClb+6WIA==" }, "cross-fetch": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", - "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", "requires": { - "node-fetch": "2.6.1" + "node-fetch": "2.6.7" } }, "is-plain-object": { @@ -24090,15 +24090,23 @@ "argparse": "^2.0.1" } }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, "object-inspect": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==" }, "qs": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.2.tgz", - "integrity": "sha512-mSIdjzqznWgfd4pMii7sHtaYF8rx8861hBO80SraY5GT0XQibWZWJSid0avzHGkDIZLImux2S5mXO0Hfct2QCw==", + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", "requires": { "side-channel": "^1.0.4" } @@ -24475,6 +24483,11 @@ "punycode": "^2.1.1" } }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, "traverse": { "version": "0.6.6", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", @@ -25636,6 +25649,11 @@ "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.1.tgz", "integrity": "sha512-3ux37gEX670UUphBF9AMCq8XM6iQ8Ac6A+DSRRjDoRBm1ufCkaCDdNVbaqq60PsEkdNlLKrGtv/YBP4EJXqNtQ==" }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, "webpack": { "version": "4.46.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", @@ -26416,6 +26434,15 @@ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", diff --git a/package.json b/package.json index e9729ccb..74a658c7 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "shortid": "^2.2.16", "slugify": "^1.6.5", "smoothscroll-polyfill": "^0.4.4", - "swagger-client": "^3.18.0" + "swagger-client": "^3.18.2" }, "devDependencies": { "@svgr/webpack": "^5.5.0", From 33d80439f408190126af0585b9d8397918315e68 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Jan 2022 10:19:52 +0000 Subject: [PATCH 102/145] Bump dotenv from 10.0.0 to 14.2.0 (#866) Bumps [dotenv](https://github.com/motdotla/dotenv) from 10.0.0 to 14.2.0. - [Release notes](https://github.com/motdotla/dotenv/releases) - [Changelog](https://github.com/motdotla/dotenv/blob/master/CHANGELOG.md) - [Commits](https://github.com/motdotla/dotenv/compare/v10.0.0...v14.2.0) --- updated-dependencies: - dependency-name: dotenv dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6ddd347c..1c9fe0bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9017,9 +9017,9 @@ } }, "dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-14.2.0.tgz", + "integrity": "sha512-05POuPJyPpO6jqzTNweQFfAyMSD4qa4lvsMOWyTRTdpHKy6nnnN+IYWaXF+lHivhBH/ufDKlR4IWCAN3oPnHuw==", "dev": true }, "download": { diff --git a/package.json b/package.json index 74a658c7..1a4bee33 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ }, "devDependencies": { "@svgr/webpack": "^5.5.0", - "dotenv": "^10.0.0", + "dotenv": "^14.2.0", "eslint": "^7.32.0", "eslint-config-oceanprotocol": "^1.5.0", "eslint-config-prettier": "^8.3.0", From d631cad95ada5b99066cd21fc7a0e55bd04e7775 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Jan 2022 10:20:13 +0000 Subject: [PATCH 103/145] Bump follow-redirects from 1.13.1 to 1.14.7 (#860) Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.13.1 to 1.14.7. - [Release notes](https://github.com/follow-redirects/follow-redirects/releases) - [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.13.1...v1.14.7) --- updated-dependencies: - dependency-name: follow-redirects dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 28 +++------------------------- 1 file changed, 3 insertions(+), 25 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1c9fe0bd..46e3b960 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5803,13 +5803,6 @@ "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", "requires": { "follow-redirects": "^1.14.4" - }, - "dependencies": { - "follow-redirects": { - "version": "1.14.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.5.tgz", - "integrity": "sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==" - } } }, "axobject-query": { @@ -7703,11 +7696,6 @@ "follow-redirects": "^1.14.0" } }, - "follow-redirects": { - "version": "1.14.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", - "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==" - }, "type-fest": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.0.2.tgz", @@ -11406,9 +11394,9 @@ } }, "follow-redirects": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz", - "integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg==" + "version": "1.14.7", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz", + "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==" }, "for-in": { "version": "1.0.2", @@ -12123,11 +12111,6 @@ "locate-path": "^2.0.0" } }, - "follow-redirects": { - "version": "1.14.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", - "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==" - }, "gatsby-cli": { "version": "2.19.3", "resolved": "https://registry.npmjs.org/gatsby-cli/-/gatsby-cli-2.19.3.tgz", @@ -23049,11 +23032,6 @@ "requires": { "follow-redirects": "^1.14.0" } - }, - "follow-redirects": { - "version": "1.14.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", - "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==" } } }, From 8274697677bab0d8951103deac925d51850ff6bb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Jan 2022 10:20:36 +0000 Subject: [PATCH 104/145] Bump engine.io from 4.1.1 to 4.1.2 (#861) Bumps [engine.io](https://github.com/socketio/engine.io) from 4.1.1 to 4.1.2. - [Release notes](https://github.com/socketio/engine.io/releases) - [Changelog](https://github.com/socketio/engine.io/blob/4.1.2/CHANGELOG.md) - [Commits](https://github.com/socketio/engine.io/compare/4.1.1...4.1.2) --- updated-dependencies: - dependency-name: engine.io dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 46e3b960..04132041 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9223,9 +9223,9 @@ } }, "engine.io": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-4.1.1.tgz", - "integrity": "sha512-t2E9wLlssQjGw0nluF6aYyfX8LwYU8Jj0xct+pAhfWfv/YrBn6TSNtEYsgxHIfaMqfrLx07czcMg9bMN6di+3w==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-4.1.2.tgz", + "integrity": "sha512-t5z6zjXuVLhXDMiFJPYsPOWEER8B0tIsD3ETgw19S1yg9zryvUfY3Vhtk3Gf4sihw/bQGIqQ//gjvVlu+Ca0bQ==", "requires": { "accepts": "~1.3.4", "base64id": "2.0.0", @@ -9242,9 +9242,9 @@ "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "requires": { "ms": "2.1.2" } From 3b556c550dfa6eeba86e96fae9fce9ab05ea2dec Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Mon, 31 Jan 2022 14:25:56 +0200 Subject: [PATCH 105/145] Add nft.tokenURI (#878) --- content/concepts/did-ddo.md | 1 + 1 file changed, 1 insertion(+) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 0e7adfb6..1274e580 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -469,6 +469,7 @@ The `nft` object contains information about the ERC721 NFT contract which repres | **`owner`** | `string` | ETH account address of the NFT owner. | | **`state`** | `number` | State of the asset reflecting the NFT contract value. See [State](#state) | | **`created`** | `ISO date/time string` | Contains the date of NFT creation. | +| **`tokenURI`** | `string` | tokenURI | Example: From 14ec3f8ed8cd245e2bd913b48d74ac3ecd9fdfef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 31 Jan 2022 12:58:18 +0000 Subject: [PATCH 106/145] Bump dotenv from 14.2.0 to 14.3.2 (#877) Bumps [dotenv](https://github.com/motdotla/dotenv) from 14.2.0 to 14.3.2. - [Release notes](https://github.com/motdotla/dotenv/releases) - [Changelog](https://github.com/motdotla/dotenv/blob/master/CHANGELOG.md) - [Commits](https://github.com/motdotla/dotenv/compare/v14.2.0...v14.3.2) --- updated-dependencies: - dependency-name: dotenv dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 04132041..ae0a313e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9005,9 +9005,9 @@ } }, "dotenv": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-14.2.0.tgz", - "integrity": "sha512-05POuPJyPpO6jqzTNweQFfAyMSD4qa4lvsMOWyTRTdpHKy6nnnN+IYWaXF+lHivhBH/ufDKlR4IWCAN3oPnHuw==", + "version": "14.3.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-14.3.2.tgz", + "integrity": "sha512-vwEppIphpFdvaMCaHfCEv9IgwcxMljMw2TnAQBB4VWPvzXQLTb82jwmdOKzlEVUL3gNFT4l4TPKO+Bn+sqcrVQ==", "dev": true }, "download": { diff --git a/package.json b/package.json index 1a4bee33..c7c4c7ba 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ }, "devDependencies": { "@svgr/webpack": "^5.5.0", - "dotenv": "^14.2.0", + "dotenv": "^14.3.2", "eslint": "^7.32.0", "eslint-config-oceanprotocol": "^1.5.0", "eslint-config-prettier": "^8.3.0", From d5b398b84a2ca16851e7de8ee1883de52a33136b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 31 Jan 2022 13:01:28 +0000 Subject: [PATCH 107/145] Bump axios from 0.24.0 to 0.25.0 Bumps [axios](https://github.com/axios/axios) from 0.24.0 to 0.25.0. - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/master/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v0.24.0...v0.25.0) --- updated-dependencies: - dependency-name: axios dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index ae0a313e..eadd0d32 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5798,11 +5798,11 @@ "integrity": "sha512-1uIESzroqpaTzt9uX48HO+6gfnKu3RwvWdCcWSrX4csMInJfCo1yvKPNXCwXFRpJqRW25tiASb6No0YH57PXqg==" }, "axios": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz", - "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", + "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", "requires": { - "follow-redirects": "^1.14.4" + "follow-redirects": "^1.14.7" } }, "axobject-query": { diff --git a/package.json b/package.json index c7c4c7ba..f74f46fb 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ }, "dependencies": { "@oceanprotocol/art": "^3.2.0", - "axios": "^0.24.0", + "axios": "^0.25.0", "classnames": "^2.3.1", "gatsby": "^2.32.13", "gatsby-image": "^3.11.0", From ea54fd250eda9fc2e1170375ec5f8525032a2202 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 31 Jan 2022 13:01:30 +0000 Subject: [PATCH 108/145] Bump gatsby-remark-vscode from 3.3.0 to 3.3.1 Bumps [gatsby-remark-vscode](https://github.com/andrewbranch/gatsby-remark-vscode) from 3.3.0 to 3.3.1. - [Release notes](https://github.com/andrewbranch/gatsby-remark-vscode/releases) - [Commits](https://github.com/andrewbranch/gatsby-remark-vscode/compare/v3.3.0...v3.3.1) --- updated-dependencies: - dependency-name: gatsby-remark-vscode dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 32 +++++++++++++------------------- package.json | 2 +- 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/package-lock.json b/package-lock.json index ae0a313e..1dba4190 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13703,9 +13703,9 @@ } }, "gatsby-remark-vscode": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/gatsby-remark-vscode/-/gatsby-remark-vscode-3.3.0.tgz", - "integrity": "sha512-55ucO1KryOwz9UlvQzsdNC6mI8wiWqSrE8pkV/fvHP9Q4NBttOGShU7pLuIUiWlSrzBFGWwtZSvVRTnklbPeCw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/gatsby-remark-vscode/-/gatsby-remark-vscode-3.3.1.tgz", + "integrity": "sha512-KUCDU8KauLikURYuGyAZ0aLhHhd/BP2XwzP/WP0wkgyKjh650PwewQghwpD9g2wVkN+fThFJDs4G64K4fduDGQ==", "requires": { "decompress": "^4.2.0", "json5": "^2.1.1", @@ -19872,13 +19872,12 @@ } }, "plist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.3.tgz", - "integrity": "sha512-ghdOKN99hh1oEmAlwBmPYo4L+tSQ7O3jRpkhWqOrMz86CWotpVzMevvQ+czo7oPDpOZyA6K06Ci7QVHpoh9gaA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.4.tgz", + "integrity": "sha512-ksrr8y9+nXOxQB2osVNqrgvX/XQPOXaU4BQMKjYq8PvaY1U18mo+fKgBSwzK+luSyinOuPae956lSVcBwxlAMg==", "requires": { "base64-js": "^1.5.1", - "xmlbuilder": "^9.0.7", - "xmldom": "^0.6.0" + "xmlbuilder": "^9.0.7" }, "dependencies": { "xmlbuilder": { @@ -25369,14 +25368,14 @@ "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" }, "vscode-oniguruma": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.5.1.tgz", - "integrity": "sha512-JrBZH8DCC262TEYcYdeyZusiETu0Vli0xFgdRwNJjDcObcRjbmJP+IFcA3ScBwIXwgFHYKbAgfxtM/Cl+3Spjw==" + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.6.1.tgz", + "integrity": "sha512-vc4WhSIaVpgJ0jJIejjYxPvURJavX6QG41vu0mGhqywMkQqulezEqEQ3cO3gc8GvcOpX6ycmKGqRoROEMBNXTQ==" }, "vscode-textmate": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.4.0.tgz", - "integrity": "sha512-c0Q4zYZkcLizeYJ3hNyaVUM2AA8KDhNCA3JvXY8CeZSJuBdAy3bAvSbv46RClC4P3dSO9BdwhnKEx2zOo6vP/w==" + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.5.0.tgz", + "integrity": "sha512-jToQkPGMNKn0eyKyitYeINJF0NoD240aYyKPIWJv5W2jfPt++jIRg0OSergubtGhbw6SoefkvBYEpX7TsfoSUQ==" }, "warning": { "version": "4.0.3", @@ -26788,11 +26787,6 @@ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" }, - "xmldom": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.6.0.tgz", - "integrity": "sha512-iAcin401y58LckRZ0TkI4k0VSM1Qg0KGSc3i8rU+xrxe19A/BN1zHyVSJY7uoutVlaTSzYyk/v5AmkewAP7jtg==" - }, "xmlhttprequest-ssl": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.2.tgz", diff --git a/package.json b/package.json index c7c4c7ba..4487fac6 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "gatsby-remark-images": "^3.11.1", "gatsby-remark-responsive-iframe": "^2.11.0", "gatsby-remark-smartypants": "^2.10.0", - "gatsby-remark-vscode": "^3.3.0", + "gatsby-remark-vscode": "^3.3.1", "gatsby-source-filesystem": "^2.11.1", "gatsby-source-git": "^1.1.0", "gatsby-source-graphql": "^2.14.0", From be9ac00101f188c42eeeb89d8356e6cb660de0f7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Feb 2022 02:03:51 +0000 Subject: [PATCH 109/145] Bump swagger-client from 3.18.2 to 3.18.4 Bumps [swagger-client](https://github.com/swagger-api/swagger-js) from 3.18.2 to 3.18.4. - [Release notes](https://github.com/swagger-api/swagger-js/releases) - [Changelog](https://github.com/swagger-api/swagger-js/blob/master/.releaserc) - [Commits](https://github.com/swagger-api/swagger-js/compare/v3.18.2...v3.18.4) --- updated-dependencies: - dependency-name: swagger-client dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 26 +++++++++++++------------- package.json | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index ae0a313e..25f3cfbd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24003,14 +24003,14 @@ } }, "swagger-client": { - "version": "3.18.2", - "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.18.2.tgz", - "integrity": "sha512-AQNmK9QmWsRBFvSmuyI4v0ee3hpBzpaGVF+wb5t/iAQPigsQktcJzR36DXp1sNGxgkXdbW1+G74h+UZuVxD6Mg==", + "version": "3.18.4", + "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.18.4.tgz", + "integrity": "sha512-Wj26oEctONq/u0uM+eSj18675YM5e2vFnx7Kr4neLeXEHKUsfceVQ/OdtrBXdrT3VbtdBbZfMTfl1JOBpix2MA==", "requires": { "@babel/runtime-corejs3": "^7.11.2", "btoa": "^1.2.1", "cookie": "~0.4.1", - "cross-fetch": "^3.1.4", + "cross-fetch": "^3.1.5", "deepmerge": "~4.2.2", "fast-json-patch": "^3.0.0-1", "form-data-encoder": "^1.4.3", @@ -24024,9 +24024,9 @@ }, "dependencies": { "@babel/runtime-corejs3": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.16.8.tgz", - "integrity": "sha512-3fKhuICS1lMz0plI5ktOE/yEtBRMVxplzRkdn6mJQ197XiY0JnrzYV0+Mxozq3JZ8SBV9Ecurmw1XsGbwOf+Sg==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.0.tgz", + "integrity": "sha512-qeydncU80ravKzovVncW3EYaC1ji3GpntdPgNcJy9g7hHSY6KX+ne1cbV3ov7Zzm4F1z0+QreZPCuw1ynkmYNg==", "requires": { "core-js-pure": "^3.20.2", "regenerator-runtime": "^0.13.4" @@ -24038,14 +24038,14 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" }, "core-js-pure": { - "version": "3.20.3", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.20.3.tgz", - "integrity": "sha512-Q2H6tQ5MtPtcC7f3HxJ48i4Q7T9ybPKgvWyuH7JXIoNa2pm0KuBnycsET/qw1SLLZYfbsbrZQNMeIOClb+6WIA==" + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.21.0.tgz", + "integrity": "sha512-VaJUunCZLnxuDbo1rNOzwbet9E1K9joiXS5+DQMPtgxd24wfsZbJZMMfQLGYMlCUvSxLfsRUUhoOR2x28mFfeg==" }, "cross-fetch": { "version": "3.1.5", diff --git a/package.json b/package.json index c7c4c7ba..cda89934 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "shortid": "^2.2.16", "slugify": "^1.6.5", "smoothscroll-polyfill": "^0.4.4", - "swagger-client": "^3.18.2" + "swagger-client": "^3.18.4" }, "devDependencies": { "@svgr/webpack": "^5.5.0", From 735fb5b657c236216f2c5e7182e68c67eaffa050 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Feb 2022 02:11:32 +0000 Subject: [PATCH 110/145] Bump dotenv from 14.3.2 to 16.0.0 Bumps [dotenv](https://github.com/motdotla/dotenv) from 14.3.2 to 16.0.0. - [Release notes](https://github.com/motdotla/dotenv/releases) - [Changelog](https://github.com/motdotla/dotenv/blob/master/CHANGELOG.md) - [Commits](https://github.com/motdotla/dotenv/compare/v14.3.2...v16.0.0) --- updated-dependencies: - dependency-name: dotenv dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index ae0a313e..8c07b824 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9005,9 +9005,9 @@ } }, "dotenv": { - "version": "14.3.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-14.3.2.tgz", - "integrity": "sha512-vwEppIphpFdvaMCaHfCEv9IgwcxMljMw2TnAQBB4VWPvzXQLTb82jwmdOKzlEVUL3gNFT4l4TPKO+Bn+sqcrVQ==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.0.tgz", + "integrity": "sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q==", "dev": true }, "download": { diff --git a/package.json b/package.json index c7c4c7ba..4201dfef 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ }, "devDependencies": { "@svgr/webpack": "^5.5.0", - "dotenv": "^14.3.2", + "dotenv": "^16.0.0", "eslint": "^7.32.0", "eslint-config-oceanprotocol": "^1.5.0", "eslint-config-prettier": "^8.3.0", From 200feac918d4a7d142105a7ee47840687d84db81 Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Thu, 10 Feb 2022 13:25:19 +0200 Subject: [PATCH 111/145] use orders instead of consumes --- content/concepts/did-ddo.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 1274e580..8cd55022 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -570,14 +570,14 @@ The `stats` section contains different statistics fields. | Attribute | Type | Description | | -------------- | -------- | ------------------------------------------------------------------------------------------------------------- | -| **`consumes`** | `number` | How often an asset was consumed, meaning how often it was either downloaded or used as part of a compute job. | +| **`orders`** | `number` | How often an asset was ordered, meaning how often it was either downloaded or used as part of a compute job. | Example: ```json { "stats": { - "consumes": 4 + "orders": 4 } } ``` @@ -693,7 +693,7 @@ Example: }, "stats": { - "consumes": 4 + "orders": 4 } } ``` From 48dbb90f03ccb4cfaccd6d2f465ed2abf499881b Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Thu, 10 Feb 2022 13:40:33 +0200 Subject: [PATCH 112/145] add userInput Define userInput object and his definition for services & algos --- content/concepts/did-ddo.md | 87 ++++++++++++++++++++++++++++++++++--- 1 file changed, 81 insertions(+), 6 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 8cd55022..4f96bbe5 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -128,11 +128,12 @@ Example: An asset of type `algorithm` has additional attributes under `metadata.algorithm`, describing the algorithm and the Docker environment it is supposed to be run under. -| Attribute | Type | Required | Description | -| --------------- | ----------- | -------- | ------------------------------------------------------------------------------------------ | -| **`language`** | `string` | | Language used to implement the software. | -| **`version`** | `string` | | Version of the software preferably in [SemVer](https://semver.org) notation. E.g. `1.0.0`. | -| **`container`** | `container` | **✓** | Object describing the Docker container image. See below | +| Attribute | Type | Required | Description | +| --------------- | --------------------------- | -------- | ------------------------------------------------------------------------------------------ | +| **`language`** | `string` | | Language used to implement the software. | +| **`version`** | `string` | | Version of the software preferably in [SemVer](https://semver.org) notation. E.g. `1.0.0`. | +| **`userInput`** | [User Input](#userinput) | | An object the defines required user input before running the algorithm | +| **`container`** | `container` | **✓** | Object describing the Docker container image. See below | The `container` object has the following attributes defining the Docker image for running the algorithm: @@ -161,7 +162,8 @@ The `container` object has the following attributes defining the Docker image fo "image": "ubuntu", "tag": "latest", "checksum": "44e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550" - } + }, + "userInput":{}, } } } @@ -184,6 +186,7 @@ An asset should have at least one service to be actually accessible, and can hav | **`files`** | [Files](#files) | **✓** | Encrypted file URLs. | | **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of `0` represents no time limit. Expressed in seconds. | | **`compute`** | [Compute](#compute-options) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings & resources. | +| **`userInput`** | [User Input](#userinput) | | An object the defines required user input before consuming the asset| #### Files @@ -369,7 +372,79 @@ Example: ] } ``` + [User Input](#userinput) +### User Input +Sometimes, you may need some input before consuming a dataset or running an algorithm. +Examples: +- You want to know the desired sampling interval of data in your dataset, before the user is going to download it. So you will define a field called "sampling", ask the user to enter a value and then this parameter is going to be added to the URL of your dataset +- Before running an algorithm, you need to know how many iterations should the algo perform. You are going to define a field called 'iterations', ask the user to enter a value and this parameter is stored in a specific location in your C2D pod, so algo can read it and use that value. +Object consists of an array , in which each element defines a user required field. +An element looks like: +```json + { + "name":"surname", + "type": "text", + "label": "Name", + "required": true, + "description":"Please fill your name", + "options": [] + } +``` +where: + - name = defines the parameter name + - type = defines the form type (text, number, select, boolean) + - label = defines the label which is displayed + - required = if this field is mandatory to have a user input. + - default = default value + - description = description of this element + - options = for select types, a list of options + + +Example: +``` +[ + { + "name":"surname", + "type": "text", + "label": "Name", + "required": true, + "default': "NoName" + "description":"Please fill your name" + }, + { + "name":"age", + "type": "number", + "label": "Age", + "required": false, + "default': 0 + "description":"Please fill your age" + }, + { + "name":"developer", + "type": "boolean", + "label": "Developer", + "required": false, + "default': false + "description":"Are you a developer?" + }, + { + "name":"interval", + "type": "select", + "label": "Date", + "required": false, + "default": "nodejs" + "options": [ + { + "nodejs" : "I love NodeJs" + }, + { + "python" : "I love Python" + } + ], + "description": "Do you like NodeJs or Python" + }, +] ### Credentials By default, a consumer can access a resource if they have 1 datatoken. _Credentials_ allow the publisher to optionally specify more fine-grained permissions. From e9c51da030ecea106ff85bd0029f536415e7415d Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Thu, 10 Feb 2022 13:42:46 +0200 Subject: [PATCH 113/145] Update did-ddo.md --- content/concepts/did-ddo.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 4f96bbe5..c6444adf 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -372,11 +372,11 @@ Example: ] } ``` - [User Input](#userinput) + ### User Input Sometimes, you may need some input before consuming a dataset or running an algorithm. Examples: -- You want to know the desired sampling interval of data in your dataset, before the user is going to download it. So you will define a field called "sampling", ask the user to enter a value and then this parameter is going to be added to the URL of your dataset +- You want to know the desired sampling interval of data in your dataset, before the user is going to download it. Your dataset URL is 'www.example.com/mydata'. So you will define a field called "sampling", ask the user to enter a value and then this parameter is going to be added to the URL of your dataset (so the actual url will become 'www.example.com/mydata?sampling=10' - Before running an algorithm, you need to know how many iterations should the algo perform. You are going to define a field called 'iterations', ask the user to enter a value and this parameter is stored in a specific location in your C2D pod, so algo can read it and use that value. Object consists of an array , in which each element defines a user required field. @@ -445,6 +445,7 @@ Example: "description": "Do you like NodeJs or Python" }, ] +``` ### Credentials By default, a consumer can access a resource if they have 1 datatoken. _Credentials_ allow the publisher to optionally specify more fine-grained permissions. From 5481e18760d4af1c14a7234a22f001b4ff12fe8a Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Thu, 10 Feb 2022 13:45:02 +0200 Subject: [PATCH 114/145] Update did-ddo.md --- content/concepts/did-ddo.md | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index c6444adf..f2d0efcc 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -373,7 +373,7 @@ Example: } ``` -### User Input +#### User Input Sometimes, you may need some input before consuming a dataset or running an algorithm. Examples: - You want to know the desired sampling interval of data in your dataset, before the user is going to download it. Your dataset URL is 'www.example.com/mydata'. So you will define a field called "sampling", ask the user to enter a value and then this parameter is going to be added to the URL of your dataset (so the actual url will become 'www.example.com/mydata?sampling=10' @@ -685,7 +685,24 @@ Example: "description": "Download service", "datatokenAddress": "0x123", "serviceEndpoint": "https://myprovider.com", - "timeout": 0 + "timeout": 0, + "userInput": [ + { + "name":"surname", + "type": "text", + "label": "Name", + "required": true, + "default': "NoName" + "description":"Please fill your name" + }, + { + "name":"age", + "type": "number", + "label": "Age", + "required": false, + "default': 0 + "description":"Please fill your age" + }] }, { "id": "2", From ddfbe48b79a9bb17159bb457bd4a3c78df69b306 Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Thu, 10 Feb 2022 13:46:23 +0200 Subject: [PATCH 115/145] Update did-ddo.md --- content/concepts/did-ddo.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index f2d0efcc..c1198297 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -388,6 +388,7 @@ An element looks like: "label": "Name", "required": true, "description":"Please fill your name", + "default": "NoName", "options": [] } ``` @@ -409,7 +410,7 @@ Example: "type": "text", "label": "Name", "required": true, - "default': "NoName" + "default": "NoName" "description":"Please fill your name" }, { @@ -417,7 +418,7 @@ Example: "type": "number", "label": "Age", "required": false, - "default': 0 + "default": 0 "description":"Please fill your age" }, { @@ -425,7 +426,7 @@ Example: "type": "boolean", "label": "Developer", "required": false, - "default': false + "default": false "description":"Are you a developer?" }, { @@ -692,7 +693,7 @@ Example: "type": "text", "label": "Name", "required": true, - "default': "NoName" + "default": "NoName" "description":"Please fill your name" }, { @@ -700,7 +701,7 @@ Example: "type": "number", "label": "Age", "required": false, - "default': 0 + "default": 0 "description":"Please fill your age" }] }, From abe7d7b5dabe7b19aadc02fa127128f34a91ff40 Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Thu, 10 Feb 2022 13:59:12 +0200 Subject: [PATCH 116/145] Update did-ddo.md --- content/concepts/did-ddo.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index c1198297..00c9f6a3 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -374,13 +374,16 @@ Example: ``` #### User Input + Sometimes, you may need some input before consuming a dataset or running an algorithm. Examples: + - You want to know the desired sampling interval of data in your dataset, before the user is going to download it. Your dataset URL is 'www.example.com/mydata'. So you will define a field called "sampling", ask the user to enter a value and then this parameter is going to be added to the URL of your dataset (so the actual url will become 'www.example.com/mydata?sampling=10' - Before running an algorithm, you need to know how many iterations should the algo perform. You are going to define a field called 'iterations', ask the user to enter a value and this parameter is stored in a specific location in your C2D pod, so algo can read it and use that value. Object consists of an array , in which each element defines a user required field. An element looks like: + ```json { "name":"surname", @@ -392,6 +395,7 @@ An element looks like: "options": [] } ``` + where: - name = defines the parameter name - type = defines the form type (text, number, select, boolean) @@ -403,6 +407,7 @@ where: Example: + ``` [ { @@ -447,6 +452,7 @@ Example: }, ] ``` + ### Credentials By default, a consumer can access a resource if they have 1 datatoken. _Credentials_ allow the publisher to optionally specify more fine-grained permissions. @@ -748,7 +754,6 @@ Example: ] }, - // Enhanced Aquarius response begins here "nft": { "address": "0x123", "name": "Ocean Protocol Asset v4", From 25d17e6067fab82afabf43cc15a8c7c9c6b4ce80 Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Thu, 10 Feb 2022 14:00:22 +0200 Subject: [PATCH 117/145] Update did-ddo.md --- content/concepts/did-ddo.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 00c9f6a3..fc1394c1 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -132,7 +132,7 @@ An asset of type `algorithm` has additional attributes under `metadata.algorithm | --------------- | --------------------------- | -------- | ------------------------------------------------------------------------------------------ | | **`language`** | `string` | | Language used to implement the software. | | **`version`** | `string` | | Version of the software preferably in [SemVer](https://semver.org) notation. E.g. `1.0.0`. | -| **`userInput`** | [User Input](#userinput) | | An object the defines required user input before running the algorithm | +| **`userInput`** | [User Input](#user-input) | | An object the defines required user input before running the algorithm | | **`container`** | `container` | **✓** | Object describing the Docker container image. See below | The `container` object has the following attributes defining the Docker image for running the algorithm: @@ -186,7 +186,7 @@ An asset should have at least one service to be actually accessible, and can hav | **`files`** | [Files](#files) | **✓** | Encrypted file URLs. | | **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of `0` represents no time limit. Expressed in seconds. | | **`compute`** | [Compute](#compute-options) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings & resources. | -| **`userInput`** | [User Input](#userinput) | | An object the defines required user input before consuming the asset| +| **`userInput`** | [User Input](#user-input) | | An object the defines required user input before consuming the asset| #### Files From 38e6bcad9af3c59ef59faf45824647dd788a2810 Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Thu, 10 Feb 2022 15:03:57 +0200 Subject: [PATCH 118/145] Update did-ddo.md --- content/concepts/did-ddo.md | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index fc1394c1..098ace33 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -397,7 +397,8 @@ An element looks like: ``` where: - - name = defines the parameter name + + - name = defines the parameter name (this is sent as HTTP param or key towards algo) - type = defines the form type (text, number, select, boolean) - label = defines the label which is displayed - required = if this field is mandatory to have a user input. @@ -435,7 +436,7 @@ Example: "description":"Are you a developer?" }, { - "name":"interval", + "name":"preference", "type": "select", "label": "Date", "required": false, @@ -453,6 +454,18 @@ Example: ] ``` +Algorithms will have access to a json file located at /data/inputs/algoCustomData.json, which contains the keys/values for input data required. Example: + +```json +{ + "surname": "John", + "age": 10, + "developer": false, + "preference': "nodejs" +} +``` + + ### Credentials By default, a consumer can access a resource if they have 1 datatoken. _Credentials_ allow the publisher to optionally specify more fine-grained permissions. From 19069dec32e403e03c2d50f114800dff8c56bcca Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Thu, 10 Feb 2022 15:05:08 +0200 Subject: [PATCH 119/145] Update did-ddo.md --- content/concepts/did-ddo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 098ace33..901ee5da 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -461,7 +461,7 @@ Algorithms will have access to a json file located at /data/inputs/algoCustomDat "surname": "John", "age": 10, "developer": false, - "preference': "nodejs" + "preference": "nodejs" } ``` From c31354e9270a77d57c6af370c92975ed5136aa4a Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Thu, 10 Feb 2022 15:08:20 +0200 Subject: [PATCH 120/145] Update did-ddo.md --- content/concepts/did-ddo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 901ee5da..312e0981 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -409,7 +409,7 @@ where: Example: -``` +```json [ { "name":"surname", From b5203553240a556de17c01f66eb5bdcf2c49e548 Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Fri, 11 Feb 2022 19:45:10 +0200 Subject: [PATCH 121/145] use hometown instead of surname --- content/concepts/did-ddo.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 312e0981..cce3ca29 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -386,12 +386,12 @@ An element looks like: ```json { - "name":"surname", + "name":"hometown", "type": "text", - "label": "Name", + "label": "Hometown", "required": true, - "description":"Please fill your name", - "default": "NoName", + "description":"What is your hometown?", + "default": "Nowhere", "options": [] } ``` @@ -412,12 +412,12 @@ Example: ```json [ { - "name":"surname", + "name":"hometown", "type": "text", - "label": "Name", + "label": "Hometown", "required": true, - "default": "NoName" - "description":"Please fill your name" + "default": "Nowhere" + "description":"What is your hometown?" }, { "name":"age", From 0f0993df8f400a66a2f09e64ec555543d6b12c6a Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Sun, 13 Feb 2022 10:43:56 +0200 Subject: [PATCH 122/145] replace userInput with customParameters --- content/concepts/did-ddo.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index cce3ca29..6395a78d 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -132,7 +132,7 @@ An asset of type `algorithm` has additional attributes under `metadata.algorithm | --------------- | --------------------------- | -------- | ------------------------------------------------------------------------------------------ | | **`language`** | `string` | | Language used to implement the software. | | **`version`** | `string` | | Version of the software preferably in [SemVer](https://semver.org) notation. E.g. `1.0.0`. | -| **`userInput`** | [User Input](#user-input) | | An object the defines required user input before running the algorithm | +| **`consumerParameters`** | [Consumer Parameters](#consumer-parameters) | | An object the defines required consumer input before running the algorithm | | **`container`** | `container` | **✓** | Object describing the Docker container image. See below | The `container` object has the following attributes defining the Docker image for running the algorithm: @@ -163,7 +163,7 @@ The `container` object has the following attributes defining the Docker image fo "tag": "latest", "checksum": "44e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550" }, - "userInput":{}, + "consumerParameters":{}, } } } @@ -186,7 +186,7 @@ An asset should have at least one service to be actually accessible, and can hav | **`files`** | [Files](#files) | **✓** | Encrypted file URLs. | | **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of `0` represents no time limit. Expressed in seconds. | | **`compute`** | [Compute](#compute-options) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings & resources. | -| **`userInput`** | [User Input](#user-input) | | An object the defines required user input before consuming the asset| +| **`consumerParameters`** | [Consumer Parameters](#consumer-parameters) | | An object the defines required consumer input before consuming the asset| #### Files @@ -373,7 +373,7 @@ Example: } ``` -#### User Input +#### Consumer Parameters Sometimes, you may need some input before consuming a dataset or running an algorithm. Examples: @@ -401,7 +401,7 @@ where: - name = defines the parameter name (this is sent as HTTP param or key towards algo) - type = defines the form type (text, number, select, boolean) - label = defines the label which is displayed - - required = if this field is mandatory to have a user input. + - required = if this field is mandatory to have a consumer input. - default = default value - description = description of this element - options = for select types, a list of options @@ -706,7 +706,7 @@ Example: "datatokenAddress": "0x123", "serviceEndpoint": "https://myprovider.com", "timeout": 0, - "userInput": [ + "consumerParameters": [ { "name":"surname", "type": "text", From c6d829346b3cc74f07fc8b6e49aa30c4bab0c6da Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Sun, 13 Feb 2022 16:51:51 +0200 Subject: [PATCH 123/145] Update content/concepts/did-ddo.md Co-authored-by: Matthias Kretschmann --- content/concepts/did-ddo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 6395a78d..687539f5 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -378,7 +378,7 @@ Example: Sometimes, you may need some input before consuming a dataset or running an algorithm. Examples: -- You want to know the desired sampling interval of data in your dataset, before the user is going to download it. Your dataset URL is 'www.example.com/mydata'. So you will define a field called "sampling", ask the user to enter a value and then this parameter is going to be added to the URL of your dataset (so the actual url will become 'www.example.com/mydata?sampling=10' +- You want to know the desired sampling interval of data in your dataset, before the user is going to download it. Your dataset URL is `https://example.com/mydata`. So you will define a field called `sampling`, ask the user to enter a value and then this parameter is going to be added to the URL of your dataset as query parameters: `https://example.com/mydata?sampling=10` - Before running an algorithm, you need to know how many iterations should the algo perform. You are going to define a field called 'iterations', ask the user to enter a value and this parameter is stored in a specific location in your C2D pod, so algo can read it and use that value. Object consists of an array , in which each element defines a user required field. From ae32de2aa320dcbc4d5b6201df05d2e256eeb494 Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Sun, 13 Feb 2022 16:52:13 +0200 Subject: [PATCH 124/145] Update content/concepts/did-ddo.md Co-authored-by: Matthias Kretschmann --- content/concepts/did-ddo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 687539f5..94086804 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -379,7 +379,7 @@ Sometimes, you may need some input before consuming a dataset or running an algo Examples: - You want to know the desired sampling interval of data in your dataset, before the user is going to download it. Your dataset URL is `https://example.com/mydata`. So you will define a field called `sampling`, ask the user to enter a value and then this parameter is going to be added to the URL of your dataset as query parameters: `https://example.com/mydata?sampling=10` -- Before running an algorithm, you need to know how many iterations should the algo perform. You are going to define a field called 'iterations', ask the user to enter a value and this parameter is stored in a specific location in your C2D pod, so algo can read it and use that value. +- Before running an algorithm, you need to know how many iterations should it perform. You define a field called `iterations`, ask the user to enter a value and this parameter is stored in a specific location in your Computer-to-Data pod for the algorithm to read and use that value. Object consists of an array , in which each element defines a user required field. An element looks like: From 1cfdae9bd72747aae34c48596326e8835d1ac725 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Sun, 13 Feb 2022 06:56:48 -0800 Subject: [PATCH 125/145] update --- content/concepts/did-ddo.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 94086804..7e7fa761 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -375,13 +375,13 @@ Example: #### Consumer Parameters -Sometimes, you may need some input before consuming a dataset or running an algorithm. +Sometimes, you may need some input before downloading a dataset or running an algorithm. Examples: - You want to know the desired sampling interval of data in your dataset, before the user is going to download it. Your dataset URL is `https://example.com/mydata`. So you will define a field called `sampling`, ask the user to enter a value and then this parameter is going to be added to the URL of your dataset as query parameters: `https://example.com/mydata?sampling=10` - Before running an algorithm, you need to know how many iterations should it perform. You define a field called `iterations`, ask the user to enter a value and this parameter is stored in a specific location in your Computer-to-Data pod for the algorithm to read and use that value. -Object consists of an array , in which each element defines a user required field. +It's an array of elements, each element object defines a field. An element looks like: ```json From fe576fa6d59eb979a78f9400f4bfa052984f04c2 Mon Sep 17 00:00:00 2001 From: Akshay Date: Wed, 16 Feb 2022 22:02:07 +0100 Subject: [PATCH 126/145] Issue-#888: Update ddo-flow.png --- content/concepts/images/ddo-flow.png | Bin 104794 -> 58564 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/content/concepts/images/ddo-flow.png b/content/concepts/images/ddo-flow.png index 9182c1357f6ef28461f989a5199965b34dd4d56e..fab9a027b0a25d4023f36dcef441e8fd76fdf6b6 100644 GIT binary patch literal 58564 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
Y{>Bc(NU_tzd6 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 Fe*o>q(*ghh literal 104794 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

aO6m_%5z9=l25u zX_24Oo)|h2L)np7sidu5g3yTE`AUbZtr2^^R5A^D!XpnMBFzq$0D0KO7pwUBC8tik zWIInT@yU4>9U>>5*%+v%SuJfFjKe*elnc)+jFV~-&HUKPbEAPX759c!vot0@h$_1v z^lW9=l0JLJOAF1|<1B$ON@E`pjzCzu+@G;F>cdrcbCfjK%2^kmYh27)CFtHU)0cGG z8jEM~j3zAIA{=21KPv9vJQ+5?TwyN6xb(hisJN*y@e6&?dg`G47qqRtSohm%AxkQ8 z?QW^;6P}T-JN65#6eck=htV<9jbmsaI;v=>N_zfq_`{-;nob$7ZO@3ko`31A zGbNnS)M)J(ZQs)<#mXXIKF^`)QBz~W9Ch1IiCS#-dRKIb-H5QbV7qip$p`hAVZ*zI zSLuC|;+od@JTUrv86lbB?s6rK3aJaNIOUG^`A2d!BB6%IW_59CNo2Rh_dN_g)0#dk zCb^k1<8K4FewFDU=`T5kH#jaYnOw_Z>rXo`;kup0(Blp<{hQsSivy0-XM$r{39pEr z59Z7ab;&Nxy|lQRb^ravGZ`_unm$&JyUAG6Rznt;`3p(!QMaW%VLOxVk+`0+`X(M* zZJ8YXS==};!EzaW)IW8vf`l~ke{-7>Q7u5~JPeJ&E?&F55L`4Ahoi$&%fZQ_^My3qS#nvRgi z&SLU}*v&Zbf$;>M<8PMb#D+4P1cq|qxF481%IIj2+*dcFJ74&mEt^s8kzUQE3&wbw zRzdPe%@x}oH^*^h!#zt}H#Np-8uShx4tl0jWAdJz$t6oQIV|*#qXQSM@Vy$H`43Z> z!#B=x1&y4Z##uv%zlRj&r9D{jF$okz#zH$a6~kx7Qq^yMS&#fuT^KBZn?MAEZ^qRO zV&C9W>CK&Y^GYv>o-nPfnYi>y`c2WKxl#1a9GV`^yU_6K|BIGX)(6uOt>fv2;@(|K|OCUuk--(79`eHt$g&UHX-p7Ipo zz2#s&@6H>7MXMgD6$dULvK5pce=W}3Q$+f@odWe(6B5MPwj}s*Yy15LU2^-}<>6^4 zH8E>)ckc=<%I7ywIBaZJC3t-H#n}%nX~{tdhIZn+wna>1=x>&bWMO z;3dhMbs>xl^)A#tNerDN^zDATFb1{8G>Dr7H_yd z#F&nkG))i09w?=->{8dkTs2@!i{%2UZHrr!7y*xok2ho1bV+;2dzI~0axi~d6c>o~ z!u{BVSH$k|PLACv?e3lVQHooN->IfXaXcabmGL(KQaXPaOKm=qmrb z^;8O?)LKpV_#OK==ssix({gm#ooO9!9Pk1p;cBB&oOS-Y`6PXu)%%<7jO42&S~x-6 zs)%0k>}twe3g+mtYd2f2DdeO~>*n0hSn=#rBMqIoOQ4-`SqD6H#r5_$`;yoj*5x3f zsvWdE73Jwy9VsA%vzD9R=QxFK<#}9Y{&9{HR9Y|Ej)Mb0$g6-7`+%H^l&yO=(ee~d zgi`%i7|F-=820?trvWlNoMWXjDb*w0G{ep?FGd0N&uIBVeXEsCJ;)Px>m^S_VaR=O z(vW6%4ZmdMGlkek4v2+CVhE}9lPMaBgFEf1%%3oFYp7@?=(l>c_?BK-9W)UkK3BPo zCQ+srWac6d;&BUvBF%&R?5i zRZ@SH_NaPK^vR$uXt7wldM^Cq!d>~}lhpGM_ew~31!ZetG%D4i{XtM)Yz9Wd)9-v; zY;>3y`6y z9@2}}ZX1!sIX$rM&Al>gpFEwGH;<;^cqv(MmjILV;utGVz+T7PIz4CKDeOiO+m1a-JOJRkl?<4F{qdm1Tp>HdwaE&t$JbNDFRFk%w(Vf|L-*H@n z!>eb=(XOe~2=^ILsV`u5P6+@ZNYt`s4?lh#Bzd_e!jH+7`g)Tp8Cr&!zci~aSvi*N zvHSe|OSUF967dz66=hm!{H&xm_wD)p#N=yE3kmMjGNQ}N#(Bxyt!0u+{cMkEf+dTF z*j6UR(bJc!qo#|PY45mZuo`QWa@&DCotk)$D%q4Y^8?*DrIkY@q@|g`qOBpp@<&Lv ztgP~s+m~43RoDH=eRA0X!xWB@(=)~MJj{L}AT_~x*OCnT7(em`Aoaa|*!l}~vxa1^ zwcg3(1TkAY;Yf|2j+=i;_NgsLL0NL*Fq*xqG_#BTb4{>=;m6%FRmIP`4qWH!Em%01 zszhcb3)Z1VAMtCnGB;(Io$u=IRg0Hpey|7O{NH+!Vl3{Tdh+Exs>^@A5NTGW^aCJzTr&5il@=NMHppQrKL zVnVG(SmuA&c;!Y#sjww|{uuDOCviodC&H;7-Y2V+tIUHA(Kl4b%eWjYZb@Rh z8?}eee9&4NeSM^Lh&Mw1xSK(`aa+c?`jGhJ;ouiDw5ir?u>=;=Hxu@|g{GXlYZ}8e_y>3dK&EpT$`YQ}6P-LzrZiWhTEKo7{GN;xMi-T`tPr zR(-kAEZQa^h9E}GsFzetbyzWDw~T;W56_XaRyr$(O*t;h_DJPNhb}VT&PreCjb15h zaxIee$E4XEYIWRWC+yjl?+Nh2Ywp!QNUpC6OV8ir3A!0uy%3`VaG%oyfcrco=dXT) z`)Y3<(Cqvp#dElA zaGu##erWbdZo`zDntR5L;4J|Lxy)_=im(7E5+iVj!>_Gf&KMuXMl#N6V}x^n%GthU zV1=6ZgnT3%%WvgU?gbS(n}b-Oq}E+7eqQe2b*+6ud8U~aYMc4kE#jSd85889iT6pu z9?IE^r{VHkx2jX6WO~b7X5)`l^Rfz~*gR`6SP>K-UORz_zw5Z*5^r}i+w3YL_IA~1 zF3Cd_EJLr>WY=xmY6OD}aqj(emD;wrj0*Bu-8FaP%={os@Bm7Hx(qpZ+>=R$%ZnezZwPtiR!re>qXgZ^2tCvtY zT^gJxZqQ9Pnc5r^o_JSFkDo)MI-QG}`N23#J^zx{a@*{IeP*srv#F}HlOiLNZmtUA znGefiKE*daSYwFeq8;go6pJX-zuIXXRqKf@tQeTS$JaEikMo!DsuLj@_s|r@t$R7v zzaElfuj0Qd=t8L?u*E=INV(|Q-l>xh^pQ9={X-!{8(oxT+tyS+Q@Yf$>IsC`Iz^2X zo$b&r@M*eIikIc1dQrN-~e*a0}mV<^%;p|EL{v)trNSW?0`bT2F59N%EPSvIU%8h;1Aa->C~} ztXQV<&%GTXG3rzp>>Nt6%TwK3fhC;3`nk+K&Iv@Ag!43c$3kp&=rWXw-a(ygNJpgh z@f)+Ax8S&08D@K$<^9W=?#zL`R(clI}sC#47$1v z+JKKP6kV;|F34^m=HH1kD00&SZ;U2xB68Tk|is>xf3Cp)O608 zrC$aQv+Ju^+zsM7bnnOhN?%*>%tB>Vqkp_AfSm7={z7bnEN~gf!9Ky=gljW{w>pEJ z=sRbX!fdm5gVFM>*jn)fT9P7s#;;^#Fv)nzc6;iAszD-6@(*f=hEYG*^5h>kC>qRX zR#blq6~0bH(g**~Ksd%O8M2$SMr;xB&h%oUj=%5-*)l7@l*2|@bT-TbYS?qo7c$Z% zIH0bsV`IAd#FMerfS7T)Tb9vdFq#kXq=~nQ2->`iMMQq9ecScN9m7wUW8_pbS!S1= zHZ>N5%$QJd%EM{j--pRSs>?JNoqm-gXc%~7z1qjl?b#R(w)i{p*o!!9W&j47t zy_ey@k8=4rUSg!WvlD`Lpc@H8nbkug2q_5WgG2-z#8jGGHGT+9Yq)qE@fyp}YQq+^ zdG-3tbuCbu?}Swc#)5kp_inI^t|06^+`Ww7Ayh$AlgE=;S1vgH7A5Ha@{@rV_~-%s z=0x~q0{qI!Q_)9wfwQL8|MHs6D{Om?@B&#gpZkKr>kAO?+d#oo@6}0XKMV~D7(pL! zZ6M9me03~)!`}$z8#@_7=LM?`F?VNnK7WB9SEV7*4+M;vzLD1I-Ah~8)8mr zY}lSD3S9AJ;7-^8U9`P-?*R;kIM=*!&e{s(yxu=PDC}tk_<4OP$BoPjZ%X>SF)nB@ zJ@PMa4y`#x{yo2mkso{_fQ(_hEOdo62k6$KYM>8|g3X#08 zvQinnR-R@u9IE!)`0_S#AE4hYk2``RW#%_)2~0al4A?*+UIJF1AbxlUN~&mAgQ%~5 zWuOWBO1(?%$;_$cND_cL6nqA3uWrsqk)WLy8ytV@!IX~v3|oj&wxE2GS3S=0GW zcsseuSQI)1d&;{gyE2^`4nu9CHL&w~g@|$chQQ-VdqMySrE1j?8Tnk_2+005V@NUS z-|rFo1R=RjjnIK&3u(~}rSFpO-W(9$&RAQ4l)-V9O7Qr`5Mm9<6ru#`y|R{}&_(#> z&7rbJj5g)Oih|WWnlxbxB865pjx+>o?_M!PO;z7RLwcf`<3{UC5vjhFAnmh-J1gV|QCh-TD^v{Z zCDFT}%1Z5(o_@mo-qvs73w8zthP6vWxAy)8I7ViN8A~=Iivo8`Q^anH->z4r{SvAH zk)AKlb=#@eSxvnG+do=jy?2#@;4hC^&xEY7~=n#|6NsnF(95T|4(p@YDc)72;*rCAUc}s zuT$mr$G8J0)d>hm-AFJbm)w`G&D~lu*;&h7zH$Ksercrr`LUps?gAE(2^ctNS%m|q zut#A&G;vV2QJ#gW-zUE> z10agdMY^#Ryg3@RP~(y>7^|_2SfqlrLMuX*iQ+N7{wyxXwg-kJ$v$C}7=IYs_MXFP z90-|~2m#F&=4tQ!$P?yEZc9TD5(_BSAM$@*g9jON9&{M04)}|#G3^*^*j+bl{$`i1 zQN~DIMFrCYGKx57Bij0Qsk;D3BHOQ>Us&r_U7Q# z>16{7ODEuwbU}v}#k!nuP_uWdcY~O0ks%K>e9w|gW5qm*vZg@(?^@vsG>rN4YZStx z=fRnE2I~RaBO*>Q90!$tf$g&%f&3_NtZy|td47T`p?b7lq|g0 z@`*FM49Fc_u>5z~2@n$WH9u;sh1<%{q2Fscm-j{-J4?fsN^nC{LxDE^i@?(15y!~RcDuTM-_30 zMYc=VI)kQMK@@4CA#kDUR+}}f{T~AW#$YsXG#W_!HH$z(gemF;AmJ$5cUhY{>m!Yr z7gFhAM}$YhR}A)FHlWf?3R_2Cs3uy_c(p^B`i7P{aS#{o%(cWGad6(^ZR6|9lu4`h z@zhk~5oZX3D7f5>l*Cb?Nq_oEbIQ7Eg3K%KTrsOY@GhBc*oJtZm~T}f^)^k#i-qO) zgWz?NojmN1^Y5~a%R1cyJy&P7v(lN$8zz?+d>%D5|c=N4kCYfv|em@osmWQZ*tn3Av)6`%D9_+m82RfqOI4M#}3(h0% zVxPbWV`@w3^|^-;hAbIjd+M3RNo8YO%H00~f?~?V(!lW3=H|IdjMcBZU&5Uo&CpXZ!a+k76RUl2(${yf;nZ}rK)EX|Rq&DjO z-`w36A9s?lUIWX%uY&B8L8lOb^%$(Ye8j(&T0u*-!UGQPH~9Ur>u~o@kn(=r57A2m zWDlC#wbte7>bi{3#KB^hDoY8)ksupV0M`FY)1ba<24~wZ({IxauDHOyE;@h#`u#^~ z9Y+56b!eC|H9`_5!Nj1*n57c#VUb3R8f_1Tymlc8VHbJ5Z9nRGoR;Ujw=L{LF%Qc* zy6-*}I$HwXBB{Z<9#SytgzfwQgrYOYr-qO^T52xIW|03idWEEsWjWx;8>e56kFV?A z=O8g;8S(7l{cYfYk<9%o5u3gE*qjF|hO4~=wVCOgyG=ZB;Or8iK>@A`kQ~!iWP-KJh%0ZmH zTF6UvxDMEX#!IR^Ylv|#=oed%$m5z?se3`L`cz$sR22PXCNx3h2 z`)PPl%k5g%SKpkdvfl_Skg1)L3866_owMPM_HDs~$vK~zW~FF7K~Z9hPs_gH&fH`J z@UCGn)y_6xnS>5B0||@mt{yS|JN91y$`pT)yIot#9i%7O^qnObG>1g6*I5G~nHLs$ zBYX0rk3MrCoCPCqzVHf=blV+(G&loHDZbiB!@)KJrVvceyW&5ArRGHQC?ecOj-%s+ zgS-0-)3q{0qRTqekNV8)PA=3=zG+jrCOO{>MwQRhmfZJShOGhaF{-nbuSI;ngLXG) z4c)ronCg*WUk)ET|0!I1F6nb_1`?#rvt%JU5+Q4FuWe`yYKZ0Ksc{G6Gbf;gFFOGt zdgv9firBE{*O8{84OP}Zj}-=6OT6>e7SA&qUI4%^jpxX!zl|biGkA|MBub|vp!?Ew zoH>f55Npwwzw?3tvL3^q_>v}^EH2`%?pUvmN-$}*XD{diA? z-m^ypRfr+wq%cGi!1Z|tnhQe0z`YE$3f=W;b-Y{sbY{Hj68e<&V|O#@`E5ZhvEp83 zed^RyjT(Hrjg}Fwc4cO&kn;e{B+eN@6L__BL{JlU-B6t>&#q4_U&NEw{uj zpSWZMwoEd@&0ouwCXdUrd>Ck+2(Wu2QW0(G!d!>$@xP9c!FZW8jx=S> z+S|&j(;VKqsw*4KcUM}6;$u9;{@NTYh0c|1Bl_I1SKb(}Csn`r@KQ@bLiz`F=eA$6 zB$b!MB#YLx59-&w=DuuIO2e;3b>=L>qqbXAAtt%|DL`6$8DilDx)~&ZviwrKUpkpjyLGki^2?pZAR<9_z={0~ z1AObzYD|$o$K;r2)aU8eg<|KF#TE}M#E5jdMG?H>&yqQ4VAREtD!16HLo6ghX>TSs zP74ffyG5<7qD1Mt3ju!54GXN)Ekk21SBk&9SLG$H=favdLN-Ou$7@ixZQ|MOu4qNn zV)#e&Ll=3TwoKEjl3RQ-sr&654N{dmzkQ;EIHa3B?F$x zBv~6@{UhAK%u~T-f4LH4dF1Ee=lc_r500i!AQC(d9^|5)gEX5F95#Riu>r^i2Zw8_ zBh(vyaXn{2mEJRA)2j9JYPPWOfv}8w$H7xPfd@`z;$0gc0RI5{ar)9JiXW&)N=5}3 z9n*rxhg!G7n;+8QLl9Gwp^bh;;S7%OfCb%U*l}(m&6SYWjx^dP5R}Bh`lcCg4E}MO z(Ja}}5!4T?uJY`8S+zH=jEM!T0ew}oo}ImW0~(gKrJt%D*+#6d-qU}$_4M}_4eurH z>?5S@ToMP;h4DQ_fswsRe4DL6EKGey#~p(7mGK)UhxOb|xrArBe&jsi|XryzuGlcOkVXr-i zbTwR2c(?V((95F`Ue9{;CCJ(hbScr_;Vhpo%rH=HkIZ#9L0065QRD!7(X+}2+kfDn zn?o*yz(A~9?}`5W*qKzwiLS5Zs~o1>7^xqd2o~u>@~olo@sS_bPsY@=lZ0&Pn(sY@ zJwJmB-`?eehIeRtR~`TP4c?f9?bO>=hv2N2Nk25ZiPHZRH4LBj=@k0IF6S>-J#6Yj zJ2O6bq2?FK_V@Q;D?yFkcb@eI{?}mom#^NO_Mxos{FQHw{rz8miN?wJ5R=bs!ps^! z^u<30<*z^ah`<_jk+k^@m=Ob)Og48CdJX+e8nk((o7XZ3`qaif7k&e@+d{k(@eHk0 zB5VJ<(cPQ@-$#x~8H>x}`ZQKG*R}mEcqVc|&tPK^W+J7hG=tZJZMG-}MF3*ljo~OT zhO>LDfP(Mf#+0;h@;Q9=1q4_O1<>@W>6u;MMLUYw&D$?Z^j_0Ke9GXz#~Q_gzCBXx z8nNgorQF%ofW(c}_SdWWbzm*BwzMuh(+(c^X_oxsJBAOzGcX`ge)>C4HxKbDb^COR zV&jJX@nfO1bsYLV^+```Zh8Oq1sFHLWS?ngMpq*(bPs|No-qXWV{d(4Qdw~FfFpc) z60qbm3Jxr6n2o?<(jZ2h|6o6Gof%F_I~o3?P0>PZ1xRrg^?KG%Id7DEq7jJro)390 zBXpE`zJyPI391vF=YKYm<;j1AC>!Of|sfmoR8{xP@tRR85EU<2T`uT5^pI{)tu^6N82209H%bu(y} ze+7Y~nRu!X+TTFjL_m%y5*;e6^Ycl&u{QD^R@h{8Fm?Uf_KGi|0(!tuK^>wmP&2vV z?;eo>6Ij|G$0VQmol6u#jvyA-gB!=(-+kc5zhU-4y=|P>;r6CL{@+H51pr^+`0CAR ziaELKftZKu0`yNUK5MO)4A4`<4zQz0xAui6vO5M)OaKuX+w$ML?(Lw-oV8&z`}JJ> zb{TyBuwQ*XrQEi8Rt>B9fI{~Fu=mzcQSNQqu%fe3P(cY51XKh`MJXB50s#r>E~P;f z7`hEa1r!M-N9i1DQ0Y`b=@>c`q(d5JfcL!I#@_qh_wzmLTkBox`{VoPUU=(<;ktft zp2vB_sa_b#>g)L1-wS3CAy24fQWWdw;_3&7gF3&0~U4>(yN7vnbqke7r=OE~XoWkw3BeyGtaA?jXh z6{9bCu&@I^r^u6$HyiI3TLi&2-M9rLvowZ7L%#!W^F7VM6Y)vTIxyW^6pq<~maP(2 z?GeQ5(W!&|E`nM`gYSfZMic5neVHcMM7-l`#5+0O(#|_RW=#LCR%|ZP-*g8}mMq;U{yMcAnf~pi4Gx5E)(kf|&wI;{H-% z-|YQ3((p-Rz&iFK39bt_XQRLoHLJwmUhg1f+hlKQRV^e+972N3=N=i7ju*oT(*G^t zQ51_+*XE(&U|dXJflfzB-lW{-&jtQ->p7kT=O)6M&17&KWaxh5JUFQ*P=inLNg8Mu zY=;$9F!VpBQ&refuY(i-8K1~BxQ!US>_Nr{-s^U$+ zq2+=#i6EhaVFUt;6{IUNl;Fe!bv8gvKfi$~{v<%AvF~=;jJ<7>FEFpm#NU(x(&G;+ z@-&idV!1Zb|KS!8-uEKe8E^YMbcaeKj}5{nrvetWF~eB!i%;NKIRv5e6mSGk!pGJp zp;y$WBf`RWDihmho-2xsgx-P|ULEW;BbZ(exY)$#DD1jjfXL?A5q8-z;Vf6cIdl+f zifZFLPmmL8@5awDXlf&;3RGWSTHspf7hcn(vh!Q;J$yu&Abz@Z#<>TyIC)%*0PR z-V|J@28^1q?eGW~_dckh^K8c#+`|Yo=P>kbB};BthHrrNN^Ul^t_Z!Cc$U6U@k{=k zJt6OO6ryO3D>?234a4j`8pU(RGQi!y7~-Ml-Ap6;I6T zbY#*1>8r3Y=)V;qpNCojk28;Ih$#+Ryc)QY96Jf#0h!*o^@+6-unZuI+k;hbV{ZO~ zS*_2K=+X5xKFHPWCCz(%4dw9rF$YZ1I=Y#uSVsBm=MMH&JeVzs4*B^<*zi|SJY&&3 zg=4P*P)i3Web|I9h~`MDvB8L=WcGS%-pOV1jB06zlWyJ}+U9KZ%JMviW_x(cqdx&8 z9e|>up`17gz1Yq9KsygsWTDUYOdss6_R9)DMLdIuGc-_*tq)A*hihe@%)Eo5qlqHx zm(=z7xWEXZ+9pg?Apn@vyiSdkgW=azo6OZ4;OHQWcsFci%}Kgq3Z$-?#GIv}>~nbVKp{P@gOm6b)=H|VE?-WXClU~U13VNO%>+NXQ?9Np zo&9+KxZ#-IC-IeDFLCWbbdC?!P*O;xXQki;*@38gs zeulX9Ba?8V+nt~? zz|(M?Fg>l3<6e%ikA^*Yqgf&D4Suh^?6$rIdplB1j(url*8O~;i%y~A{JU9kam~<- z)+;744&77MzUE~~UZgK9#0^s>&)$B&rqVb}_cwP=_a-Dedkp=s7QKVbja~cw(@TWZ zSjoaIX zWh-dh`~56FTkK2;l)k?B$Bm_8%hqS(gCdCoeXpN26odd4Jv zaKqj6WpVC%IF{ctrv&)kMn%~=TFs{$Zqx;9W*fdQ1~9_Xi{k1;5qRmfl&NArN*_w@ zp&S@)*Y=eeG3Td9@bCW6R&B;U*VtSm-JR4!r-fLnh-D`XK1Wkl`{X;R%r$l-Dz0df z|1piD-EmXMO|UQP=u0vKNNxT$YjeZ<)lpYC0iO{4C{I22fCl{=HPyp({jiMzeLY+<8@pFwK^nCPB$=QtYZ8L`qfK|<3nklLTs*Irh?G!0 z2SjzpL{afy*3wUO#u38BdWwl0r#s^!yq9~`-5LWKg%xRIX|*E!(N3Xqg?8<4uNcUA zuU4^;o_lXh8g8z^#9R^b_#$r1ibrj)yz{YrClO%M-mk94d44V;6Djd(Q!k#_dK+X* zN__c@NfVm|VDv;!*Tn(O)Mro8E7b}6xZJ#G<-^3>=O?nv@o47D*P|>eda~@pZbDGV zr5M&+*+wCZ(Y4&e*F3y2J}N5j&x%X7A3M&zv1bBYx&;tM~Z(JU&NCQ{Da^9%iI=9z&1ayj!NjEI9qf6awLVW>|`D!PolN5 zc}VjSWmi{nwppP)bCYOa58nKssGG_;lUFO9lgwhf(;~b4jZ&*!MUT;T65s95mkcjT z%-lGCEez!LqH!x_sOgTrT)pvIi0$VHv8jC4}4&a}h{GL@h>?w}mMn0dE5&YrO>R8mO93DG6VbsrU`^ucR) z%gFE78qDM?dKJg}W=7R#(qlMrs#Hhu16i~wRrAtI&Q@;Ovw4SEJOVKaTfFAHaYpe; z<|2BdHPSm8Tg({O`pgXVgU@Iiwc*U$Q~CAt2yal4p6eK1;in~bHqv(&8CoRZh&PQI zDHYIP2QTdd=?2UAkOH;qx&_$>7}M*^dc~6yr5p!(GMFqa3+d;>vvL)8O3-;kn;EQR zha}AtHWCws1;R>Vtq${XFNM%Ttzdkn#~V}36H z|H+cc_)!1wV>w+~#d~;nAG@wFZO63DuOSgN-I}P^tyV4Zq1o*1+{PCn{l;7maE0*; zoDVj9?b_~nGv=VjIITF*r0%1V{M}(#FRtJIW4**vF4`CcDz{`SUOw9}C={;j6pqGa4g#i%!lv{L@2Lsj#r z)jc|mE6zEbORXzz@!N_6*B7^WMD4vSp{8QalqAH}SeYQy^`O-#{%en;5l1gBTY=)! zxM-A4H{lQx;CIK*s7tN$6pE2<@$}WO{PUv?($%j;)G%2BmYMD-F>cu|Po%1(8m>*z zQhA~jBb@)$g-v#J6R?&<qnX%vBfMeOk>Fo{!8Sm@X{LG0$wQT)drX*6F+Hy@Fid5nS|08B1f%VA^2xk#E&gwezJc z(G=(FqW6|ybGRVkB9K(nniiB-a{SgPl6vep^KKaD#krj1!Q6iXC5qTwDR6!pat)Us z6`L!)Ell5WaZh;9)!hckETlnl%jJTreuO3P)1fTb^Vs=8lfx^umJ;5rsgjpLM+@>F zI7@M1qP;p&9Q=7l_ursaW&3_I{Og+rR!Vat_0lgdJ(wqLDiIe84x`NpTCP|it zQ3r~KC2n6FDutC|n9bRIC$mw1ku(uK8F{U#G$dg#Nnvd|@2Ca)PLyZ+i|V9(D}#nY zRQmq+Yzvm^^NK<}2fDIy<`CC3(Mk@fwC43QUHO~io=KB(1X&?d$@kVs`l^z1Z3Edg zS>3c81@ivdg}&XhJz*x#q=A2q>s|W8EZZ);dY#Igv9h zG+k_Wy2F@5oNs|0w+C+w5cT=#b?CHFv*$7{~9%!YFy zryR}7DltiIF;~jDzSMV~oM||Q={^+;bCO~V!{@8?1$*vEQmSd{zN(}mI78pX6&AMj zsfk~L$j|o2ye;RmkoT7FsMbZ zmWPkuaE^pg&S{Ig_IvJIa(OA>vN)sZ9^@{~+{tX8+TN@3kfA13j8;J7iOl(V8qw&eIz-EVm;X>k<2Di!eG>3d!bF*jRAztzvuAT>c(2ANJh8IDO6-GB&3$w+RkII zHQo;2jv8%$dHy3Ktvtm#=LeP@eG?YPVww^`huw%StE6! zIP~=~3FYKNF`B3gRDeGSJkQW(aXih*mwBShMpr=8cV0P}ye}fM6lvF7qf8dML(HR` zS;mi86uO}bmPE%8xM{^D%sYseE@Xt7KtF8bxuwu$V-QFY_dS2iVe;_kV`FgKjh z+p8GdMA!a^E@W_{9OD@HQDX%c8&+uWDzIR(D|I1lA!$-$^a9hJ{4(^DlPwJgZ+laCz=)0Xvem2`L*_TKqVtVE5gd|-kr%;e`)loH^hATO5|Uk*~Kw97|m zh^*2~@`))L^iX513!1Wer&%R!81v>xJ~+AjejzRBx;b)(`F0%4_PK7dJ-phlGXPZ| z0^WNkg>=s5_=E`e`xyqHzHW>LqsVC}BTvu|D)E#@ebyrPt(LA{|0aa@FsX>WBNdvMj2onZA|0r9K*c_iuVS=2vjRn5(iY1V%&Tg8py)1J+G&bkL+`sd~s<{M*+`yn zn}|8|e2O*+#iPli^?xwhJc)LjNDbiK|MaUZ({<8j4z@5(enau5yt>O_Axc@5?*%%W z=@D=Zx9q`)cYfLtfJu{^q#hV^c8e0Pn#_Zt@|vJY{Kl8BLb&gRIx~OUQkuhcCjZZx zn`x73gx9g|g&j*Ihy{99V(_gr``YS^_tzKZ>u1t%%j%+G$qm667t3dM%T<6weOY@q z>)4Mm)H)gYaDjV?|K!(N?mrLLX}au&sLcf%ut=M(_xm-U@qLJLvrr<&S*pbB6c9|4 zmb9q8aAZR{`4wlT8uR2@^L(D#*plLNbd zE%Jhns^!6~=_4XAE8%6)&uD&Elcb};tmCe)I{kkC^KYFdIEL}e)DMF5?jYw-aBj9} zlq3yNRgm>>I>@u${9!K1<2rK)f&tj zo;}1+bJKT3yCWqS)9%`Kb-z_nlE!I4I@cqd8L1tDAD=eV0(wJ}(Rx=Yhj}4=7|)!= zfXQ$ghZg2SQKw+S3tj>Fdn5tTJ6?^gS9eD)>&p_#q?bP?%((?j^B`TF+ze~rhYp7d zvXPt*i-M=O9N$L^1F9S$J#M|5IxMmIb4N~#vprokUe8@Vs8gv@Z(zj?(u@dfjw{^G14 z@t&Dvll{p;rwoTnL#H<1!mZqVCw*0AR8jI`MxONgk(S3hI*gCo-XY~z%R~oMpwm~+ ztZxmUvzDj3+>mQ+;Fak0^;5`x!#^81J?75#aftAI6p@iojiFEUi0j7{Te%u%6ki}=-? zR|NaU*oS91@}6bg0Tl_!3<V zfFTf_9V8lUc*Ho>=VQw=rK8jH9&}tkDfrq)I;n?tb_g^(`-Jp8njY_%u!-;5cV(C3 zC9JylSI6qR|8!uEL}sZAv7%N%Qrg@7NT#lx-{qN2Qe+hKl7KHuT*gcH(6j5lMt61( z-ZK;?jl$L5oQytQkm1vvQJyc&>HPY}q&*>{w$NY(KxFK-L54mYXO*s{>#NLy?mFBv z`@ExVd-AsPqrX1CUI{~m{Wi9kxOWDln%lP;t`u~*KVU5tW!;jl%@dV$|19!>_=0BT z%WvY!pYumwGisRP?lBKQA6LEyx;L)u&hP&Odu*pbpTpbKdO>mgrl2mDa9ByV-n8RD zeaEI-hoC8@CME6M7q?-QsBK zezhe(AYkmTX`jFoA3qYb!sh3ou&V@@Y_6;qL9LPp{#mU4Sw}ct^(o84d$n z)*k|b;=<2??s)Qop8?h`p72Az*Yn0Mm&t@t1`*CHrbFVkB5B78L! zf9JuF6OpDf8^&?Mb{A8A`MknR4iB1CKf&9S*N;*GVU1%}IgE0uScAn5 zFhlv64XjPUHMK(O?Y^-T&{JO zv5I6nHzs!~ocZ}z|A4K2{;};E><6YC^)?tSQQri89UtV%biBRs&|2LWapc9NLNQoq zL$iB5V#N5@)@~XhgBY8HEdv0v zOGrw#q_x~%VB`O!5&Ya^>@ZQcuGDg62cd$z7U++vV9;f-c77^A>aZ_R@7D#FKqnF2 z^+@6On+rTO2LpFdH3f^!Uy0WYTmL;%52bbia|e=hA*AU=bl&-;`SR_Cm4J&ey)2>- zD<%Rp0~&ZUd9OCQcKeF?0#s9tO9hwS(doM1LO9<)=$mF8*1hi`++<&C+4kShsBSl; zquZlxew-M-I*3#e&$0IVbNu_0M;=vEEy5u<{Cw)4lktCj?s$0aI*&sBEwt!Ap8F4O zN$tOJt^WA}{{N5s`)yLE{J(h0lzE0=j$4Tw6OehT{wIUS=;>wpZ`Ntfv;EWP*gL;} z0>eckAYnloCd4HmVP1c}YODwfL`5G5CL$NwuKnOsN2*|DOj0?m6%+qA%VR7F`=qCiCYf9)IN76MpAooo=&6o&xFPsMcU`{0puGTwZG`@mNoly}4go+;}qrO1_PzmGE zJi{6iZGG+|K)3$$D|VfUY_ftKbR&|^IX z&gawWWVqqJKX%6H#W|B>}uY|6Xcir&*lm^4xpL%^WXOM|J{u zdq^UK$RXfd?=5j(QFPECe+c}0!8YsVFpwO+R(S6RHO5(+;&1PUs%ez=0GY&D2d7ik zoU#d%JyAW-8(VfDy=T>F?=|^Z$0uI3j6XN$e;k;Ry8*p63%&7uuGPdt#$Z`eL$7-m zMXyzE2#ny*Pfp0{cq+tufN%Zkt_3^KN!=mjyA~?gA>j}#YsJ+EFbW4BirH+kTM#w{0!{XkbQv|6|ac6L}y!!r`+ z$kydS#16rpkOa_DPvON~1}=d@8(C_Mf}X|Fp_1RKX-a2hPsY%CtrQL11K!1JgHe!U zAG4@-FYv&B6CGF!B5$J-o#Hd}GX@Tg;zzFKuW&o>qiC3nBWu&tyM6f___MU?n`))i z*XUue;pWQb_dqkpT`yw?xf?=MPK|Ku)~~dOUz_R0*S;C70yP#RG`??c!9?{gkT`hz zxHQ{cL2*h26em@N1Oj@fc@|0|Dum#{5wcqG%vUDf{k#;`Ejj^d~D(6~i{PcT=$uH-fU>=vYOCF7aF zKuzn$)5~H_y)YZ^cuyxMVDre*?vPXM zg9K+P;D>mgL%N+~{zpDD?V+vKG$%t{d&D-q(sYq(O>N_#zT-7WOco|-O}kg`mvLdF zYto?BlihBUS>sj5nY>fsZI%Zpb%@xbM2I?=n2v+7-&+u0MZ_HkH!iQ8OE#ws2HYO+IN+;Z3exN9HDr@eR;WGkA==65RhQQsE* z7s+uvOtq@L~Ou;{}XO2(ZssE|iZ3SRJn0@zX>@+z7f6IK9^8;p+= z)bR%6q-CjO=}X+oxP(~&lXdXX+=HaKlh-WF6K(^UY}V5;KgpHw!7&jTwHpI(VzChv z#;?hZHMLE{=7#)P)_Hc8s(zJ3a!_JPaqKX4`?4TlZ# zai}XCtWN6Z|hZ248o-ASZda$_0 zs$krIEljMA&TVa(=-zq!f$V#Y16{lFpiX?>^(GYzsJgwU)e+ru8Q1FJXJk#FX4@6n zZP?S!DK%ipJO4bNSFy_Q)Yh9azj8!FE%t_4Mjyso)XFExPzr+hLi7O(wNkS8H6di# z6fWGWncIr}h8QvpxGWdTk~#@(TMQTplj>aqf<<@FFKbN~A^IGIFg8v&+q6ls2aGwb zRNo3oZ`s67Jb%K(n|1iGNs~?oLswkisXHnan*lT@*E6kvsbQ z`o7s{tdkXmH)b2h)oIT7Zifh7RsP)^sZ~B9;m2Lz1SAz(b^L+3am_zig-`)l9fMkF zcl-+qB#Of>zBCxXL39x<`}6{#Y!g3cE%9Hgv^FUpOOmzE75eWdS3N5h^G;BwSZ@NF z`{w${hX(Ogc%h=Cy@7m!7Ax3ASKSYn-=pb?0ZVB=$bYH7GcwUcEh-Xxp`>?I{YZnYo*Z`Wkb*u7JRKhHz{do&O&|g9LaKvD ze-L|ArSYSu3S@A|&)c2%9UV zD{w}t;PDR)$?qyP#TVqNe|<{V79#z`q8iS9*<%=IpjsRu zkND#%%WP8!^ac`ca*&j79yU1v1M^-3kt1qc`gfzt#gqQd5;WP+usz7 z_SVch?nOkh5%$W1`Z4MdqD;C47szT0O}Em3LZkpE^VyGJWr}&?0+cJyuVmB8V_99N z44}r;4r<>+UwB{kf4CUIBV}5l_PgjG>xtENr4+u_>+J0wOzRY{_OotiD1 z47`%A^EcuWrEJyxcVbkO_2HhU!=+2#M{HHSt}aV*U97OjC^ntlPO*rDi!{!Bjv?o= zy&kpWkw?=fa*8%XD8&1-zyad5wmo)^n%6&jGONh#YJg`X81Q&!#1xE9-qo(;&v#qt0( zI{+n0Luthh)Z+zWE!moFU0%7lNrlSRO|VU=h05UzQJY#I$8ws6a_(e7zlYmZU;*Dj z-6<)4lNT7S7+R+AG`3S`F(7bmrP$UDv$a_?u#rXJor&|rW35g2_qvDz$1`BmL)ARfw0 z+Tu;XL{cI-(9MY1(EI#RpHHo75Jjo~<#v0qhOTt~+w>%xuJO_P;S5cSn{ttdUxB-y z1i!CDx)`snaf}IQ&u6Tq{ej(FEolwjoRX0W7g)D2C05ml4fjkB{_0(`GfiWg&;9KN zC3iXQ*e))EcYF~3scGtPm$}v3uaj%I5lNm-mW=DFZ}q!=sy+dO!;*Cji6CK56@D9Z z8i+F$A z@x9lBuEHPE_te9;yB}-1K-Q(Gs>2Z9f|ab;q%YhB#yEeT)sDI_Jm_0)YrXYnXIgj( z0P2`7!G}tdY&~u7F3X5^yhYOz$jBJ#)0XgbV=cSXk+DRR{!RhP3Q))}QMFmqZ_hk~ z!+#Mx-Vx5sQHPc42Jf0t>$b_asn;Pctyn02{Sotrh__^DmU+$h()CzAm$|_?ILqdV zidjcQ^Iu5`b+Ytm$~GD1<##S_ozKe;bqlH?x%^hTSzO(&+rnAAwMhiv;fxX$UaZD% z-%l@qKVe|(2m(U%aweYt@q3;21^NE!n3sa=0Av|IWY_{Eh{$62$DTvfu-{@I1{o)N zY)9nNT-PGSeeX&+({j*H1@8;nx$&j6_}{c;5UUN3Mue&0Hxh*GICY9p%H{VNyVhlP z8~j`8+RfdRS3++8Q;Gj$lLBln0j=z<=F11~A!MBI;u4r|SsP0KM(}@c=%Y=xV9hmP zt0cbHj%|Bpum=o9@G8$ND1YMRP5ERxEs)(7o00~OoVbUNV*c&3Ts0D+o#37WV1s-k z3OL9Ux_pWFjB@bNE3tKG5HbH)@bvz#->&{dQ=a(}P0G?lJNFnQHQ!A3p0165@feKd ze_ZoTX=LmAGl1JrAUY=)4#=bnJ#+fG&hP93K%?R01=j3fXrSl7uID~5o?bU3s_Jo5 z^un;i7$*J{fKTiN8v!$Jp{GK>ezXD`A7o@^kG*=Np*9M+nf?f08u&^l#@>L#}~HENo3a<1N8tAeg~?HSpAd&@}2~uSGZ`Rz^-2aDPS-R`bQau zXIqnlH8m@|{(asS22dqV?cv66xD~$g-A6%7Iq%FTzwh4^kbs-+Bo>VaB>#}%|M?=7 zL5xpY%1b)&pBNCf2vG^1GLQUQ7=%AP z%esFN`4%GZ?2P-2<*y+cGU;*jD~C&o8i{Ub0w_Z9Lk!P<{xEo8t6OB^zP~Hw?_Z_F zlpk^UbRJvg6g~W#js1ImqY^o8zbl~c`G5OTKByQC&iDSRTwW7T&?14bI$gE^)$6n&)=14Hy&B~ zU;OJaUA z=F{DUm^{E^gtMoIw_Bd|=eqUPpgqKIw#Pf&x`swR>d)n1p$v-vBXI`7ACOqeD#XZi zG=wut9Ys4#5L^PcGQ1Uy<*y~u#Jdy3rq{PhZUV~L_p0PCCJ&c=S6>&xm>`=jO6JFR z|No9`A2wVpbh15qf{&$cVfp1Sbe0f`GRcvK3MwF z^>ti<#$hA^v23wO;KE3?M<;-RB|!+P3*cF4bJJ3$%t+hX5a5FQz;W-k|3gr5 zj8sC{t=etocY6HSGWTbBlskM6mqP2>wuMVKOll9(8#eG7B zXA5y`nF7T3rFmn+*6nU>g55GRXUDr`4^0KQTU!)j5V?jUt}UBD`VO`E??!SxqV?CUwVE-CHru znHQbcA8HJj+!$AS3AHv;ZLVq1v<)%b_tmk#y`CR{t2(8lm*cAmF8uO#il9?qp|?rC z+;NjLGd;q`k5HHd+PMNZx~}|@jOzQ6S8GR^1|9I6?K{CN3=Ys@<#ZnIy3x+- z!FwoKAS!O+k%=7J3M(=-m|Iy-rXs zpkz9P3&!ULy1WEUu#(Y-2WIbGz-D%soJL-bPKm~I4gdCDQ6@)RX31|n{IN28 z)qKW`)9Oo`R6BRCFQ~5_$ev2H*fN*y-kn0zUsJ$K2J7R~?-rxV@ z|B^CCj6eA?wT!;>2b7f;poPDw1v3%P?)l249K6#U^tvoSM~T5&KBs#e!)JVf>(=m7 z88@Txlagz)T9|hADtK-5UJFqJE_}i>0+uZ&SS$-cQR^;&;5BGB-PRr4ovD_O+KtT+ zg~q^o$LmUvTr*Iu5Wr)zH`(0~VQ?U>W|N}tnKnU0jS$xQB{d=kpfF_WfIYP34A7iE z;>g%@c!9@b14vmOcfXze$U{S~V{uH_9kzdKpCWoZVGch1Dbn)mvc1-sc#S3t+rYDg z?sqjU@Nf^p7_ErUe)tNm$Zs2kg%|XRL*$aH=aoeOpD|vA31Ks&%Oaxn+0%fGczNu( zvIQB~dl8-Wto!Pazds}ZbPQN~$M7q>z>UwVzk`?j+%0*zE+h&IL(x;-hVih=Jqp|@4%;N7R7(lJM2M5?W zi%Y3l!7lacx)H^b!n$4_-T*nQwS7yIxjK?%JY5DRr}^4-Qv5sM2}lefRl4iSmF0DH z*E;#p4H?Pxr*YPvnzEvGeXMoyeCoQ2IS#Mfzai6v3~nn&CRhz4(79HxD0T>CZj?)PgB8j4xSt-}mDqkhJ9 zR82G@@8&Fi5lklTK_W!kBpzlUM0~2d%s3*6N8DkZ4`~DNwz1iU*On~=I}1`NkKXai zwuHugfCh*1o^&4=BNoS1jl`zb%*c)~YG(nIS=!+J@O4^)Xv-ON1BSWF zq=y^kVA&(PwYkwZh*-43;rP1RZ!-Y3+rxR1?dU89;w&kx7^PyCRn3n(EF=}9E2d^FX; z8Kzw)gwPVMKqq(xGb8RCBllP69=GNI%z-OBQgL4`RkKebsQU3o@V^{6sbwVwh0LMz z^Vtm)0hqbD$qS|&wMOMW+XFD$uJCLFRb5OyByYdgRX&+B-bEAjZlGrqe$Ta)t}Uq(#|^L|GeHw3 zM^fYllHWTM>8!Yr(c{3Y%{Sm3t1T0CX(@Lf&F15RASHv-l%Gy^oH^diFE9BhgJ1pC zbm=1@R`3BJMm-; z>hefeUPr-^a=kU>q|o}gJ|$mK6dUc->!*{yKmHma;}fnO5@!IFKrJ!^jwASG&|~z8aXQ8HZ+Yq-ZtN?cWQvs zMekInA(v!(t2B+ZYHnq1eRt|=O)?9}Zyj65d%j!c0FqnXV6;)n+nt!JrSt&f*sKKO?)FrnyJ@>&VM5v{HG^AI?0wF*jHd5ICbK`5yb6 zjP*?F7hkjwhf%_OTk8231?gaBCTCd?j+?Ohw>GwSB!)~1*ORvT$J|u;I?T>p5gyU6 z>TXWjTq)?xpbH4JR|o>&WO23F{Sv{i?y)R$*FrQQNN(oobLVAzx4omykVx$xymT3= zv0bB=WA)hx*t(4>md!y|rRa0lSj=Tz3DUf={P*sC4NEP5i}nPsy;I_9OeQyI!9H8c z!{Bh;n>n#}1sV)fgasWYfi}y_vW+Ylk}FuWlN^S;+bk=j^Ios%z&vQ}3g>LJhJ8uF zsE!J?A^rN>{jC5OhxNjsX7gH1&mm}8=R8c*jwn^Z{*mplLypPsidX zxn)(}K3h<+?Oji{%)!q>PRX65x(&9*gk< zeG777vB@TfM>mdioCyYjcr~9iLi>^KX(SrP~Es-}o-0gr)ROXE?TGx6*fBbDYx|9+>79!*4*IG> z6UD9FSx4=S2YLQ@uAUP3ZlyeLGX;l#|3xzMa+Z(s)iXvclH6KpgJpg?R{jdRW0=#$ z7EAn2P~3liqxH)B*R}@gG9dC_kIqb%IGCieRwEeEZhR~%UjvhRf*gN_aVMcv2jY`! z&u`DN3aNK#N^*7X6jqV+v)ExKnm zwwFAW#Z6QgbK@4~AG|j;#D~A;br@t~>HzcoIdB9<7m0L+HZl(qBG6P6g~*^+^hBrH z)(~_%R(akeWm|o&60hr%IS<>QT%h-m`~zm@A)9VUx#%Baz#*(K zJN`{k9NKdGLhF8!%(lXAYgxkm`p^TkcL|N;sO5Iw3hBr0ePDTXWR@>6PQRd9TG<~5 z1-x*kb3Y@-q}ky-(=(eJ9>6%Es)T@uQGa!}*oR@qg6$>!F<1Nf@q7ct#8ZuFd}Sta z7^QdS22Mp@^dsVVxkU2;P4@=t+rjNsTm{W$eRBhoxhsaf?|wnwK2i?5##Y`pZ0hPe zTv3+)f$pXFON~^$o46KrQ~ADvER#+5S0n4F@FRN(dk_sg~QZbmOUh65ya^LH) zX{bSQw^QKF7O}D)5rL1JM}_y_`2a>pkAlwyGulMXWJ6>0KDeSoPibH>P~ppwaD69j zD#z44QTx!HYH!CSC_*{~$}5sAl*+i5%)pjlP9ZH>TIT%?)k)%q_0_j6gmZPOYnCTU zL;PrjrahvrJ?tW>kq1hvOI?kB6Gm%67^^vU@%|0x>HHOjE}T!SUS2o@U0O4qB7~Mb z%Btticwx9rq{~3G_<&V}pF3Len@5@g%w<9&WO`4RcI$LiBsDKLuYL3AI=j78q@y|M z#){$}LN!iepA6fD>dCHgL0=+=8?bR@2*^y>zj<50m5q>{6$hS7{G9@u5@}lp%T_N( zHE)c}JhfS?=^w?%Yph%`5UH66hkN4tWv0xh?z>>4ETZd#CrB@AmDnL?j#~$bU{=ty z=VZ>aO2nicyN~zGc&XYpK6cEZ{E<^F=K2PQzrC@?xtemEyV*KNoaI{=mu7m@7BB|$ zA0?Tr_oVirD|s46ZddO=AM+q|u`faP+2>O?Ase}c+1fPLnb-3E_KjkMm3xQx+vi41 zyXyH(Cg}pBgChj_9~o`2*0yE+Ipp_0i|_$D53|E3{`w-mngh5AkCGv1mT@ zKW;uX9VW{@xk;xreBO5i*zu#)z29g^X`W}%eRi%FhA$FmwY8MTfCTl(XmdTtkO~hX zj5QTEub~ZC8wLA{$g1mPAr*aOA9bD!V2RNx;mTT^*vyOvnP6Dx-9FO|)Vf-AI*7N*64fwn=_`+cDqo}Sv;%tL5$+fFk^Hx}Ke z%MgdaFu$a|!RNjDPBLsTA{X9_>VzPUDXf>Za0O=b9L{!jBIvBS=uqe!;>O1LE63o?|Yj~ySX%FHMkk)~A>#K^lT$yH zf4XH)>F-h5U+Z;GGWy5I+pi5m7u9ak7O*i?6qKl<#!abJ-iza8Ozljq&zE`~!H5&_0>-bSnUL^#J9rRSBWJ zjwY(T$wV!qzA}PS-^qego+j3PL?_D7b!Yl=MUY`fof63zeC%z$J*rwdz@3T5B^&~; zkLC=jnXqzu7EN4_*WB=ATkGOzt0r4DxUZlc*SYvLyHwNhFIh zL~w7Nkt1zoD9c=RfA4}AZ^~Cl2Gcp+N@nR*GNw}?W&6sS$KYUxaa9j)^1SV}E}={( zd${M^nb(6+$7mR*XQ%N`m+A1y*{56yb~;*L1NZPgiCANot<$eUo1-H-v@3&ig6L}z zJHi=yp9Kfy8Kgz6lVb0%1Pc(?=?_IRfD(x}63{aVYX!;Cl@6~a`_X8ZSo&=WJcpvc zvJ8agwMw`Wu*=OQrt!H;1r~KhirlWJh7Z%zM{6c6mw{gejqdRi%?{EllRy`H(YXgT zzG0eo?}U)j9y(l4u|uSJU%$0%sg?hyrGSme86NvU%N_z3GOtG^s;ZUIB)RZNOHL-(}K)V!KC{kqL z-kY^Qnn674TJ-JE8@)-XbAktSSu1&cSa_&a962c|)rhno8Q2K1sSS%)T0f`;^5_G& z+4EQ;7?ZlVgc!o(?+ebW#?#^VEdb4DcJg>cRJdXMFxW)7N;=`&HRO}u;qrTRrjxbz z3NXD%VmVbn>lZHD^uUDD%Jpevhyg!MHRg+;pVp{ayiS-vh*qniwcPNVV7m{by08qu;sX~{S$ zDKfG*aV1n_XLs6>H0)jWPPTB=Mas_1h!ReA=5eg^eLQha)4T8YcKiKqzu)I}`(A&Y zOXs}Cb3C4palhXmNfs$i@)42Hj7cVJ4QF>u(_xz-Q|~LFVsbLoXf=*k{q~@4{aL)K ztWT%h#gy6c@@i|rx$^2$!~&P;DJy!Om#s(YCnhxdvhyyUCM1P=1!fe92t|&+PYq1P zNJuBvKB{6m7eYOju{&h9X9EtvF<;bGadw@eU9;ONA*6Itvnz_%_(JcN$<(rYTDL82 z$4iSG!gsqD@9&a2@s+KXVP{~ER2k;s_sVdf0%pI_K2NvNkV9q*aR4R_RryB)xE4@3 zI$}3wSwG*$o=H+~<9l~f(@Ag!phv@)hYdQlO#Kl48$8!s85p&>E^WgK8!?j{ETV(_ z7bW~!>={hk`GV+uULm3)tAhW6zQ?dc_hNzVp_~ZKVh$R?q8kMYa))IVrw^- z(sAQM>h={|#@V<&v_JHt_n{c+co3G>XWn>}oO)lm!np6#@HSL}OHaJk;I6JH9iezx zr~8`*(UWG-&m@L6$HuuDLE_ z)rw2^Jf5X_2%l4q-S@{pn=btt)X!KB-xH<+nDz7V4=!50#<3R@BcekaUaSbTBBC7Z za$1HxM_lYgZ#NF^3^y&8ez2|SX&2`+K)rHh>NzLME9aX9tf|O*+9jd2)6~YoZfa7^ zR6Q-r2t@78CUz;3NE<$}eNp=1FrrimO;%vLXA)d_-`3L7Q*CGn$AT?)AxCYPuSat z)4DDOE5lK3iG?x&ClWVjt%@zS`T(Sf8x5+vDKM0uLPJWpSST^Z%%;lE(*o644(-!X6=imk-dPNIW=k zp$HEo2fa0VHaHnGB_z%f;RA zcP&OqCW2VDdr`Cr8|Jm>%{US8seJDH6{=4el?q z#*8-hI`@y{xBOoNVZwy4BL82zvaR?A=;Eua0V>BoPA8z zx~nJ?N5}GY z*!=6PO}WUEQo`GZe!vM=aHB@JFkw?;J-_i9#EOW;6{Z@3oxqTW4Kf_e=f`~s`6R`pk1ieH{D{5IITi+4|}(b+^5 z0t$f%h-tZ?m01)YF9bkN!A2cxRogRZ{i5efy^Z5|7D=JMT;%)zhV#G!s9M@O;~`?* z+YgnPbD2%yL)p8IoH773${$X%`MDO zTmCGG8R5p0_k`~I4tp`<2*=g;4B^1()?Z`AMNgip@H~W~BIMnz4( z``gTD6@JJDgaNg(uWyrEyw%rRU?K$`PVFm09Ko>)3)lUCw{>#SOnlL-@d;4ZRgHD9 z%xW&)>J29WlCQDv%fCCw&-qmXi^!vHDM0KinMzr|a|3#E^a^7Mh5kZD-P2jQu9qLa zUbXN>zAT$Q)a2J5p{8+Ux*Lu=@x$9vUYq;@GrG#ZsofcW#$(~fTBLX*((*Yl%B|Q?o{KX5>ifz9d1_BsxwxCK?K- zM{I3u>N3oIGNKEiOy&o@>OF-oeRwW>WurHQYd66iZ#%0=B4Ht#X~t22xr#A+C zmMuTeHvoi*>nj_*xo`TOt(S#7W@0p;@$eWmyNCuMqzvghKNfaYURjE=zXBhY*tc9~dZn%?^FyGwC5maan|f*oQN z^j`Bm2wTDi)OI7m3LmWqJa92oZS3F>_!r(#`0*0{_w7R)fHOvd&Q1&fpY|t#(_spr zM_CETf_8H^(*L#vKp1n=hbi5<<3IjOoq~bqfre8nw_U+Ry#~oy&HQT3Y!P#`0f1lB$gpKUG(zzPxNwS1&FS4y(8gPE4ZC=r zQs(a8O+gaBfw9}gF#Y@=Hc~hh4eB144mu8zkQ2%_z9@qCRHX(7(jRdvWx{bfZz0K7 z3w-H^07MOiGFX_;At%bILm4}h<;bocewTad`wA_5w($dyC~D#Kfh`u_?t{a{Fe2nBpWSw?SmP&}w$QN!y(Jz6=5 zikk7O7Zo*S$5WOuW*V$aBT=WMCI|rnwG8j=?A1x@)lvm5_JeO5>wwPR8n0U?usFpS zSvtf8F@=TFuc{9zFX&O!1GutN%F$wkW$z`(#DeE5=B50UY;OdhAXgQvsBDe5N zn3mNHms&#m4*zHmrX&sEK z0iY>&DfFrNPl;jD8JJBq5FLe*WE3OzZR|9Y?Bz~w>q z%Rc4O=uPrG8hl;>+8($l!1D2hK%*wpB(N5f)IMap_H`vJJXehBj-TH8IL8~alKXSe z>}ER>mQ4bWdiJd6KJrStEP%v0IwgZ(D_uo9cg1YWocpqcYi?17#V1tdq4who{jga$ z*Y8<5T~<#&<+oFGaZWsU2!=n}QoHtY4&)tbp^H}VP)5_*+4_>XjaLD}IeOp#te&}) zGtkZOhZVhWyJkg$hD6OC0D@X-0VcfGuV5@{4BSrpxNm?16(gw;pl6X?PWwsnLe*bQ zH$jLp7AOUHc}xumx0DGxP4w$^`rg7^#zMazZcqm*AQ}&pTm5z~xI3WoGOo`F;AUR5 z_p)d-Vi%sMa0V_~mEu41hX;foRX3m?UG|Is_&K^L<|7SlL((p0Mvm$fYLthV0z_Fu zitV0Y^0a*)FU(Ooo2)Z#_yWHh^NPD@xNA$qCsHdl^T@~8SP+~gxc5B%7?%}Dx@bx* z_D_BZKM!iRS)pE4DoH|GIHR_~<%Jze7*7%gMm2J3^KDToew!2w{V7PJ(a@5?nBlg|q5u}^?AE?vu;`26~iZ8F{B-wQcet^(KI zss6gvL$|uvv!;MV>;daKP;a@9ywax7r3ILLB)<>ej{|y{tNO^>_JgdAXBVy+{uIp3 z)?OPE2J%b%_-z_G;rMGDZV{oI2RP@K+5k8B=%IMs6!JFsd9uU(sISlD-+a7ipJEeW zPIPlrPyYE?DmXdbw)0((S+L$1Cs;pOc!$P|WAPnCkXn;AC zbBR3td|I%FrTS9r{`_M|@}XK_F+14>t$s^=dq)GYA9UXLp#Iay->5v001O;o=r!&v z#}67uNzGET3$IN>mwpT59OgmdEg~ExUjhS)X5bG8PiFt5AH|)<7L-}=h9E5E_Q)8y0 zKacMBXIr$2=@Bq@AyreLKIAp{A#^W76LN6_F_ZQz+JdEGT1L%m@t z+WR`DLnskubucxYeZzoC2^C3Nm?}9~LHhVwJ17msAfCHin0Wrezz^a`bIx+0m|*?$ zz!w6q;vuea7C@us9&^29D-8)Q|+p1eUZZcqaF0N|&+oGr0at3)0v=^0S4_%m<95w}Ni77x4XlJ6LF@e@YQkc(acHDy6e>4(o~gMiFs zKU(NML}HG|F8tKwB8*L@_^im^p0Hw%!Df=N=*8yWBesQo*2^Jyu^~|yqEV4Lm3E#t zo?HFY&$vL%tXDg=dEuaBM~C(H=w}Pd`?nc@FkA;{C_dWdmEfE~oF55tfT=CJ*pX8N zhs4Lhp*$}0BU59w3ifTSeT^t1Xs(=|FmnNg_~0tJ=^sU84w+D^c{lFHKjMdr`E6gy z0H?vM;Bo_UJb?=3;r#Lzs>Dd;FZjtO2Vn?|j~X@0QdafPAEqz{sl_a^sQY2^DBM(;`kqMtYm&36a^c+FAeug|S`zgdGEVNF=JDiGg0cDO8B$kzVRf z+(L8|zL|#h;Bl^uN94Kx`C;kSebvSm1LXr1&Rw)k*nKkLZ0`r68B^J8(imYHaSqlJ3>mX$wz$&E%A1Ibt z20@HVGc-9JooI)ai#{%)^XnaZa-(1xuJXd3lbhy42C$<^3kkI4_h(|vvD~PFPWDJGM2Okz%nF=_bDTmdwZG?hD z3I;RKu2BZu7Hutf&suQlLy+!@!-$_gYOL(iu_5dftO$Jv<;Ozv4x=b_$6A-a!Z9hA} z?}v^a94VOq>QjZ)+)!=m{MOr|2?n?0H-A;Gj5kjUU+b)Ed|&;oLCKBYGp4UK1EL4*)s zg8CdtGcy^WPuEGc9GHO`75_aWJt~zYl2EL*e5>Js8_6}WDIOm}qJ_ExnF|h(#s}4;(<-MyYPY4SLQ` z?A&TAHbJ7om2Ejar(3zVSJbf4tsCsKU!@&(&EdrfIl&j8ej<gA zIXuZ_xjWrZa%L*XJeQl*>h1O(z(>4GBb4o*HsYRz9#%W6qP=_~5JM0DYFR2LMxh64 zXJy!7*lPKY`Hf$Z%5XEXUE@$O@!tz7OEysJj0TdNV6hMqYIYycjq;acPgq%0Glyg% zc{L3m9SU9OY6bsAer0%Ae{du`@2;!*c?L8p-du(8NMEfVr1ynij+Q^vp6(lcPZGe6m zP4`yX{W9Z@6dy#*4DJG6>}h1#cTTgezaE07L*60b^&xqBwSN$l39(*b)vr0o(OEI`XM)3FhEim^OQ*i>l>oMt_4 zBG@9cf{%sBt{Fam1!BIVn0tp0HgBE&jT z07V2CHYm+3<0eN)bi!eU=$xB?V|om_xJJqyZ2I?+Er;=N$m($Pk2pCB~l1CW0 z?M#wGp-MLyAQAk;(C1pVn~St`$@B}<3FpWM_T|)^#idk2wGwJ8?=tNtMXX^w;l(uF zF>OAxw*Y3NyME=!1F5mbv7Xvma85!mjJlyyJar3p!FmRsH89wJP%CJOSzd-sUeQr7 z0bKVc(W6G0t`-YM>&lc2)p5fBa zU?YwIYg!(a&XrpCpXRLINDX`;nS$us44Z2<7IWVq-_C$>6$6{-VYd{IpNl=tpO&+q z0#>?$BX~l!H&<;4OxrN~p?9+KB^;0AMr+&`;@E+m)n|E>oNP5MmKaA2i4Ktndk_bi z#MIUq#RfueJpeGcIHCtNQDi|)wo%oVZN=-Dtor%bCWl4BIfW<@co5LeyN0CN50Ri! z&@+9^XCaOBm)aq=V8dMu&VV#6h8y;@$a9O}Uzmu(W2+c6Vk20Wib%fi`8r(~`N2+} z-&6JE2V9&0`rS||y5c(OG6sy%;7Ty`$chog8>nb<*CRc-kpl<7ZA!Llp=5%f)h^W0 zE8F`Z;%VH$-*AR}qF^hjQ9M5HgBBedPE5^GblE z>o?dh^cJx+fBT}MI`~StRtfhh_gLZsU*0tX((A1}i!tre?_Q@0>ma$6=Z9L-pZDtj zr-rdGj~WDa&LELVN5~W5KYnIj9F}mDs%N{>PfpAIWC7qkXLl;D9q|HHc2tNkg{1hb zs*lye2F0>4ZTfKCrDo?616ci>nz0k=V57A_et!%{O~~!bF}D{Nh$lbV?M8=EGqest zg?Bzu1t&Q2!Gi}4y}@mK>yfBSG?a6X@`D#=3W2Zoj?0SNY5rq6d*Vh?Xms=5}?Om?v{|i+!+Q^6U-M;9aRp)abN>@MC7Qau+_&c7_jtP z*8)I7r~=TAD(({Nu?6ezvR?;D^5Oy>`R|D@k5e49=2LoEcfYBU!}PCQD9+6*8?wo` zKI5X2Z@92Ru?JDsENw&b%ikA0`imkvmE_#i;e>_UNjggGz6^DkC8uA1o(HTeqee9c z2_3eEIn!!q0Q+KAY~Hg_tk;Nyh3w(24+?od|7u~d0M7~yO8#wz@vnt=VPE@4WXijz zH?3U!_5d%MifKDgsC5G;ssRC8h!Sc)MFP{_Cfa$1#prT28 zEpc(gw!nKFxHjcTK>X`~|nKENZzgXTP|xS1@gQ zey!xlk{kZ3q(L#W`WcWiH+F)cQlk7p>8nU8qE|VIRcwV^9=5SP?4ra-l?mIzBkdAt{Jo zN+fl0%AXxvf(i8Gh4?NTf3l4HCO-_*PcMmqGTyB2 zix1>-<&s0P1r4rcm8UPoj{bC=A9m7SaC2V%o4REBm3#}~WH?#Agl^^k>wM`#THOAf zA=eT{h$ zQz-<8fMibWj3xk4YJ9cL1LVcV>rk#pMi*uEcPbnqRX;smi_{X#p$m*mLGNzV1O_@d zdd`RFsF1)|CGnS6zYtM`_0fzp$5g-{8_D!fm{%VG;h)&g&hsM zNMIJFlXv4b&W}WRJq>N9)}1Z+5`d$D7P%p|HP@)#XbMl|nE6g1qeKjJfB&2U*1?Rf zE+XVi;*L4vK+1UW$pe)+jEhU`MR4``q#0D+?YXvmZEXMHj=Nm*Y1FmQ6xs$7j4=@Q zr@ycO)gig*A)H$mYWp6fUt&ZveCHqbP($YHDD83?l#fhNuZ_4U-%?^kXoy`iH<(U6 zhwwt|N;dyd_0@||lk|tz?plW^7&}{T2E@4D>bOePgk-4|cHm1o%OydUm%sV=NAe)2 z-@(l6*+x>IEZQypo{hCZcF`@x(62u6@JK-|0w2sazeEi?j)dm}*brZWdX&Ve@Tm6Q z4;Urq@JGvukZw$WArM+8G6ykGh2$h%u(aT;J#PA=Xh}ON2srhjJgeUaFU@iK$3G#! zO8#59cAGzn*S3AaK}O!XO=G7)N720=NF=7vOqJa_F$W5u98jVao9(|K!D}(GU=g(B zVcU1f$F2SIw#Ou_76m_=+qeMK|9X2Msd@?}#zz?@M%EL+N0kx*v3rD93M3%zbPumS zQO1>RSH=S`(UNV}XSASck`lufq!lunI0bF6ijze>#A(+jf>K@&WEM^5j~~AeIDo>9 z&JkyMn~%UoaiHb3Q9a4glz2eTGzQ2KSq zooj#Q>s|imZJvIs5b{JJAT{n|14?F5{;$|xP56JFL$Gjy8z5uPKt@|{s>ZLtTi+t5 z%eMz5yBwhtL2Zoqc$`Y#1r`fBx{MmSEip-X!_Rpa#q57K1cM7iSUyf#? zc0^UrN#z&BpJY{3>8FZd$_w452eK}*u{a=UIY{R5LyM_rB}Rsr6NyS3^TUl*gY(Ct zet&}gpAAQ~)%>Z_43lmZj%&>sg6>9LG2Fgy+<+ZcgSt?RK`9W=F^l911CF%U4nt$G zw_QccuvU;RV`XJMV!}3Uq$qi58ZcA3m5&KxQ(q%|8b?R}g$88~KG#8|ArkR6OO8W| z^P{si_AL|dT2TOKigkNoNYdgXkJv^(oSr|I12qfx%~d#0q*Ib(KOfi4G6o}^?@XbE z*vAPXV7lZ0$7ViN8#d?N0IVb%z$Qh5I5h4tu3`9*CB#iWGxZA4axzKSey}wiI{m~z zD|Gca=gI%r<)NX4&3TOExKKtYDoe#VUXipX>H`=`^vZTxkrVFX#T>Umf!oI6RDTde zS9+DWGKK{>9F_$Pamwgv$h~f?1w=vs^k7q7zzAEWBxXm$?hW}F=)hqtTujK-xc*aQ z;W(qV5jz7^W(&6PA!qziAm7QCVkcn(9%6+S*gbA@c()q2nG&~1s52dq3eO966e$Rf zd0B$c+5gaJfa+h3+iato>RdmRqfP%?bEuqmnT`D=^%iK3HD?1=?XH7%88}DnF-6))acZ{9L*1ObYOkc+|y=uLDzY55Q5J&Zmbl4F0@ zsL~oCL$*TeO!TmTX~hrO4&R8O6juPYfeJ)HxLSn9m~Fr!sA{p&OzIgozKar$V_$7h zK?r1n_pbqVJbzmGK7_t=c-@4`S*Rj52GLKq=H&a>&<8_u5#Z!}8w171U9(Vssj@{9 zn8+TV0gT&N@x!u;JXU$(ZNvfPTzt|&zL&H~VKiUEB_(c*zMx7V_2>89fs4wfi5SX3-* zZhv=6e%ku!&kF%p95gp7LE6s>z0e&Fy7Bd}zZ&qbVDEt)qo6<!39i*wWglwaBO}{X`Mwt2(^BVh>0H1L^v(YYOCVT=mXNlW_8A9>Kj%e zQW3ZBJNHKkfDW+SkfEbYiS^=F81AZj`-n@qT&Ec+hP1`qfGj{Hy!JfUyoW!dPAO-zC24BYrsq&q>~0ieZ4a`;fhKGZ z$lJerH35ydG7jAt(+;JxKB0{|V$6g%0)@6GE0<{@EZ%Y&YD*_Ywl*)k5#=nWd~n>p zu58=_%CfrM_nlfSpfAN}zem$xeO%0!gi%|9Gvcui$1o}-GOXJ_^TlgnH8-C&z#O$z z)2F;G<#IoN!0^I`$$G6>w{nT}5ZP%o;RSaxQ{-*ckEX=}KS|KbGUr29E<@k2qR!q8eEr(1AYd@C2CUh>P*< z-Fx9bKfZ}L7S*v$;RrAQB_mx8%75N|RR(dANQX9UDkB4AFG#{PSHXw_9go zLsd4}NMvy7RSuIuI;W`8(6@lThT6nw5CN74SyQ_NyR$g*2w&d*4Kzsv-BMZrW6|;q zC$ex1L84s>3ze5<3)`fthU1Gho>+`@+^IFq2P-JH@YiS6!Wh8O)C1@tIds<3kDc5& ze+WWJ|xk#44cNX-o@zuSS)9f6ZOI znLpMXCZPft+Mwq&Fa}{k!vcU0$>pWQA{EmHs~L3C>l2o`X}TYVhL{5NWE&`!N5M&* zrH&t8v=m?WgC!D=P+7OcR{E+3j9RCyi-iv?5mHoPZu_Nwdbl56AC~IK_oZqe4x@oz zF01xud%{tz4f)_UnRkmDp6@QCW3I;@S?X-H;X*Js8=&4trB#aXda_Ft1nCU5Ls%ma zlVgo9aFeFL6ae*V`mtl=J%%us4aDj#e|`WHD=ff;b^~}xcJ!kMKx@njyet>rrn&&u zhOIaOjkyS@F4YubzxJJJe^H;5+Z#^|L@*ewOfL~~KEPxp7JS;yA=`wcOs%6f>g?pR zf}dLv$XR!}9-KlI<=PbJmxxTJ9sy-|J|6R2 zDuE%l2bG^9k&n2T%-uZGbaS`Xllj{ga<1R>{BEx*{}PjGVu}TaNKhBBaXk>M$|4^S zzcs3au)T%REv7QNbLz{hutturMgtEhH~nmWcD;AnN9ig?;rl(E0QPukM`*Qx8o=x zBh`Dyin+-X^&*-F@1RnWw6ruL98^1DA?%ES#M&Xi6Yp8G$zVo)sH>A)Bp3EA1X5`& z0BWD0)E#2j{*omxw6M)Le7tywe&s?&{JP2#^o#F<6YF=)v~c{f+CP8ZsNcW%|Ky4W zZuyb*f5mrCoq_|-i^EB~9M#&OmxFSgO7Fn-5yr1)(UAz-7?5RN#D4M+tTVZU3T$K@ml7Z;- z5tND=SZ3=_FCGjS-qrWn#6;X;wgR#6{|FjD_$?aa%HRNShw6`sX=Nv)(lE$~8+~5g z)A3bsZJ$&Cq6~w(Rv_#!(ka!%U@H)ganlV72~zIU3OQ{f8yazW{S{OMLKWM{Y#TS9(#bJHGE$*KSYw}@cLMF<}yKB0WDU5Al%Z;7b+v( zqyMmq2oFF2-2?eyz6(M4VFcMmu%<0QTyBPb*dt#c^Xvm@zg&kATh~;SJ$9SUa_h@$ z>T_LxS8|u7d>P&n8r&RNrkR|KORlgYc9m!~n$bx4!9HS={HApo>4t~;>R7$AdT;B% z@L&7vpuKLx0bJu4f>l92JSQCr?Dm>%ugy`T^jegi^@z)agi+Q=#y2Rw?7hTHoZM6h z=cZF6!rZwi>FG1q5Vs7)wGw-dcZxxGq*??4MO{d2K&^wIVzWiqL~#ldVPfqh7I7dF z^g!dV!PNfVklFh7UJ;twMU4bT7`nim%yW*pX&q#*t8*XniB zJIjX-AO-h>C@bBAy01pC*yx{e(<(Ly%ML~Kx!YPk=UkJAi9P?pcJnQOEOZP4x?hF| z1FY~=jp&VNk+56EfS8{~(zrb+Lco9g2+eC20siI$`?mM`vq{Mp494lJ$SxIS(S85W z%e79j4Vr_5D`_TXKL>1NBtjU@J2((|CH1#Jx=6Wv_1+kNPu7$#Lf0o#MI_5}#erfv zlGq6fiZM~XT09rL91S!3AjJY=A6T9`}xC>x9tHdpX+)tj)AF!}>s_0K?`1S|h;(|w*T?k?>p%<1TSc=P71iKu9 zO`fMUYUL8AK9$-(fiUPX8SYUnMn`%pWsmsDMCEl3LpJ#{Qx^h|#ff}kOw%$tLioq^ z+l?M0_Gt|fXu-lma2dMHD)eRMIQx|1S{`;F{r14tihp}j7gS2j%}Ics4C!-(oF?z| zOUD{z2jC=XnH!aV)d3{9)k9H+cx8nW=>q@R0?4^WtEy@4oDCz5x+&Q@Io7uAkx1lJ zyb8_P^DK;AZM7X8UBA6r8H1WX>Oz)O?7Zyqm21myGg4{>9M^py0Ce41t-p82h(4ec z9DL__8zbEgY!M%!f}_^Pvj4nM*EQ4=QfiqQWNON?)?S?>;_*kKr-~6ra_r-f>mj5U zcSK{$tISiDV#N%7R-02hFt)iJ?z}b7u;rceOKi4l!Ua|2hwk=q8xz0~y>zg*NNyDLXxUvfeGZB}Rm%lCT-4;n^6{k(rCvf$ z?4hcb7);83@Jzwd#k)4jPcP8#AFs??We8yQn!|XPbojmzb-eJdi$VhP{=8FN{vO#g-vyJZ}+L2YhSKo|0UIs-D(qufn7R!;R_tYqsdxB5xrl^sv;^}5UEr|bv?iaw2mcrDFvjmJO~ zhIWc3y!OiNP9^D8U$EkdQ7M*v}?qdN3HL~)+d=AmZIPmZ8#^Kt)V z6-W2U$GuR~T;E%>)lJ;*EX@^JsVmWlpyP*n8r7h>%}j3Vo8Y+K6s<01LW%&hWVVt} z>{At*A}a@}Yq2V=MxuT-wZl@Mj!rX4cDA-%q5H!5P2W^9X@W)e3x1BJ%+Jq#GjX13 z7BmQ;9-n<85>0?jl9j@wj&{#XNz8qb7&)?s+B%9eJG9C)xG!0WaT`DL^8F*poEn-u zgNNEwGfOj3rc|ZeH7PIIb$#Q>)ObuA)869JWl@ITPQ+zrU7as9fy1Q6!;B^M9`AP0 zKY$ySc!qH4DkIeG%R?+deQc~7Sa70EM47**$-HJ_O;3%p@LPHUVa;VI^nZ6Z!c$2YGMJjh;>-980>GkwEIouOxk^B<8GuUHuLzIcVP+=s~P{w2)5ABK0*$inAU?P0LjLfc4Pc6E+?wC_6Ij(6mG_GP^6d#ZLs%!Q>0e|+XB zBT26~V_RGdLECL2E0-Pg&$ifJh1MY}I}aut12rJ|?7_v<8$Yk&oaCwJxbq6B4;Ir` zmpK%@3`nR@)V1sq&DpXZ1em7^q^tA3!H=-_4))yF&oeUcu1w*aRBgrOBVNBuD4o2t zqCgGAyRwYJdyRe7CN}P$mMt!Cn8{URExzB1zyTv1*R7~5&(OR_4w{lsLKf4j7l>rh z^)V-zZW+t|8s3&t1v8(G!~$Z4g)bX4s~*`NWp$0`IzQBHuW3)7c$gFntQa9#QCwnu zo8iHWYt7w;J@on5^?>Xls9O!aYJC;UpC@hZ7chS02WNVg4uQ?7|Itb@l`S>JPv~wB zKxss`pSx?Bz3p=eop@cN>Jv1^FJ&3u-lwAO!nkyLNN(yXbRcHa%}8U!Y8neBGDQ6& z{i#CrOP1X+Tyeby_FIs?^mCj>>h`dbyw71JOj*0$3IGT2t+TU(zUay7!_90@I?Z%b z9!b#d_D&&PWu+Q2^mP&CuXn8KIukPIPW6w_!<|YDf%mXnLf5u8uYV$G#Bqj!c28E) z45=`7Kdq6sa?-`L;FPJ<7{W1&*Ae-K}~+ zr?WAO`mPxdcXB)3)X8|;S+%uO_$OMg=IA&#Cg^y(tDcoX+O}Qa!1BwyVGFIB;`2Ce zbmb&XUK#fko2_*GxZWQ9DzVw=TB2isKF;c;h{T)l)J^x9@P|t8GllK!qS6l;wTI+N z)%C->XnUD>6;##^^~|yaOeKJkXHuYL3GpQx@$c^0Vj_Fjy1P50jdD6P-sA-vZYFdP z=9pvyHokh0mqYi}*FJ{x>Z1fq-$+1rLqrm%)ZPL{5VcKRy9ks<97k8Xcm(R(p-F`ukN177N4o7EE{_0Roh^l(%wvoIf^L z*ZrEg!zlDZ;&W-GKdPh?L;{rCND^awm93746o)vz3B?o&t|L$K`tA5O7J#SP*;QuL zGib#_OB-o;?G*7m4{c0mRQrE%{+C1CHAj71h9jLXv)qWc&Z%$daKIBzw2nNZtBlbo z5cduDvUUJqsC0v~?)X@!hqkVbyj0=g*ShKog_Z%4d!}gm05TsymwyH`Kx&S{zSL%w*~c>AJ`xo>B^H z3D%v62SFvW&6UlkEPh-g85f)qb5TV6sG%mIvat~W5+UxdWQb~O@^f6vY{$EWl8Zs8 zD$3B-Yetj3WUSkzF6hNY7hkE(siH1IAGRaHQ+pC_v+M1bDgi}i0b;2%s0-@ zlcS&$!6S+NU+fqlVzHjHkJWhhY(!I8*TTNaX^QV_uYYKpg>Ki7$DG|>0*UnQgM(M& zuS<=b-@qJSbz+&wppZ`a^`x15pHyj#I89XLi(kC$iqREUTd8#P!d;BAH#5P-OOl#2 zl|l-n#vwVIgyL7$H~>l6DN^D#5NJ-{ksfSB(`GgAJKcUNS z7O$oz77V9~DJ4yu2+h7=eb`Q3NF!X$iEENIu317)8e=c1EF^nCO2RBE+s!UD&u(Wn zD~ z<92vuZA7qP^rbBluFfJr;jwOU*WMlpm1L(-$+aO>E;R4BCfV_PZ5u)cB9c$lUmhBC z^mImEGn@CiM&JN03m_5IQ(qsOLJU3k`c)&J-1i7jzY$s%?mrN^ zl1b$sy;$+g(b3T4ib{tsw%`M{=_EYbP0OSbvm)R3Oa2D@-by!H_v!cQ1c|8+y1fJV zv-TzSZQ>G*HagmmMD+FF&z-V#8SkE|2yh~*Uk!1c>LKpuqdg(jTQMDbsJIdA&OUc- zkIqqBMDa6hnnGy`2tZbLbxilRhxKMo+-mo79g9#&6o2HdeJ9c|%4@7X#q|KLp#Mdg zRW&ZRKx<(&eE4BC%#y5ZD?i(Ytu8t}1MION-2HLWSF0~-V<(kZ8ddJ|c~eYNpgM=K zZxJEaFs`6`;HEDbo7=1tuF-JBEk^sikLr}%GYwaXmFqmZym@U;2u5oR9xd*lDLBP= z_@3qjVP5sa^nXs#8qkFa8+m_DC0XL&3B@c& zHRpd+%hPzLECIL?1)RixLkD#8_YCTXEpI!Irz@2T7tAaj|oa`G^a@kEOJ zS=Y$QgtIDmZV4|R#*RP%-Sg`#_wNcZB!rQrwtnGp7Jzu401o;ZmnC)A6&b! z;M*;g*2gC{jhuN`S9ijEy##c{XdnT%#D`KHuWfYDnukng1 z<1(27=4>QjJNQ@XAqhFr+I`ngBB1@+$v0N-7U9S}WYq*K zsp`Yts@I+Yg@{=%F50ZqH)$pIQS9WW%$SKcHAJC@pMgwSj^E|mDvl4f24GZvo$e!_ z0n3*+I@mrE6=+Pk!nchVKduuxo*^Pt_%isAZ_?hu*^nFW)OBrD&v#qS=xvj%i^XL( z+UXUDG;hGBbcomXK&h>2xe|*_v>n9w)1t{u*{-gT>%jN*Kzq@$Mrlid37r!(HC)x~ zvV+p@eInFzK&CczWp$HsGg>B{xL&a}NKA?&UDRNEa!~fi6Aa7lGRaO$KNm2rwE)-L zL0iGCczi>a)m_Q;U8)?0<2Mec2t_zawpj})i&Yx6hK4&Iy+b!qvhS-UTY?1 zh~=NApLVDV63H#w5XQCS1p5LpgYny9Pg@rh^ZosSMXi+a`Mw>;~O#M&~tjDGoBN}1xxrl;=`}uT;5cgZOK%q*e*ySF+NuNemrkJ5J zFKN>mMIPfwKX=X9D8qxMrjW7VV}4Ztf$<(@ss<&C-aXfSAeIbhQ7Sjv%S_lU0F`}P z9}y1@HB(Ti+rx}aYV|Xuy&9(x68-`=`UIj{>~L!vr@yBA3wMJnaT?4SDy^dhDttM* zy*-n$S#+x_l)DhZsYQ>bbaX;%zy;Sl?ai zO>VD`CZbehnhHaD?6wiWjaEGo7-4yWlaX4tFU(KoP5ka+j7KZMs%cn*CRtW$Sqe|% zbl97WvwU|#>}|T%;{{83UfS&4o*ZEqULqRg@runsd)vlFMWL;^HbsomDy4g_$3_|6 zO4Atx36V!@B3PviB>Xls8m6v3VeY0gYB^A1y9u8W?5@4c+kKg7oCbA1Q{xmUFrVcy z*L-MC=yv3%P4B!YRw*eIl*80`DX*#&;x3&d3iuMk^S4`L3~zaqCL21;I6o-cT6&q6 zc7Law6vuOw#On{eoFI8K>h!E3LvwG!j7A@_isO)Bs=9oapb(taQGh4f1{2!Sk8CT8 z+f?+pO4d6KirIed%N*lc+uzpK?i<}xdiP?&CYtpM?S7DTL|`h}VzEBn zuAAz40v^~?#OAxX?%4f4eJKs&+T35m6yl+|Hyf`uGp~53D^miS%35OgA)F?U`B6pp zi%%P-W33cDcV~!~b$o*jWV@;HBIBO0n4-`&`mT!+F>Y=m`d>!-4k;MT5jjiw+-?^+ zWohWfs4zT!OWOP90K)&}B>b1#s@9kG$(=X(?a)0#K_&5mhUp}Usg|72tf^141()K- zp_OcyIRjAdzzcgPj3-8}+a%Blc4_8xO-GfCd;vPL@k+u$X6y^mh^$eu!Y`A1c#Z8# z&J6k&>xS-ZQf?CS*(jS(BGzxzGvUv=wX1}o9Q--%7cpOW19Bad67m_%?=|%Z@n*H& zHg}IN>o%!^-ds=I!|mN$UQOT!b~@HR)#%}9-jJ}vrl9LYd7kIR?Unj`1igG6JHD_v z0Mzaih-2qvDk9$B{4zv2n6!t>_=|ejXeBY%i8WzW5z%8h^^Q8e-llIj)FZRlf&NbR zir3epwdQ>z)TCU`Rl+=O9U*6kyWY$?k!b{KA6@5%zS!-Sy7n@rBe%72W0{`lC?AK18U#589^(s3h?%~O`kxw z2u%1{8d_nQ&@Dq03Kc5SO-b~ zEnANbk+bu1dj)}iK9irEEusH}aAK7F_W|B-kc#gbvPr#^d*T|Vovsz|RXvb1>kE4A z4RAdy3y=p>Mpt=GOX&dQmZ-OOK@xWz;qJYQW&jQS1^C_?BV5o}EOvsj)Ue%5^X&yd zO)W+~VXKA#BiW-Io%n+Ws5~s4}Z*P@VKCMByOx4UdfH z4_(aJ&;!W^_x$>UrK&=z)G;A;TFw7Hk&Dl~irB5k7YpH28U`44znH^IF9mWUH4I@4 zHfs$3Z8XAD&=<8-9RB*n|8uUGZ9NRY8#x3B+#re9W^YNb;STW4I=fkS&A?$@ov+K=F`Jc(A zEAL2M?@^SYSaj_ko#C^Kc784)pP7%*?Gp-WavBn??et2su5zekIyBniGrtlec?1tk zxkPH^<&t;MuQPz1T=9Tif-PD1B@3{GHn^oOlI-u%O>n@rz4eUiCK^R!|6v!uDec8}>+=WmoF!^HZo5iT}ggWOdxeaLIPA~bhIT-^^>eq9DP3+>%oA&A#Y;&EP(OkH;t7}1CjQgR-hsjPoO%3zpSlx6ZAIkE80 zUl{iso3ne#n%8748k)QSMh@J=(QnaFH%=z-{xUin7}t#`-2C`#ewI08sm{6i8r3hM z$yBt1qtnZDi`jyCaez@D^^e#~d9j~9a2%uB?soI|*#)xGTQrsLI5NmD^2Zd~ zj$nWET~hDo7u<;*#aG>d=eQ#uv!QvwuB)2VT@m!O-YlvvUTb0VU{|f~5Bk*X`)8^- z6?M~UoxH0;qHc4dq7EZFm@JlEAO&{Sw z{`F4}3TF_Go^F;j_+=4EjtyBwH*MeDb!iE6{hXKTDJgj}Z?OTuq`raK*mU^Wu)>iM ztE+@T-Rvu$kNJm&CR?22JR+4e0?h;wKbphAHC0=0nEQm~=*vrxH<&0Sp4M;J1+AD6( zYD>*5v3n?Aqv71RZbDj|qicx?qpU@260GhdPN$jCd?&)|{{BlE`ugo(d~^!9sjaQ8 zyTmfm)9bu_$H_MDtx|Z)fbTSn)06XVffVB;`3Z1bU7_ZdmZ_@-dKa0g{?D&H$8}RB zCMDfc2ot~c-b7{I1cf*D`4Cia?Nu34F65`%vR!Z!L#c~yD$bg+W+J&iY3c@AD<7DD z)>EpmV|zR6$W1?fodNPRdNQw@IAk}rWhtLwafGlcFphEZ@*lsC82Ji6{iRw1Hm{L% zisce(lMI#qe;5f+scI9^OLYHuCVSafzkAGDS7$*a7XfdEG~~s#&7TD zE-TI~ZsVmE4GmopAM8H|k-t;hTi}$*k{ss!%X;8gmv-&BM0Zc@U)lGU!24*YJul#v z@%;HZFxwyCzq0c>FD0oh+6(xH;(UC3Xl;{J7w?C0rPeQS<|f$6%E}TC#Bh=Se4Hlt zWAX*tH31n1=S@9^0iFLbf)Wz!=5U$*lqNBJm-};EcFfJ$BMO=p3yU1HfksVTz04&9 zRH14c7U|y)6EKVu8>@Q7-R6S7J0P6v!JY^+L@hnm3;PGl12^W8sa(qCr|d39F#23u zZY%w9+x;+&7-rak%scUaz42X|o3o5-j&oD)u*8ROcQ8xtkFEcD;}h^EcW*ykRL1z# zYy7^J6s0g9^rhZ?mx@{9#vGjRCMW(=Tum{)OMHlh<1^)1=U*j~*FAzY_UzmqiU{vg z&!_^9rutc{zbYi(J%x_eyRo7DvYQ!bpSBO(0aZ8S_5|8K#!YMQoHH`w+IIK~M}G@` z_UL%5Hu<)KuGkKRG`*CK6GQFn(J?V4xNE#*!V6u0&b14+PV$!)U)A6V9Hbj=FD3Lv zag8vmsl{o7UwhXrb>dQH?;xzBL+2)!qI^-7O(X|Lzrr~gGYYcy`vm^5+Ta0#U>yYs z_DtFQEFM@pcEX%G=-3antw~bjWqOLcQFxf9ySuy8$;{Hya+{y^8nQ*fu3BaD@}rf0 zV~@=)73_IR*zm36=P3Q1uOslWu4s-+GOY`AAp8I2Y|FBP6~6vdG+ z;mKyfCScYunko#p6CTQ_30=h59}Wm9hx$6`_D24 OAn Date: Wed, 16 Feb 2022 23:18:55 +0100 Subject: [PATCH 127/145] Issue:#886: Refactor table structure --- content/concepts/did-ddo.md | 86 ++++++++++++++++++++++++++++++++++--- 1 file changed, 80 insertions(+), 6 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 7e7fa761..86af871c 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -300,12 +300,86 @@ This only concerns metadata about a file, but never the file URLs. The only way An asset with a service of `type` `compute` has the following additional attributes under the `compute` object. This object is required if the asset is of `type` `compute`, but can be omitted for `type` of `access`. -| Attribute | Type | Required | Description | -| ------------------------------------------ | ------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| **`allowRawAlgorithm`** | `boolean` | **✓** | If `true`, any passed raw text will be allowed to run. Useful for an algorithm drag & drop use case, but increases risk of data escape through malicious user input. Should be `false` by default in all implementations. | -| **`allowNetworkAccess`** | `boolean` | **✓** | If `true`, the algorithm job will have network access. | -| **`publisherTrustedAlgorithmPublishers `** | Array of `string` | **✓** | If empty, then any published algorithm is allowed. Otherwise, only published algorithms by some publishers are allowed. | -| **`publisherTrustedAlgorithms `** | Array of `publisherTrustedAlgorithms` | **✓** | If empty, then any published algorithm is allowed. (see below). | + + + +

KeyType Description Example
+ + + + + + + + + + + + + + +
allowRawAlgorithm + + + + + + + + + + + + + +
TypeRequiredDescription
booleanIf true, any passed raw text will be allowed to run. Useful for an algorithm drag & drop use case, but increases risk of data escape through malicious user input. Should be false by default in all implementations.
+
allowNetworkAccess + + + + + + + + + + + + + +
TypeRequiredDescription
booleanIf true, the algorithm job will have network access.
+
publisherTrustedAlgorithmPublishers + + + + + + + + + + + + + +
TypeRequiredDescription
Array of stringIf empty, then any published algorithm is allowed. Otherwise, only published algorithms by some publishers are allowed.
+
publisherTrustedAlgorithms + + + + + + + + + + + + + +
TypeRequiredDescription
Array of publisherTrustedAlgorithmsIf empty, then any published algorithm is allowed. (see below).
+
+ The `publisherTrustedAlgorithms ` is an array of objects with the following structure: From bffec235c1a28c1316ab0aaeca9c1447c9cea5f1 Mon Sep 17 00:00:00 2001 From: Akshay Date: Wed, 16 Feb 2022 23:21:03 +0100 Subject: [PATCH 128/145] Issue:#886: Refactor table structure --- content/concepts/did-ddo.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 86af871c..338e2839 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -300,9 +300,6 @@ This only concerns metadata about a file, but never the file URLs. The only way An asset with a service of `type` `compute` has the following additional attributes under the `compute` object. This object is required if the asset is of `type` `compute`, but can be omitted for `type` of `access`. - - - From da8ed96189bef3d61f55facfeb809da6398c10d3 Mon Sep 17 00:00:00 2001 From: Akshay Date: Mon, 21 Feb 2022 12:46:23 +0100 Subject: [PATCH 129/145] Issue-#887: Move DIDs & DDOs page --- data/sidebars/concepts.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/data/sidebars/concepts.yml b/data/sidebars/concepts.yml index 15839c67..8f1098b2 100644 --- a/data/sidebars/concepts.yml +++ b/data/sidebars/concepts.yml @@ -6,8 +6,6 @@ link: /concepts/quickstart/ - title: Architecture Overview link: /concepts/architecture/ - - title: DIDs & DDOs - link: /concepts/did-ddo/ - title: Supported Networks link: /concepts/networks/ @@ -16,6 +14,11 @@ - title: Overview link: /concepts/compute-to-data/ +- group: Specifying Assets + items: + - title: DIDs & DDOs + link: /concepts/did-ddo/ + - group: Contribute items: - title: Projects using Ocean From 1bcdc6eb04fba95432163339b62bf142e0de84f4 Mon Sep 17 00:00:00 2001 From: Akshay Date: Mon, 21 Feb 2022 13:55:06 +0100 Subject: [PATCH 130/145] Merge branch 'v4' of github.com:oceanprotocol/docs into issue-701-create-v4-docs --- content/concepts/datanft-and-datatoken.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/concepts/datanft-and-datatoken.md b/content/concepts/datanft-and-datatoken.md index e7827d72..e6a77b8d 100644 --- a/content/concepts/datanft-and-datatoken.md +++ b/content/concepts/datanft-and-datatoken.md @@ -52,7 +52,7 @@ ERC721 tokens are non-fungible, thus cannot be used for automatic price discover ## High-Level Behavior -![Image 2](images/use-case.png) +![Flow](images/use-case.png) Here's an example. Alice has created a dataset. In step 1, she publishes her dataset with Ocean: this means deploying an ERC721 data NFT contract (claiming copyright / base IP), then an ERC20 datatoken contract (license against base IP). Then in step 2, she mints some ERC20 datatokens and transfers 1.0 of them to Bob's wallet; now he has a license to be able to consume that dataset. From d4a8039a364122a1dd499054d2f62e8f64b7c347 Mon Sep 17 00:00:00 2001 From: Akshay Date: Mon, 21 Feb 2022 19:21:12 +0100 Subject: [PATCH 131/145] Issue-#898: Fix invalid json ddo example --- content/concepts/did-ddo.md | 233 +++++++++++++++++------------------- 1 file changed, 113 insertions(+), 120 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 338e2839..435b4a53 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -753,130 +753,123 @@ Example: ```json { - "@context": ["https://w3id.org/did/v1"], - "id": "did:op:ACce67694eD2848dd683c651Dab7Af823b7dd123", - "version": "4.0.0", - "chainId": 1, - "nftAddress": "0x123", - "metadata": { - "created": "2020-11-15T12:27:48Z", - "updated": "2021-05-17T21:58:02Z", - "description": "Sample description", - "name": "Sample asset", - "type": "dataset", - "author": "OPF", - "license": "https://market.oceanprotocol.com/terms" - }, - "services": [ - { - "id": "1", - "type": "access", - "files": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", - "name": "Download service", - "description": "Download service", - "datatokenAddress": "0x123", - "serviceEndpoint": "https://myprovider.com", - "timeout": 0, - "consumerParameters": [ - { - "name":"surname", - "type": "text", - "label": "Name", - "required": true, - "default": "NoName" - "description":"Please fill your name" - }, - { - "name":"age", - "type": "number", - "label": "Age", - "required": false, - "default": 0 - "description":"Please fill your age" - }] - }, - { - "id": "2", - "type": "compute", - "files": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", - "name": "Compute service", - "description": "Compute service", - "datatokenAddress": "0x124", - "serviceEndpoint": "https://myprovider.com", - "timeout": 3600, - "compute": { - "allowRawAlgorithm": false, - "allowNetworkAccess": true, - "publisherTrustedAlgorithmPublishers": ["0x234", "0x235"], - "publisherTrustedAlgorithms": [ - { - "did": "did:op:123", - "filesChecksum": "100", - "containerSectionChecksum": "200" - }, - { - "did": "did:op:124", - "filesChecksum": "110", - "containerSectionChecksum": "210" - } - ] - } - } - ], - "credentials": { - "allow": [ - { - "type": "address", - "values": ["0x123", "0x456"] - } - ], - "deny": [ - { - "type": "address", - "values": ["0x2222", "0x333"] - } - ] - }, + "@context": ["https://w3id.org/did/v1"], + "id": "did:op:ACce67694eD2848dd683c651Dab7Af823b7dd123", + "version": "4.0.0", + "chainId": 1, + "nftAddress": "0x123", + "metadata": { + "created": "2020-11-15T12:27:48Z", + "updated": "2021-05-17T21:58:02Z", + "description": "Sample description", + "name": "Sample asset", + "type": "dataset", + "author": "OPF", + "license": "https://market.oceanprotocol.com/terms" + }, + "services": [{ + "id": "1", + "type": "access", + "files": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", + "name": "Download service", + "description": "Download service", + "datatokenAddress": "0x123", + "serviceEndpoint": "https://myprovider.com", + "timeout": 0, + "consumerParameters": [{ + "name": "surname", + "type": "text", + "label": "Name", + "required": true, + "default": "NoName", + "description": "Please fill your name" + }, + { + "name": "age", + "type": "number", + "label": "Age", + "required": false, + "default": 0, + "description": "Please fill your age" + } + ] + }, + { + "id": "2", + "type": "compute", + "files": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", + "name": "Compute service", + "description": "Compute service", + "datatokenAddress": "0x124", + "serviceEndpoint": "https://myprovider.com", + "timeout": 3600, + "compute": { + "allowRawAlgorithm": false, + "allowNetworkAccess": true, + "publisherTrustedAlgorithmPublishers": ["0x234", "0x235"], + "publisherTrustedAlgorithms": [{ + "did": "did:op:123", + "filesChecksum": "100", + "containerSectionChecksum": "200" + }, + { + "did": "did:op:124", + "filesChecksum": "110", + "containerSectionChecksum": "210" + } + ] + } + } + ], + "credentials": { + "allow": [{ + "type": "address", + "values": ["0x123", "0x456"] + }], + "deny": [{ + "type": "address", + "values": ["0x2222", "0x333"] + }] + }, - "nft": { - "address": "0x123", - "name": "Ocean Protocol Asset v4", - "symbol": "OCEAN-A-v4", - "owner": "0x0000000", - "state": 0, - "created": "2000-10-31T01:30:00", - "tokenURI": "xxx" - }, + "nft": { + "address": "0x123", + "name": "Ocean Protocol Asset v4", + "symbol": "OCEAN-A-v4", + "owner": "0x0000000", + "state": 0, + "created": "2000-10-31T01:30:00", + "tokenURI": "xxx" + }, - "datatokens": [ - { - "address": "0x000000", - "name": "Datatoken 1", - "symbol": "DT-1", - "serviceId": "1" - }, - { - "address": "0x000001", - "name": "Datatoken 2", - "symbol": "DT-2", - "serviceId": "2" - } - ], + "datatokens": [{ + "address": "0x000000", + "name": "Datatoken 1", + "symbol": "DT-1", + "serviceId": "1" + }, + { + "address": "0x000001", + "name": "Datatoken 2", + "symbol": "DT-2", + "serviceId": "2" + } + ], - "event": { - "tx": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", - "block": 12831214, - "from": "0xAcca11dbeD4F863Bb3bC2336D3CE5BAC52aa1f83", - "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf", - "datetime": "2000-10-31T01:30:00" - }, + "event": { + "tx": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", + "block": 12831214, + "from": "0xAcca11dbeD4F863Bb3bC2336D3CE5BAC52aa1f83", + "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf", + "datetime": "2000-10-31T01:30:00" + }, - "purgatory": { - "state": false - }, + "purgatory": { + "state": false + }, - "stats": { - "orders": 4 - } + "stats": { + "orders": 4 + } } ``` From badeecf22bd92d27e91fd1129fe7bbf2ab886f97 Mon Sep 17 00:00:00 2001 From: Akshay Date: Wed, 23 Feb 2022 17:16:21 +0100 Subject: [PATCH 132/145] ISsue-#850: Aquarius rest api --- config.js | 4 +- .../tutorials/compute-to-data-algorithms.md | 2 +- gatsby-config.js | 2 +- gatsby-node.js | 39 +++++++++++++++ src/components/HeaderHome.module.scss | 2 +- src/styles/_variables.scss | 2 +- src/styles/box.module.scss | 38 +++++++-------- src/templates/RestApi.jsx | 48 +++++++++++++++++++ 8 files changed, 112 insertions(+), 25 deletions(-) create mode 100644 src/templates/RestApi.jsx diff --git a/config.js b/config.js index 2e006ba7..cdef81d9 100644 --- a/config.js +++ b/config.js @@ -92,11 +92,11 @@ module.exports = { swaggerComponents: [ { name: 'aquarius', - url: 'https://aquarius.oceanprotocol.com/spec' + url: 'https://v4.aquarius.oceanprotocol.com/spec' }, { name: 'provider', - url: 'https://provider.mainnet.oceanprotocol.com/spec' + url: 'https://v4.provider.mainnet.oceanprotocol.com' } ] } diff --git a/content/tutorials/compute-to-data-algorithms.md b/content/tutorials/compute-to-data-algorithms.md index 34197cf8..4d35907a 100644 --- a/content/tutorials/compute-to-data-algorithms.md +++ b/content/tutorials/compute-to-data-algorithms.md @@ -42,7 +42,7 @@ To do so, create a Dockerfile with the appropriate instructions for dependency m We also collect some [example images](https://github.com/oceanprotocol/algo_dockers) which you can also view in Dockerhub. -When publishing an algorithm through the [Ocean Market](https://market.oceanprotoco.com), these properties can be set via the publish UI. +When publishing an algorithm through the [Ocean Market](https://market.oceanprotocol.com), these properties can be set via the publish UI. ### Environment Examples diff --git a/gatsby-config.js b/gatsby-config.js index 31879ac8..11a75ea3 100755 --- a/gatsby-config.js +++ b/gatsby-config.js @@ -156,7 +156,7 @@ module.exports = { name: 'repo-read-the-docs', remote: `https://github.com/oceanprotocol/readthedocs.git`, local: 'markdowns/', - branch: 'main', + branch: 'v4', patterns: [ 'markdowns/ocean-py', 'markdowns/aquarius', diff --git a/gatsby-node.js b/gatsby-node.js index 198794b1..ff680730 100755 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -165,6 +165,27 @@ exports.createPages = ({ graphql, actions }) => { const providerList = filterMarkdownList(markdowns, 'provider') const subgraphList = filterMarkdownList(markdowns, 'ocean-subgraph') + // const aquariusRestApi = getRestApiPageFromMarkdownList( + // markdowns, + // 'aquarius' + // )[0].node + + // await createRestApiPage( + // createPage, + // aquariusRestApi, + // `/references/aquarius` + // ) + + // const providerRestApi = getRestApiPageFromMarkdownList( + // markdowns, + // 'provider' + // )[0].node + // await createRestApiPage( + // createPage, + // providerRestApi, + // `/references/provider` + // ) + await createReadTheDocsPage(createPage, 'ocean-py', oceanPyList) await createReadTheDocsPage(createPage, 'provider', providerList) await createReadTheDocsPage(createPage, 'ocean-subgraph', subgraphList) @@ -292,3 +313,21 @@ const createReadTheDocsPage = async (createPage, name, list) => { const filterMarkdownList = (markdownList, string) => { return markdownList.filter(({ node }) => node.frontmatter.app === string) } + +// const createRestApiPage = async (createPage, node, slug) => { +// const template = path.resolve('./src/templates/RestApi.jsx') +// createPage({ +// path: slug, +// component: template, +// context: { +// node, +// slug +// } +// }) +// } + +// const getRestApiPageFromMarkdownList = (markdownList, string) => { +// return markdownList.filter(({ node }) => { +// return node.frontmatter.app === string && node.frontmatter.slug === 'API.md' +// }) +// } diff --git a/src/components/HeaderHome.module.scss b/src/components/HeaderHome.module.scss index 44168b33..7fcfadfe 100644 --- a/src/components/HeaderHome.module.scss +++ b/src/components/HeaderHome.module.scss @@ -48,5 +48,5 @@ } .searchButtonContainer { - margin-top: $spacer * 0.5 ; + margin-top: $spacer * 0.5; } diff --git a/src/styles/_variables.scss b/src/styles/_variables.scss index 385a08d5..640590f8 100644 --- a/src/styles/_variables.scss +++ b/src/styles/_variables.scss @@ -68,4 +68,4 @@ $narrowWidth: 35rem; $box-shadow-color: rgba(0, 0, 0, 0.2); $border-color: #e2e2e2; -$background-content: #fff; \ No newline at end of file +$background-content: #fff; diff --git a/src/styles/box.module.scss b/src/styles/box.module.scss index 5a53046a..22ba49fb 100644 --- a/src/styles/box.module.scss +++ b/src/styles/box.module.scss @@ -1,23 +1,23 @@ @import 'variables'; .box { - display: block; - background: $background-content; - border-radius: $border-radius; - border: 1px solid $border-color; - box-shadow: 0 6px 17px 0 $box-shadow-color; - padding: $spacer * 0.5; - } - - @media (min-width: 40rem) { - .box { - padding: var($spacer); - } - } - - a.box:hover, - a.box:focus { - outline: 0; - transform: translate3d(0, -0.1rem, 0); - box-shadow: 0 10px 25px 0 $box-shadow-color; + display: block; + background: $background-content; + border-radius: $border-radius; + border: 1px solid $border-color; + box-shadow: 0 6px 17px 0 $box-shadow-color; + padding: $spacer * 0.5; +} + +@media (min-width: 40rem) { + .box { + padding: var($spacer); } +} + +a.box:hover, +a.box:focus { + outline: 0; + transform: translate3d(0, -0.1rem, 0); + box-shadow: 0 10px 25px 0 $box-shadow-color; +} diff --git a/src/templates/RestApi.jsx b/src/templates/RestApi.jsx new file mode 100644 index 00000000..6caaed56 --- /dev/null +++ b/src/templates/RestApi.jsx @@ -0,0 +1,48 @@ +import React from 'react' +import { Helmet } from 'react-helmet' +import Layout from '../components/Layout' +import Content from '../components/Content' +import HeaderSection from '../components/HeaderSection' +import Sidebar from '../components/Sidebar' +import stylesDoc from '../templates/Doc.module.scss' +import Seo from '../components/Seo' +import DocContent from '../components/DocContent' +import PropTypes from 'prop-types' + +export default function RestApiDoc({ location, pageContext }) { + const { node, slug } = pageContext + return ( + <> + + + + + + + + + +
+ +
+ +
+
+
+
+ + ) +} + +RestApiDoc.propTypes = { + location: PropTypes.object.isRequired, + pageContext: PropTypes.object.isRequired +} From 26f7f29b37b480f020f3099e0f287d9c8b60b4d7 Mon Sep 17 00:00:00 2001 From: Akshay Date: Wed, 23 Feb 2022 17:31:49 +0100 Subject: [PATCH 133/145] Generate rest-api docs from API.md --- config.js | 2 +- data/sidebars/references.yml | 4 +-- gatsby-node.js | 68 ++++++++++++++++++------------------ 3 files changed, 37 insertions(+), 37 deletions(-) diff --git a/config.js b/config.js index cdef81d9..acf20322 100644 --- a/config.js +++ b/config.js @@ -96,7 +96,7 @@ module.exports = { }, { name: 'provider', - url: 'https://v4.provider.mainnet.oceanprotocol.com' + url: 'https://provider.mainnet.oceanprotocol.com/spec' } ] } diff --git a/data/sidebars/references.yml b/data/sidebars/references.yml index f9bbbd18..2bf0b143 100644 --- a/data/sidebars/references.yml +++ b/data/sidebars/references.yml @@ -11,12 +11,12 @@ - group: Aquarius REST API items: - title: API Reference - link: /references/aquarius/ + link: /references/aquarius-rest-api/ - group: provider REST API items: - title: API Reference - link: /references/provider/ + link: /references/provider-rest-api/ - group: Provider Py Module items: diff --git a/gatsby-node.js b/gatsby-node.js index ff680730..d1865367 100755 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -165,26 +165,26 @@ exports.createPages = ({ graphql, actions }) => { const providerList = filterMarkdownList(markdowns, 'provider') const subgraphList = filterMarkdownList(markdowns, 'ocean-subgraph') - // const aquariusRestApi = getRestApiPageFromMarkdownList( - // markdowns, - // 'aquarius' - // )[0].node + const aquariusRestApi = getRestApiPageFromMarkdownList( + markdowns, + 'aquarius' + )[0].node - // await createRestApiPage( - // createPage, - // aquariusRestApi, - // `/references/aquarius` - // ) + await createRestApiPage( + createPage, + aquariusRestApi, + `/references/aquarius-rest-api` + ) - // const providerRestApi = getRestApiPageFromMarkdownList( - // markdowns, - // 'provider' - // )[0].node - // await createRestApiPage( - // createPage, - // providerRestApi, - // `/references/provider` - // ) + const providerRestApi = getRestApiPageFromMarkdownList( + markdowns, + 'provider' + )[0].node + await createRestApiPage( + createPage, + providerRestApi, + `/references/provider-rest-api` + ) await createReadTheDocsPage(createPage, 'ocean-py', oceanPyList) await createReadTheDocsPage(createPage, 'provider', providerList) @@ -314,20 +314,20 @@ const filterMarkdownList = (markdownList, string) => { return markdownList.filter(({ node }) => node.frontmatter.app === string) } -// const createRestApiPage = async (createPage, node, slug) => { -// const template = path.resolve('./src/templates/RestApi.jsx') -// createPage({ -// path: slug, -// component: template, -// context: { -// node, -// slug -// } -// }) -// } +const createRestApiPage = async (createPage, node, slug) => { + const template = path.resolve('./src/templates/RestApi.jsx') + createPage({ + path: slug, + component: template, + context: { + node, + slug + } + }) +} -// const getRestApiPageFromMarkdownList = (markdownList, string) => { -// return markdownList.filter(({ node }) => { -// return node.frontmatter.app === string && node.frontmatter.slug === 'API.md' -// }) -// } +const getRestApiPageFromMarkdownList = (markdownList, string) => { + return markdownList.filter(({ node }) => { + return node.frontmatter.app === string && node.frontmatter.slug === 'API.md' + }) +} From cee06030d87bfeaa3e029b6665e64f6a9ebd87ae Mon Sep 17 00:00:00 2001 From: Akshay Date: Wed, 23 Feb 2022 17:55:56 +0100 Subject: [PATCH 134/145] Issue-#850: Aquarius rest api --- gatsby-node.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/gatsby-node.js b/gatsby-node.js index d1865367..ac9cfeaf 100755 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -180,6 +180,7 @@ exports.createPages = ({ graphql, actions }) => { markdowns, 'provider' )[0].node + await createRestApiPage( createPage, providerRestApi, @@ -327,7 +328,8 @@ const createRestApiPage = async (createPage, node, slug) => { } const getRestApiPageFromMarkdownList = (markdownList, string) => { - return markdownList.filter(({ node }) => { - return node.frontmatter.app === string && node.frontmatter.slug === 'API.md' - }) + return markdownList.filter( + ({ node }) => + node.frontmatter.app === string && node.frontmatter.slug === 'API.md' + ) } From b4663c125a8c9d0a0ca3790b9f5f7869d6e7534a Mon Sep 17 00:00:00 2001 From: Akshay Date: Wed, 23 Feb 2022 18:32:18 +0100 Subject: [PATCH 135/145] Issue-#850: Rest api --- gatsby-node.js | 65 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 45 insertions(+), 20 deletions(-) diff --git a/gatsby-node.js b/gatsby-node.js index ac9cfeaf..71fc21dd 100755 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -103,6 +103,34 @@ exports.createPages = ({ graphql, actions }) => { } } } + + aquariusRestApi: allMarkdownRemark( + filter: { + frontmatter: { + title: { eq: "API.md" } + app: { eq: "aquarius" } + } + } + ) { + edges { + node { + id + html + htmlAst + tableOfContents + frontmatter { + title + description + slug + section + app + module + source + version + } + } + } + } } ` ).then(async (result) => { @@ -165,27 +193,24 @@ exports.createPages = ({ graphql, actions }) => { const providerList = filterMarkdownList(markdowns, 'provider') const subgraphList = filterMarkdownList(markdowns, 'ocean-subgraph') - const aquariusRestApi = getRestApiPageFromMarkdownList( - markdowns, - 'aquarius' - )[0].node - + console.log('Aquarius rest api', result.data.aquariusRestApi) + const aquariusRestApi = result.data.aquariusRestApi.edges[0].node await createRestApiPage( createPage, aquariusRestApi, `/references/aquarius-rest-api` ) - const providerRestApi = getRestApiPageFromMarkdownList( - markdowns, - 'provider' - )[0].node + // const providerRestApi = getRestApiPageFromMarkdownList( + // markdowns, + // 'provider' + // )[0].node - await createRestApiPage( - createPage, - providerRestApi, - `/references/provider-rest-api` - ) + // await createRestApiPage( + // createPage, + // providerRestApi, + // `/references/provider-rest-api` + // ) await createReadTheDocsPage(createPage, 'ocean-py', oceanPyList) await createReadTheDocsPage(createPage, 'provider', providerList) @@ -327,9 +352,9 @@ const createRestApiPage = async (createPage, node, slug) => { }) } -const getRestApiPageFromMarkdownList = (markdownList, string) => { - return markdownList.filter( - ({ node }) => - node.frontmatter.app === string && node.frontmatter.slug === 'API.md' - ) -} +// const getRestApiPageFromMarkdownList = (markdownList, string) => { +// return markdownList.filter( +// ({ node }) => +// node.frontmatter.app === string && node.frontmatter.slug === 'API.md' +// ) +// } From 028cfe52d69ce0e884854cc458b99ba0f2bb60dd Mon Sep 17 00:00:00 2001 From: Akshay Date: Wed, 23 Feb 2022 22:01:50 +0100 Subject: [PATCH 136/145] ISsue-#850: Rest api doc --- gatsby-node.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gatsby-node.js b/gatsby-node.js index 71fc21dd..f755bca6 100755 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -193,7 +193,7 @@ exports.createPages = ({ graphql, actions }) => { const providerList = filterMarkdownList(markdowns, 'provider') const subgraphList = filterMarkdownList(markdowns, 'ocean-subgraph') - console.log('Aquarius rest api', result.data.aquariusRestApi) + console.log('Aquarius rest api', markdowns) const aquariusRestApi = result.data.aquariusRestApi.edges[0].node await createRestApiPage( createPage, From 5f60b51529fc72f9de6d8851eab0c74a9a661dea Mon Sep 17 00:00:00 2001 From: Akshay Date: Wed, 23 Feb 2022 22:16:14 +0100 Subject: [PATCH 137/145] Issue-#850: Rest api doc --- gatsby-node.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/gatsby-node.js b/gatsby-node.js index f755bca6..268ddbeb 100755 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -192,8 +192,13 @@ exports.createPages = ({ graphql, actions }) => { const oceanPyList = filterMarkdownList(markdowns, 'ocean.py') const providerList = filterMarkdownList(markdowns, 'provider') const subgraphList = filterMarkdownList(markdowns, 'ocean-subgraph') - - console.log('Aquarius rest api', markdowns) + const aquariusList = filterMarkdownList(markdowns, 'aquarius') + const r = aquariusList.map(({ node }) => [ + node.frontmatter.title, + node.frontmatter.app, + node.frontmatter.source + ]) + console.log('Aquarius rest api', r) const aquariusRestApi = result.data.aquariusRestApi.edges[0].node await createRestApiPage( createPage, From fb13cef33d093ed233df60219edffc06cdb94a3e Mon Sep 17 00:00:00 2001 From: Akshay Date: Wed, 23 Feb 2022 22:27:02 +0100 Subject: [PATCH 138/145] Issue-#850: Rest api doc --- gatsby-node.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gatsby-node.js b/gatsby-node.js index 268ddbeb..201dc67c 100755 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -196,7 +196,8 @@ exports.createPages = ({ graphql, actions }) => { const r = aquariusList.map(({ node }) => [ node.frontmatter.title, node.frontmatter.app, - node.frontmatter.source + node.frontmatter.source, + node.frontmatter.version ]) console.log('Aquarius rest api', r) const aquariusRestApi = result.data.aquariusRestApi.edges[0].node From e787ff55ed93b00c42cd353aa37b43b13a761717 Mon Sep 17 00:00:00 2001 From: Akshay Date: Wed, 23 Feb 2022 22:37:39 +0100 Subject: [PATCH 139/145] ISsue-#850: Rest api --- gatsby-node.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gatsby-node.js b/gatsby-node.js index 201dc67c..55de9ed1 100755 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -192,8 +192,8 @@ exports.createPages = ({ graphql, actions }) => { const oceanPyList = filterMarkdownList(markdowns, 'ocean.py') const providerList = filterMarkdownList(markdowns, 'provider') const subgraphList = filterMarkdownList(markdowns, 'ocean-subgraph') - const aquariusList = filterMarkdownList(markdowns, 'aquarius') - const r = aquariusList.map(({ node }) => [ + // const aquariusList = filterMarkdownList(markdowns, 'aquarius') + const r = markdowns.map(({ node }) => [ node.frontmatter.title, node.frontmatter.app, node.frontmatter.source, From 14d3d98934402b0b366748c78c415585d0d16842 Mon Sep 17 00:00:00 2001 From: Trent McConaghy <5305452+trentmc@users.noreply.github.com> Date: Thu, 24 Feb 2022 10:27:33 +0100 Subject: [PATCH 140/145] 2021 -> 2022 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5e6e69a9..736ce999 100644 --- a/README.md +++ b/README.md @@ -102,7 +102,7 @@ The latest deployment of the `main` branch is automatically aliased to `docs.oce ## License ```text -Copyright ((C)) 2021 Ocean Protocol Foundation Ltd. +Copyright ((C)) 2022 Ocean Protocol Foundation Ltd. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. From 7df4bad1748c14dba9cb66e2534c1d188838f667 Mon Sep 17 00:00:00 2001 From: Akshay Date: Thu, 24 Feb 2022 20:04:19 +0100 Subject: [PATCH 141/145] Issue-#850: Aquarius rest api --- .gitignore | 3 ++- gatsby-config.js | 4 ++-- gatsby-node.js | 6 +++++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 9e696fd5..47066e69 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,5 @@ yarn-error.log .env.* markdowns/ .vscode/ -size-plugin.json \ No newline at end of file +size-plugin.json +read-the-docs/ \ No newline at end of file diff --git a/gatsby-config.js b/gatsby-config.js index 11a75ea3..25983575 100755 --- a/gatsby-config.js +++ b/gatsby-config.js @@ -155,7 +155,7 @@ module.exports = { options: { name: 'repo-read-the-docs', remote: `https://github.com/oceanprotocol/readthedocs.git`, - local: 'markdowns/', + local: 'read-the-docs', branch: 'v4', patterns: [ 'markdowns/ocean-py', @@ -167,7 +167,7 @@ module.exports = { { resolve: 'gatsby-source-filesystem', options: { - path: `${__dirname}/markdowns/markdowns`, + path: `${__dirname}/read-the-docs/markdowns`, name: 'markdowns' } }, diff --git a/gatsby-node.js b/gatsby-node.js index 55de9ed1..953eeafa 100755 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -59,7 +59,11 @@ exports.createPages = ({ graphql, actions }) => { } allRepoMarkdown: allMarkdownRemark( - filter: { fileAbsolutePath: { regex: "/markdowns/markdowns/" } } + filter: { + fileAbsolutePath: { + regex: ".cache/gatsby-source-git/read-the-docs/markdowns/" + } + } ) { edges { node { From 1fbb75b1ada000a88ec54b12ef17b98e7f316f1b Mon Sep 17 00:00:00 2001 From: Akshay Date: Thu, 24 Feb 2022 20:05:50 +0100 Subject: [PATCH 142/145] Issue-#850: Update lint rule --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 45ac2709..33f2649a 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "ssr": "npm run build && serve -s public/", "format": "prettier --ignore-path .gitignore './**/*.{css,scss,yml,js,jsx,ts,tsx,json}' --write", "lint:js": "eslint --ignore-path .gitignore --ignore-path .prettierignore --ext .js,.jsx .", - "lint:md": "markdownlint './**/*.{md,markdown}' --ignore './{node_modules,external,public,.cache,markdowns}/**/*'", + "lint:md": "markdownlint './**/*.{md,markdown}' --ignore './{node_modules,external,public,.cache,markdowns,read-the-docs}/**/*'", "lint:yml": "prettier '**/*.{yml,yaml}' --list-different", "lint": "run-p --continue-on-error lint:js lint:md lint:yml", "test": "npm run lint" @@ -88,4 +88,4 @@ "not ie <= 11", "not op_mini all" ] -} +} \ No newline at end of file From 220ea7df29bfe525e9abbb46b6d9fd290f378643 Mon Sep 17 00:00:00 2001 From: Akshay Date: Thu, 24 Feb 2022 20:15:01 +0100 Subject: [PATCH 143/145] Issue-#850: Aquarius rest api --- gatsby-config.js | 6 +++--- gatsby-node.js | 4 +--- package.json | 2 +- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/gatsby-config.js b/gatsby-config.js index 25983575..119a51f3 100755 --- a/gatsby-config.js +++ b/gatsby-config.js @@ -158,9 +158,9 @@ module.exports = { local: 'read-the-docs', branch: 'v4', patterns: [ - 'markdowns/ocean-py', - 'markdowns/aquarius', - 'markdowns/provider' + 'read-the-docs/ocean-py', + 'read-the-docs/aquarius', + 'read-the-docs/provider' ] } }, diff --git a/gatsby-node.js b/gatsby-node.js index 953eeafa..27110f7f 100755 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -60,9 +60,7 @@ exports.createPages = ({ graphql, actions }) => { allRepoMarkdown: allMarkdownRemark( filter: { - fileAbsolutePath: { - regex: ".cache/gatsby-source-git/read-the-docs/markdowns/" - } + fileAbsolutePath: { regex: "/read-the-docs/markdowns/" } } ) { edges { diff --git a/package.json b/package.json index 33f2649a..657759b7 100644 --- a/package.json +++ b/package.json @@ -88,4 +88,4 @@ "not ie <= 11", "not op_mini all" ] -} \ No newline at end of file +} From 9b4de97167ed5c4add900cbeb951192ecef888b1 Mon Sep 17 00:00:00 2001 From: Akshay Date: Thu, 24 Feb 2022 23:10:38 +0100 Subject: [PATCH 144/145] Issue-#850: Rest api --- data/sidebars/references.yml | 4 +-- gatsby-node.js | 54 ++++++++++++++++++++++++------------ 2 files changed, 38 insertions(+), 20 deletions(-) diff --git a/data/sidebars/references.yml b/data/sidebars/references.yml index 2bf0b143..f9bbbd18 100644 --- a/data/sidebars/references.yml +++ b/data/sidebars/references.yml @@ -11,12 +11,12 @@ - group: Aquarius REST API items: - title: API Reference - link: /references/aquarius-rest-api/ + link: /references/aquarius/ - group: provider REST API items: - title: API Reference - link: /references/provider-rest-api/ + link: /references/provider/ - group: Provider Py Module items: diff --git a/gatsby-node.js b/gatsby-node.js index 27110f7f..593d9ec3 100755 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -133,6 +133,34 @@ exports.createPages = ({ graphql, actions }) => { } } } + + providerRestApi: allMarkdownRemark( + filter: { + frontmatter: { + title: { eq: "API.md" } + app: { eq: "aquarius" } + } + } + ) { + edges { + node { + id + html + htmlAst + tableOfContents + frontmatter { + title + description + slug + section + app + module + source + version + } + } + } + } } ` ).then(async (result) => { @@ -194,31 +222,21 @@ exports.createPages = ({ graphql, actions }) => { const oceanPyList = filterMarkdownList(markdowns, 'ocean.py') const providerList = filterMarkdownList(markdowns, 'provider') const subgraphList = filterMarkdownList(markdowns, 'ocean-subgraph') - // const aquariusList = filterMarkdownList(markdowns, 'aquarius') - const r = markdowns.map(({ node }) => [ - node.frontmatter.title, - node.frontmatter.app, - node.frontmatter.source, - node.frontmatter.version - ]) - console.log('Aquarius rest api', r) + const aquariusRestApi = result.data.aquariusRestApi.edges[0].node await createRestApiPage( createPage, aquariusRestApi, - `/references/aquarius-rest-api` + `/references/aquarius` ) - // const providerRestApi = getRestApiPageFromMarkdownList( - // markdowns, - // 'provider' - // )[0].node + const providerRestApi = result.data.providerRestApi.edges[0].node - // await createRestApiPage( - // createPage, - // providerRestApi, - // `/references/provider-rest-api` - // ) + await createRestApiPage( + createPage, + providerRestApi, + `/references/provider` + ) await createReadTheDocsPage(createPage, 'ocean-py', oceanPyList) await createReadTheDocsPage(createPage, 'provider', providerList) From 638a3021519e375877e12a650de9c9247b86257f Mon Sep 17 00:00:00 2001 From: Akshay Date: Thu, 24 Feb 2022 23:20:19 +0100 Subject: [PATCH 145/145] Issue-#850: Rest api --- gatsby-node.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gatsby-node.js b/gatsby-node.js index 593d9ec3..3c455867 100755 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -138,7 +138,7 @@ exports.createPages = ({ graphql, actions }) => { filter: { frontmatter: { title: { eq: "API.md" } - app: { eq: "aquarius" } + app: { eq: "provider" } } } ) {