//tips
smartcontractの片鱗に触れてしまったため、3年程度はunityに戻れないかもしれない。
//基本情報理解
関係データベースにおいて、外部キーとは、他の表に関連付けられた属性のことで、参照制約と呼ばれる特徴があり、参照する側の属性は参照される側の属性の中に存在する値である必要がある。参照される側は主キーである。
候補キーとは、行を一意に特定できる属性または属性の組み合わせのうち最小のものをいう。
UMLに描かれる*は、1対*(0以上)の関係性で描かれ、*側の方が親データとして参照される側となることが多い。
SQLでは和集合の計算をUNIONで行うが、重複した値を融合させずそのまま表に加えたい場合はUNION ALLを使用する。
データベースのトランザクションが持つ耐久性は、一度確定したトランザクションは停電や故障などのシステム障害が発生してもその状態を保つことをいう。
//pitch deck
Canvasは紙のデジタル化プラットフォームで、下記のptichで$9 millionまで到達している。要因としては事業内容の理解のしやすさと必要性が一目瞭然だったこと。そして、どの問題をどのように解決するかがアプリのデモページで示されており、成長性についても運用数字をグラフ化して記載されていた。まさに、プレゼンしなくても必要性がわかるシンプルだが素晴らしいpitch。
//solidity
Solidity復習の続き。構造体から入っていく。
pragma solidity 0.8.4;
contract MyContract{
struct Kitty{
//構造体にすることで配列にしやすくなる
string name;
address owner;
uint256 id;
}
//先の構造体を型として使用した配列
Kitty[] kitties;
//kittyのownerを配列を開かなくてもわかるように
//uint256[]とするのは所持者が複数匹保有していることへのたいsy保有していることへの対処
mapping(address=>uint256[]) ownerToKitty;
function addKitty(string memory _name,address _owner) public{
//配列にkittyを追加していく
//remixで複数の引数の場合は""でそれぞれ囲む
uint id=kitties.length;
Kitty memory newKitty=Kitty(_name,_owner,id);
kitties.push(newKitty);
//ownerの配列に新たなKittyをpush
ownerToKitty[_owner].push(id);
}
//ownerアドレスから猫の名前を返す
function getKitty(address _owner)public view returns(string[] memory){
//mappingに記録しているownerの猫の所持数をまずは確認
uint numOfKitties = ownerToKitty[_owner].length;
//猫の名前を入れる箱を作成
//solidityではstring[6]のような形にはできないよう
//さらにmemory対応されているものは、長さが固定されているたm長さが固定されているためpushが使えない
string[] memory names= new string[](numOfKitties);
for(uint i=0;i<numOfKitties;i++){
uint id=ownerToKitty[_owner][i];
names[i]=(kitties[id].name);
}
return names;
}
}
Solidityのデータはstorageまたはmemoryに格納され、storageはブロックチェーン上にデータが保存されるもので書き換えコストが高く、関数外で使用され、memoryは基本関数内で使用し、関数実行時にのみデータが使われ、ブロックチェーンに保存されない。
なのでpureはstorageデータを使わないという宣言で、viewはstorageデータを読むよという宣言となるよう。viewはgas代が0円とのこと。
pragma solidity 0.8.4;
contract MyContract1{
uint num=123;//storage
string public message ="hi";//storage
//publicを加えると自動的にgetter関数が使われremixのデプロイ後に見れる
function setString(string memory input)public {
string memory newMessage=input;
message=newMessage;
}
function setNumber(uint input)public{
uint newNumber=input;//memoryだが記載しなくても良い
num=newNumber;
}
}
contract MyContract2{
struct Kitty{
string name;
address owner;
}
Kitty[] public kitties;
function newKitty(string memory _name) public {
Kitty memory kitty =Kitty(_name,msg.sender);
kitties.push(kitty);
}
function sGetKitty(uint _id)public returns(string memory){
//storageのkitties[_id]という参照元のショートカットを保有する。ポインタの保有。
//ショートカットの名前を変えるイメージ
Kitty storage kitty =kitties[_id];
return kitty.name;
}
function mGetKitty(uint _id)public returns(string memory){
//memoryはkitties[_id]の値をコピーアンドペースト
Kitty memory kitty =kitties[_id];
return kitty.name;
}
function sChangeKitty(uint _id,string memory _name)public{
Kitty storage kitty =kitties[_id];
//ポインタの設定とポインタの先のものを変更
//ショートカットの先にある中身を変える
kitty.name= _name;
}
}
前進している感が出てきた。