こける前に書いた
https://akibakokoubou.jp/2021/10/06/プログラマのための-system-7-system-7-revealed
 をやっとで掲載。
あと少し修正要だった。
markdown
UnhandledPromiseRejectionWarning: TypeError: Invalid DAG-PB form (links must be sorted by Name bytes)と出たのでなにかと思ったら、リンクはバイト形式でソートされていないといけないそうだ。
https://github.com/ipld/specs/blob/master/block-layer/codecs/dag-pb.md
markdown
elements must be sorted in ascending order by their Name values, which are compared by bytes rather than as stringstypescript
//  import追加と置き換え
import { CID } from 'multiformats/cid'
import {PBLink} from "@ipld/dag-pb";
import * as dagPB from '@ipld/dag-pb'
//  記事ノードを作る
const imgDirNode = dagPB.createNode(new Uint8Array(), imgList)
const imdDirCid = await this.client.dag.put(imgDirNode)
const imgDirLink = dagPB.createLink("images", 0, imdDirCid)
const indexNode = dagPB.createNode(new TextEncoder().encode(mdBody))
const indexCid = await this.client.dag.put(indexNode)
const indexLink = dagPB.createLink("index.md", 0, indexCid)
const list = [indexLink, imgDirLink]
const postNode = dagPB.createNode(new TextEncoder().encode(slug), list);
// 既存の記事リンクを取ってくる
  const originalChildren = await this.client.dag.get(CID.parse(rootCid));
  const nextChildList: PBLink[] = originalChildren.value.Links
// 記事リンクを追加する
  const addLink = dagPB.createLink(addName, 0, CID.parse(addCid));
  nextChildList.push(addLink)
  const sorted = nextChildList.sort((a, b) => {
    if (a.Name && b.Name) {
      return this.compareBytes(enc.encode(a.Name), enc.encode(b.Name))
    }
    return 0;
  })
// 新しいrootを追加する
  const root = await this.client.dag.put({Data: new Uint8Array(), Links: sorted}, {
    // @ts-ignore
    "store-codec": 'dag-pb',
    "input-codec": 'dag-pb',
    format: 'dag-pb',
    pin: true
  });
// 単純バイトソート
compareBytes(a: Uint8Array, b: Uint8Array) {
  const len = Math.max(a.length,b.length)
  for (let i = 0; i < len; i++) {
    const k = a[i] - b[i]
    if (k != 0) {
      return k
    }
  }
  return a.length - b.length
}