//tips
//基本情報理解
認証局が発行するCRL cerficate revocation listは認証局が発行したデジタル証明書が有効期限よりも前に失効したことを示すシリアル番号のリストで、認証局が電子署名を行った上で提供する。
PCからサーバに対し、IPv6を利用した通信を行う際にはネットワーク層の暗号化にIPsecが用いられる。
IPsec/security architecture for internet protocolのことで、IPパケット単位で暗号化を行い、データの改竄防止や機密性を確保する仕組み。
OCSP online certificate status protocolは認証局が発行したssl/tls証明書が有効かどうかを確認するプロトコル。
デジタル証明書のシリアル番号、証明書発行者の識別名DNのハッシュ値などをOCSPレスポンダに送信し、その応答でデジタル証明書の有効性を確認する。
//pitch deck
Coinbaseの2012年のpitchを見つけた。 これで$600Kの出資を受けたのを手始めに、そこから$538Mまで拡大していったとのこと。
11枚のスライドで、図表を多様し、内容も簡潔でわかりやすい。ツールを使いやすくした結果のユーザの成長率という形で魅力を表している。ビットコインという新しい技術としての魅力も相乗効果で載っていると思う。
//smartcontract
続Bank contract。modifierで関数を整理するところを確認。
pragma solidity 0.8.4;
contract SimpleBank{
//アドレスからsimplebankという財布に入れるというイメージ
//payableを追加し入出金可能にする
function deposit() public payable{
}
function withdraw()public{
//payable(msg.sender)で外部に送金できるアドレスにできる
//送金額はaddress(this).balanceとなり、address(this)でこのコントラクトのアドレスを記載できる
//msg.senderに対して、このコントラクトの全ての残高を送るというもの
payable(msg.sender).transfer(address(this).balance);
//このままでは財布に他の人のお金がが入っていた場合も引き出した人が総取りしてしま引き出した人が総取りしてしまう
//たまたtransferから最近call関数に送金の役目がシフトしつつある
}
}
contract Bank{
mapping(address=>uint)balance;
address owner;
modifier onlyOwner {
//modifier修飾子を関数につけると、修飾された関数を実行する前に、modifierの処理を予め実行させることができる
//関数の見た目を整理し、美しくするもの
require(msg.sender == owner,"you are not the owner");
//_; では、先にmodifierの内容が実行され、処理部分が後の_にはいることを表す。必須。
_;
}
//複数の関数に使われているrequire処理を一つにまとめて導入する
modifier balanceCheck(uint _amount){
require(balance[msg.sender]>=_amount,"Insufficient balance");
_;
}
constructor (){
//ownerをデプロイ実行者に設定
owner=msg.sender;
}
function getBalance()public view returns(uint){
return balance[msg.sender];
}
function deposit() public payable onlyOwner{
//ownerのみ預金できるようにする
//require(msg.sender == owner,"you are not the owner")
//これはmodifierにて代替できる
balance[msg.sender]+=msg.value;
}
function withdraw(uint _amount) public balanceCheck(_amount){
//require(条件,エラーの場合の処理)でif文のような制約を作れる
//条件が達成されていなかったらエラー文を表示できる
//require(balance[msg.sender]>=_amount,"Insufficient balance");
//もしエラーが表示されたらそこで処理が終了し、下記の残りのgas代も返却される
//引かれる前のバランスを変数に保存
uint beforeWithdraw = balance[msg.sender];
balance[msg.sender]-=_amount;
payable(msg.sender).transfer(_amount);
uint afterWithdraw = balance[msg.sender];
//assert文はプログラムが思い通りに動いているか
//確認するために使う。どちらかというと開発用
assert(afterWithdraw == beforeWithdraw - _amount);
//もし()内と異なるじ内容が検出されたら前の処理はなかったことになる
}
//コントラクト財布内での送金/財布内の別の所持者に送金
function transfer(address _to,uint _amount)public balanceCheck(_amount){
//require(balance[msg.sender]>=_amount,"Insufficient balance");
//自身には贈らないように制約を付加
require(msg.sender != _to,"Invalid recipiant");
balance[msg.sender]-= _amount;
balance[_to]+=_amount;
}
}
上記をもとに、機能をコントラクトに分割し、分割したままでは元のコードにエラーが出るので、コントラクト間で機能を継承できるようにする。
pragma solidity 0.8.4;
import "./ownable.sol";
//ファイル名を記載
//別ファイルのものを継承できる
contract Bank is Ownable{
//is ...で、...の機能を記載コントラクトに継承することができる
//Ownableが親でBankが子となる
mapping(address=>uint)balance;
//publicは誰でもアクセスできる
function getBalance()public view returns(uint){
return balance[msg.sender];
}
function deposit() public payable onlyOwner{
balance[msg.sender]+= msg.value;
}
function withdraw(uint _amount) public {
uint beforeWithdraw = balance[msg.sender];
balance[msg.sender]-=_amount;
payable(msg.sender).transfer(_amount);
uint afterWithdraw = balance[msg.sender];
assert(afterWithdraw == beforeWithdraw - _amount);
}
//コントラクト財布内での送金/財布内の別の所持者に送金
function transfer(address _to,uint _amount)public {
require(balance[msg.sender]>=_amount,"Insufficient balance");
//自身には贈らないように制約を付加
require(msg.sender != _to,"Invalid recipiant");
_transfer(msg.sender,_to,_amount);
}
//privateはコントラクと内でアクセスできる
function _transfer(address _from,address _to,uint _amount)private{
balance[_from]-= _amount;
balance[_to]+=_amount;
}
}
継承親は下記とした。
pragma solidity 0.8.4;
contract Ownable{
//onlyOwnerの機能を持ったコントラクト
address owner;
modifier onlyOwner {
require(msg.sender == owner,"you are not the owner");
_;
}
constructor (){
owner=msg.sender;
}
}